diff options
author | Ulrich Drepper <drepper@redhat.com> | 2008-10-06 16:29:06 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2008-10-06 16:29:06 +0000 |
commit | e39e69467ee7790fe0f8188d81184c1830c80c0b (patch) | |
tree | 815866dc57977b308f515a50b92e4a65b6d72460 /resolv | |
parent | 6ba25fcbf549c299050c24a5bf515413171e0a86 (diff) | |
download | glibc-e39e69467ee7790fe0f8188d81184c1830c80c0b.tar glibc-e39e69467ee7790fe0f8188d81184c1830c80c0b.tar.gz glibc-e39e69467ee7790fe0f8188d81184c1830c80c0b.tar.bz2 glibc-e39e69467ee7790fe0f8188d81184c1830c80c0b.zip |
(send_vc): Fix use of unaligned address. Properly handle partial reads.
Diffstat (limited to 'resolv')
-rw-r--r-- | resolv/res_send.c | 14 |
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 |