cvs: php-src(PHP_5_1) / NEWS /ext/standard dns.c

From: Date: Sun, 23 Oct 2005 18:34:26 +0000
Subject: cvs: php-src(PHP_5_1) / NEWS /ext/standard dns.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-34743@lists.php.net to get a copy of this message
tony2001 Sun Oct 23 14:34:26 2005 EDT Modified files: (Branch: PHP_5_1) /php-src NEWS /php-src/ext/standard dns.c Log: MFH: fix #34938 (dns_get_record() doesn't resolve long hostnames and leaks) http://cvs.php.net/diff.php/php-src/NEWS?r1=1.2027.2.154&r2=1.2027.2.155&ty=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.154 php-src/NEWS:1.2027.2.155 --- php-src/NEWS:1.2027.2.154 Sat Oct 22 13:38:35 2005 +++ php-src/NEWS Sun Oct 23 14:34:25 2005 @@ -3,6 +3,8 @@ ?? Oct 2005, PHP 5.1 Release Candidate 4 - Fixed fgetcsv() and fputcsv() inconsistency. (Dmitry) - Fixed bug #34957 (PHP doesn't respect ACLs for access checks). (Wez) +- Fixed bug #34938 (dns_get_record() doesn't resolve long hostnames and + leaks). (Tony) - Fixed bug #34934 (offsetExists is not called from array_key_exists). (Dmitry) - Fixed bug #34905 (Digest authentication does not work with Apache 1). (Ilia) - Fixed bug #34902 (mysqli::character_set_name() - undefined method). (Tony) http://cvs.php.net/diff.php/php-src/ext/standard/dns.c?r1=1.70.2.2&r2=1.70.2.3&ty=u Index: php-src/ext/standard/dns.c diff -u php-src/ext/standard/dns.c:1.70.2.2 php-src/ext/standard/dns.c:1.70.2.3 --- php-src/ext/standard/dns.c:1.70.2.2 Sun Oct 23 11:29:09 2005 +++ php-src/ext/standard/dns.c Sun Oct 23 14:34:26 2005 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dns.c,v 1.70.2.2 2005/10/23 15:29:09 iliaa Exp $ */ +/* $Id: dns.c,v 1.70.2.3 2005/10/23 18:34:26 tony2001 Exp $ */ /* {{{ includes */ #include "php.h" @@ -349,9 +349,8 @@ #define QFIXEDSZ 4 /* fixed data in query <arpa/nameser.h> */ #endif /* QFIXEDSZ */ -#ifndef MAXHOSTNAMELEN +#undef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 1024 -#endif /* MAXHOSTNAMELEN */ #ifndef MAXRESOURCERECORDS #define MAXRESOURCERECORDS 64 @@ -362,10 +361,25 @@ u_char qb2[65536]; } querybuf; +/* just a hack to free resources allocated by glibc in __res_nsend() + * See also: + * res_thread_freeres() in glibc/resolv/res_init.c + * __libc_res_nsend() in resolv/res_send.c + * */ +static void _php_dns_free_res(struct __res_state res) { /* {{{ */ + int ns; + for (ns = 0; ns < MAXNS; ns++) { + if (res._u._ext.nsaddrs[ns] != NULL) { + free (res._u._ext.nsaddrs[ns]); + res._u._ext.nsaddrs[ns] = NULL; + } + } +} /* }}} */ + /* {{{ php_parserr */ static u_char *php_parserr(u_char *cp, querybuf *answer, int type_to_fetch, int store, zval **subarray) { - u_short type, class, dlen; + u_short type, dlen; u_long ttl; long n, i; u_short s; @@ -375,14 +389,13 @@ *subarray = NULL; - n = dn_expand(answer->qb2, answer->qb2+65536, cp, name, (sizeof(name)) - 2); + n = dn_expand(answer->qb2, answer->qb2+65536, cp, name, sizeof(name) - 2); if (n < 0) { return NULL; } cp += n; GETSHORT(type, cp); - GETSHORT(class, cp); GETLONG(ttl, cp); GETSHORT(dlen, cp); if (type_to_fetch != T_ANY && type != type_to_fetch) { @@ -642,7 +655,7 @@ HEADER *hp; querybuf buf, answer; u_char *cp = NULL, *end = NULL; - long n, qd, an, ns = 0, ar = 0; + int n, qd, an, ns = 0, ar = 0; int type, first_query = 1, store_results = 1; switch (ZEND_NUM_ARGS()) { @@ -739,6 +752,7 @@ break; } if (type_to_fetch) { + memset(&res, 0, sizeof(res)); res_ninit(&res); res.retrans = 5; res.options &= ~RES_DEFNAMES; @@ -748,6 +762,7 @@ php_error_docref(NULL TSRMLS_CC, E_WARNING, "res_nmkquery() failed"); zval_dtor(return_value); res_nclose(&res); + _php_dns_free_res(res); RETURN_FALSE; } n = res_nsend(&res, buf.qb2, n, answer.qb2, sizeof answer); @@ -755,6 +770,7 @@ php_error_docref(NULL TSRMLS_CC, E_WARNING, "res_nsend() failed"); zval_dtor(return_value); res_nclose(&res); + _php_dns_free_res(res); RETURN_FALSE; } @@ -773,6 +789,7 @@ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to parse DNS data received"); zval_dtor(return_value); res_nclose(&res); + _php_dns_free_res(res); RETURN_FALSE; } cp += n + QFIXEDSZ; @@ -788,6 +805,7 @@ } } res_nclose(&res); + _php_dns_free_res(res); } }

« previous php.cvs (#34743) next »