[BZ #2499]
authorUlrich Drepper <drepper@redhat.com>
Sat, 6 May 2006 07:16:35 +0000 (07:16 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 6 May 2006 07:16:35 +0000 (07:16 +0000)
2006-05-06  Ulrich Drepper  <drepper@redhat.com>
[BZ #2499]
* resolv/res_query.c (__libc_res_nquery): If answerp != NULL,
__libc_res_nsend might reallocate the buffer for the answer.  In
this case we have to reload the HP pointer.

ChangeLog
resolv/res_query.c

index 067d4fe..3d8a63f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-05-06  Ulrich Drepper  <drepper@redhat.com>
+
+       [BZ #2499]
+       * resolv/res_query.c (__libc_res_nquery): If answerp != NULL,
+       __libc_res_nsend might reallocate the buffer for the answer.  In
+       this case we have to reload the HP pointer.
+
 2006-05-05  Ulrich Drepper  <drepper@redhat.com>
 
        * stdio-common/vfscanf.c (memory_error): Remove definition.  Add
index 0feba66..85bad97 100644 (file)
@@ -69,6 +69,7 @@ static const char sccsid[] = "@(#)res_query.c 8.1 (Berkeley) 6/4/93";
 static const char rcsid[] = "$BINDId: res_query.c,v 8.20 2000/02/29 05:39:12 vixie Exp $";
 #endif /* LIBC_SCCS and not lint */
 
+#include <assert.h>
 #include <sys/types.h>
 #include <sys/param.h>
 #include <netinet/in.h>
@@ -151,6 +152,7 @@ __libc_res_nquery(res_state statp,
                        free (buf);
                return (n);
        }
+       assert (answerp == NULL || (void *) *answerp == (void *) answer);
        n = __libc_res_nsend(statp, buf, n, answer, anslen, answerp);
        if (use_malloc)
                free (buf);
@@ -163,6 +165,10 @@ __libc_res_nquery(res_state statp,
                return (n);
        }
 
+       if (answerp != NULL)
+         /* __libc_res_nsend might have reallocated the buffer.  */
+         hp = (HEADER *) *answerp;
+
        if (hp->rcode != NOERROR || ntohs(hp->ancount) == 0) {
 #ifdef DEBUG
                if (statp->options & RES_DEBUG)