cvs: php-src(PHP_5_1) / NEWS /ext/standard dns.c
| From: | Antony Dovgal | 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);
}
}