about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2008-10-06 16:29:06 +0000
committerUlrich Drepper <drepper@redhat.com>2008-10-06 16:29:06 +0000
commite39e69467ee7790fe0f8188d81184c1830c80c0b (patch)
tree815866dc57977b308f515a50b92e4a65b6d72460
parent6ba25fcbf549c299050c24a5bf515413171e0a86 (diff)
downloadglibc-e39e69467ee7790fe0f8188d81184c1830c80c0b.tar.gz
glibc-e39e69467ee7790fe0f8188d81184c1830c80c0b.tar.xz
glibc-e39e69467ee7790fe0f8188d81184c1830c80c0b.zip
(send_vc): Fix use of unaligned address. Properly handle partial reads.
-rw-r--r--resolv/res_send.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/resolv/res_send.c b/resolv/res_send.c
index 3130f64281..59cdc214e2 100644
--- a/resolv/res_send.c
+++ b/resolv/res_send.c
@@ -734,11 +734,11 @@ send_vc(res_state statp,
 	 */
 	int recvresp1 = 0;
 	int recvresp2 = buf2 == NULL;
- read_len:
-	cp = ans;
 	uint16_t rlen16;
+ read_len:
+	cp = (u_char *)&rlen16;
 	len = sizeof(rlen16);
-	while ((n = TEMP_FAILURE_RETRY (read(statp->_vcsock, &rlen16,
+	while ((n = TEMP_FAILURE_RETRY (read(statp->_vcsock, cp,
 					     (int)len))) > 0) {
 		cp += n;
 		if ((len -= n) <= 0)
@@ -778,8 +778,16 @@ send_vc(res_state statp,
 			/* No buffer allocated for the first
 			   reply.  We can try to use the rest
 			   of the user-provided buffer.  */
+#ifdef _STRING_ARCH_unaligned
 			*anssizp2 = orig_anssizp - resplen;
 			*ansp2 = *ansp + resplen;
+#else
+			int aligned_resplen
+			  = ((resplen + __alignof__ (HEADER) - 1)
+			     & (__alignof__ (HEADER) - 1));
+			*anssizp2 = orig_anssizp - aligned_resplen;
+			*ansp2 = *ansp + aligned_resplen;
+#endif
 		} else {
 			/* The first reply did not fit into the
 			   user-provided buffer.  Maybe the second