Hi Ilia 2009/4/29 Ilia Alshanetsky <il...@php.net>: > iliaa Tue Apr 28 22:31:26 2009 UTC > > Modified files: (Branch: PHP_5_2) > /php-src/ext/standard basic_functions.c > /php-src/ext/standard/tests/network ip2long_variation1.phpt > /php-src NEWS > Log: > > MFB: Fixed bug #47365 (ip2long() may allow some invalid values on certain > 64bit systems) > > > http://cvs.php.net/viewvc.cgi/php-src/ext/standard/basic_functions.c?r1=1.725.2.31.2.80&r2=1.725.2.31.2.81&diff_format=u > Index: php-src/ext/standard/basic_functions.c > diff -u php-src/ext/standard/basic_functions.c:1.725.2.31.2.80 > php-src/ext/standard/basic_functions.c:1.725.2.31.2.81 > --- php-src/ext/standard/basic_functions.c:1.725.2.31.2.80 Wed Dec 31 > 11:17:44 2008 > +++ php-src/ext/standard/basic_functions.c Tue Apr 28 22:31:25 2009 > @@ -17,7 +17,7 @@ > +----------------------------------------------------------------------+ > */ > > -/* $Id: basic_functions.c,v 1.725.2.31.2.80 2008/12/31 11:17:44 sebastian > Exp $ */ > +/* $Id: basic_functions.c,v 1.725.2.31.2.81 2009/04/28 22:31:25 iliaa Exp $ > */ > > #include "php.h" > #include "php_streams.h" > @@ -4329,38 +4329,45 @@ > /* }}} */ > #endif /* HAVE_INET_PTON */ > > - > - > /* {{{ proto int ip2long(string ip_address) > Converts a string containing an (IPv4) Internet Protocol dotted address > into a proper address */ > PHP_FUNCTION(ip2long) > { > - zval **str; > + char *addr; > + int addr_len; > +#ifdef HAVE_INET_PTON > + struct in_addr ip; > +#else > unsigned long int ip; > +#endif > > - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == > FAILURE) { > - WRONG_PARAM_COUNT; > + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &addr, > &addr_len) == FAILURE) { > + return; > }
This breaks some of the tests because they rely on the old parameter parsing API in 5_2 (Thanks Antony): ext/standard/tests/network/ip2long_error.phpt ext/standard/tests/network/ip2long_variation1.phpt > > - convert_to_string_ex(str); > - > - if (Z_STRLEN_PP(str) == 0 || (ip = inet_addr(Z_STRVAL_PP(str))) == > INADDR_NONE) { > - /* the only special case when we should return -1 ourselves, > +#ifdef HAVE_INET_PTON > + if (addr_len == 0 || inet_pton(AF_INET, addr, &ip) != 1) { > + RETURN_FALSE; > + } > + RETURN_LONG(ntohl(ip.s_addr)); > +#else > + if (addr_len == 0 || (ip = inet_addr(addr)) == INADDR_NONE) { > + /* The only special case when we should return -1 ourselves, > * because inet_addr() considers it wrong. We return > 0xFFFFFFFF and > - * not -1 or ~0 because of 32/64bit issues. > - */ > - if (Z_STRLEN_PP(str) == sizeof("255.255.255.255") - 1 && > - !memcmp(Z_STRVAL_PP(str), "255.255.255.255", > sizeof("255.255.255.255") - 1)) { > + * not -1 or ~0 because of 32/64bit issues. */ > + if (addr_len == sizeof("255.255.255.255") - 1 && > + !memcmp(addr, "255.255.255.255", > sizeof("255.255.255.255") - 1) > + ) { > RETURN_LONG(0xFFFFFFFF); > } > - > RETURN_FALSE; > } > - > RETURN_LONG(ntohl(ip)); > +#endif > } > /* }}} */ > > + -- Kalle Sommer Nielsen ka...@php.net -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php