about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2008-05-19 17:34:14 +0000
committerUlrich Drepper <drepper@redhat.com>2008-05-19 17:34:14 +0000
commit5908f779e76e24827c0c6f38f2b7a0f857333bcb (patch)
treefe2afd890ce08267486077d80eee52935e854c3d
parent528741cb6c7218e7f2f764fa10aa7e67699eadaa (diff)
downloadglibc-5908f779e76e24827c0c6f38f2b7a0f857333bcb.tar.gz
glibc-5908f779e76e24827c0c6f38f2b7a0f857333bcb.tar.xz
glibc-5908f779e76e24827c0c6f38f2b7a0f857333bcb.zip
* resolv/res_query.c (__libc_res_nquery): In case one of two
	answer was too short don't try to read that answer's header.

	* resolv/res_send.c (send_dg): In case of timeout and there are
	two queries and one has been answered, return value indicating
	success.
-rw-r--r--ChangeLog9
-rw-r--r--resolv/res_query.c15
-rw-r--r--resolv/res_send.c7
3 files changed, 31 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index da8b1b4a22..f054e8a46c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-05-19  Ulrich Drepper  <drepper@redhat.com>
+
+	* resolv/res_query.c (__libc_res_nquery): In case one of two
+	answer was too short don't try to read that answer's header.
+
+	* resolv/res_send.c (send_dg): In case of timeout and there are
+	two queries and one has been answered, return value indicating
+	success.
+
 2008-05-18  Ulrich Drepper  <drepper@redhat.com>
 
 	* nscd/cache.c (cache_add): Take additional parameter specifying
diff --git a/resolv/res_query.c b/resolv/res_query.c
index a8e8d7b739..3d2f2fe3a9 100644
--- a/resolv/res_query.c
+++ b/resolv/res_query.c
@@ -224,6 +224,21 @@ __libc_res_nquery(res_state statp,
 	   tests of HP2.  */
 	HEADER *hp2 = answerp2 ? (HEADER *) *answerp2 : hp;
 
+	if (n < sizeof (HEADER) && nanswerp2 != NULL
+	    && *nanswerp2 > sizeof (HEADER))
+	  {
+	    /* Special case of partial answer.  */
+	    assert (hp != hp2);
+	    hp = hp2;
+	  }
+	else if (nanswerp2 != NULL
+		 && *nanswerp2 < sizeof (HEADER) && n > sizeof (HEADER))
+	  {
+	    /* Special case of partial answer.  */
+	    assert (hp != hp2);
+	    hp2 = hp;
+	  }
+
 	if ((hp->rcode != NOERROR || ntohs(hp->ancount) == 0)
 	    && (hp2->rcode != NOERROR || ntohs(hp2->ancount) == 0)) {
 #ifdef DEBUG
diff --git a/resolv/res_send.c b/resolv/res_send.c
index b3dbd702a2..e67ef1c676 100644
--- a/resolv/res_send.c
+++ b/resolv/res_send.c
@@ -975,6 +975,8 @@ send_dg(res_state statp,
 	int recvresp2 = buf2 == NULL;
 	pfd[0].fd = EXT(statp).nssocks[ns];
 	pfd[0].events = POLLOUT;
+	if (resplen2 != NULL)
+	  *resplen2 = 0;
  wait:
 	if (need_recompute) {
 	recompute_resend:
@@ -1001,6 +1003,11 @@ send_dg(res_state statp,
 	if (n == 0) {
 		Dprint(statp->options & RES_DEBUG, (stdout,
 						    ";; timeout sending\n"));
+		if (recvresp1)
+		  return resplen;
+		if (buf2 != NULL && recvresp2)
+		  return 1;
+
 		*gotsomewhere = 1;
 		return (0);
 	}