php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #38197 ip2long() not accepting hex 0xffffffff
Submitted: 2006-07-24 19:08 UTC Modified: 2006-07-25 13:16 UTC
From: gk at gknw dot de Assigned:
Status: Not a bug Package: Network related
PHP Version: 5.1.4 OS: all
Private report: No CVE-ID: None
 [2006-07-24 19:08 UTC] gk at gknw dot de
Description:
------------
Although ip2long() works fine with 255.255.255.255 it fails when 0xffffffff is passed in.
Other hex values work fine.
Seems this was introduced with PHP 5.x - PHP 4.x is not affected; there it works as I expect.


Reproduce code:
---------------
Nonworking sample on PHP 5.x:
http://www.gknw.net/test/php_issues/t_ip2long.php
Working same sample on PHP 4.x:
http://www.gknw.de/test/php_issues/t_ip2long.php
Script for download:
http://www.gknw.net/test/php_issues/t_ip2long_php.txt



Expected result:
----------------
Same result on PHP5 as with PHP4.



Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2006-07-25 07:04 UTC] tony2001@php.net
0xffffffff is not an IP address and the underlying inet_addr() function doesn't think it's valid too.
 [2006-07-25 12:46 UTC] gk at gknw dot de
I agree that 0xffffffff is not an IP address and the underlying inet_addr() function doesn't think it's valid - but it doesnt think it's valid with 255.255.255.255 either, and to capture that there was code introduced with PHP 5.x.
With only _two_ additional lines of code we could again get the same behaviour as with PHP 4.x:
=====================================================
--- basic_functions.c.orig	Sun Aug 21 20:36:34 2005
+++ basic_functions.c	Tue Jul 25 11:15:32 2006
@@ -1265,7 +1265,9 @@
 		/* the only special case when we should return -1 ourselves,
 		 * because inet_addr() considers it wrong.
 		 */
-		if (!memcmp(Z_STRVAL_PP(str), "255.255.255.255", Z_STRLEN_PP(str))) {
+		if (!memcmp(Z_STRVAL_PP(str), "255.255.255.255", Z_STRLEN_PP(str)) ||
+				!memcmp(Z_STRVAL_PP(str), "0xffffffff", Z_STRLEN_PP(str)) ||
+				!memcmp(Z_STRVAL_PP(str), "0xFFFFFFFF", Z_STRLEN_PP(str)) ) {
 			RETURN_LONG(-1);
 		}
		
=====================================================
here's a PHP 5.0.5 running with the patch:
http://194.242.35.162/tstphp/t_ip2long.php
and you can see now again same behaviour as with PHP 4.x:
http://www.gknw.de/test/php_issues/t_ip2long.php

patch for download here:
http://www.gknw.net/test/php_issues/basic_functions.c.diff

Guenter.
 [2006-07-25 12:55 UTC] tony2001@php.net
Your patch won't work as 0xffffffff is not a string, but float.
Also, I don't really see why do you need the function in this case - just (int)0xffffffff is enough.
And I don't think we're going to support invalid IP addresses in a function which is supposed to accept IP addresses.
 [2006-07-25 13:16 UTC] gk at gknw dot de
sorry, but I cant follow: if I pass in a string "0xffffffff" what should convert it to float? perhaps Z_STRVAL_PP()? Ok, if so then please forgive - I couldnt find Z_STRVAL_PP() documented.
The reason why I need this function is that a couple of routers and switches represent IPs mixed bewteen the hex and the dotted format - and in the past 10 years I used the nice feature that inet_addr() can deal with both dotted and hex formated IPs from C, Perl, and PHP.
Also it wouldnt be support for 'invalid IP addresses' but just for the _one_ special case which fails with dotted format too.
 
PHP Copyright © 2001-2019 The PHP Group
All rights reserved.
Last updated: Fri Aug 23 10:01:26 2019 UTC