diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | include/arpa/nameser.h | 20 | ||||
-rw-r--r-- | resolv/res_mkquery.c | 48 | ||||
-rw-r--r-- | resolv/res_send.c | 2 |
4 files changed, 47 insertions, 30 deletions
@@ -1,5 +1,12 @@ 2006-05-06 Ulrich Drepper <drepper@redhat.com> + * include/arpa/nameser.h: Also optimize NS_PUT16 and NS_PUT32. + * resolv/res_mkquery.c: Use NS_PUT16 and NS_PUT32 instead of __putshort + and __putlong respectively. Correct buffer overflow check for + NS_NOTIFY_OP. + + * resolv/res_send.c (send_vc): Use ns_put16 instead of putshort. + * resolv/res_send.c (res_queriesmatch): Fix typo in comment. (send_dg): Rewrite error handling to be more compact and avoid double recomputation of timeouts. Pass MSG_NOSIGNAL to send. diff --git a/include/arpa/nameser.h b/include/arpa/nameser.h index 09bd504..449f5b4 100644 --- a/include/arpa/nameser.h +++ b/include/arpa/nameser.h @@ -18,10 +18,26 @@ } while (0) # undef NS_GET32 -# define NS_GET32(s, cp) \ +# define NS_GET32(l, cp) \ do { \ uint32_t *t_cp = (uint32_t *) (cp); \ - (s) = ntohl (*t_cp); \ + (l) = ntohl (*t_cp); \ + (cp) += NS_INT32SZ; \ + } while (0) + +# undef NS_PUT16 +# define NS_PUT16(s, cp) \ + do { \ + uint16_t *t_cp = (uint16_t *) (cp); \ + *t_cp = htons (s); \ + (cp) += NS_INT16SZ; \ + } while (0) + +# undef NS_PUT32 +# define NS_PUT32(l, cp) \ + do { \ + uint32_t *t_cp = (uint32_t *) (cp); \ + *t_cp = htonl (l); \ (cp) += NS_INT32SZ; \ } while (0) diff --git a/resolv/res_mkquery.c b/resolv/res_mkquery.c index 815fcf8..4d98b8c 100644 --- a/resolv/res_mkquery.c +++ b/resolv/res_mkquery.c @@ -131,13 +131,13 @@ res_nmkquery(res_state statp, int randombits; do { -#ifdef RANDOM_BITS +# ifdef RANDOM_BITS RANDOM_BITS (randombits); -#else +# else struct timeval tv; __gettimeofday (&tv, NULL); randombits = (tv.tv_sec << 8) ^ tv.tv_usec; -#endif +# endif } while ((randombits & 0xffff) == 0); statp->id = (statp->id + randombits) & 0xffff; @@ -155,38 +155,36 @@ res_nmkquery(res_state statp, * perform opcode specific processing */ switch (op) { - case QUERY: /*FALLTHROUGH*/ case NS_NOTIFY_OP: + if ((buflen -= QFIXEDSZ + (data == NULL ? 0 : RRFIXEDSZ)) < 0) + return (-1); + goto compose; + + case QUERY: if ((buflen -= QFIXEDSZ) < 0) return (-1); + compose: if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0) return (-1); cp += n; buflen -= n; - __putshort(type, cp); - cp += INT16SZ; - __putshort(class, cp); - cp += INT16SZ; + NS_PUT16 (type, cp); + NS_PUT16 (class, cp); hp->qdcount = htons(1); if (op == QUERY || data == NULL) break; /* * Make an additional record for completion domain. */ - buflen -= RRFIXEDSZ; n = dn_comp((char *)data, cp, buflen, dnptrs, lastdnptr); - if (n < 0) + if (__builtin_expect (n < 0, 0)) return (-1); cp += n; buflen -= n; - __putshort(T_NULL, cp); - cp += INT16SZ; - __putshort(class, cp); - cp += INT16SZ; - __putlong(0, cp); - cp += INT32SZ; - __putshort(0, cp); - cp += INT16SZ; + NS_PUT16 (T_NULL, cp); + NS_PUT16 (class, cp); + NS_PUT32 (0, cp); + NS_PUT16 (0, cp); hp->arcount = htons(1); break; @@ -194,17 +192,13 @@ res_nmkquery(res_state statp, /* * Initialize answer section */ - if (buflen < 1 + RRFIXEDSZ + datalen) + if (__builtin_expect (buflen < 1 + RRFIXEDSZ + datalen, 0)) return (-1); *cp++ = '\0'; /* no domain name */ - __putshort(type, cp); - cp += INT16SZ; - __putshort(class, cp); - cp += INT16SZ; - __putlong(0, cp); - cp += INT32SZ; - __putshort(datalen, cp); - cp += INT16SZ; + NS_PUT16 (type, cp); + NS_PUT16 (class, cp); + NS_PUT32 (0, cp); + NS_PUT16 (datalen, cp); if (datalen) { memcpy(cp, data, datalen); cp += datalen; diff --git a/resolv/res_send.c b/resolv/res_send.c index ebe4fbf..887d048 100644 --- a/resolv/res_send.c +++ b/resolv/res_send.c @@ -674,7 +674,7 @@ send_vc(res_state statp, /* * Send length & message */ - putshort((u_short)buflen, (u_char*)&len); + ns_put16((u_short)buflen, (u_char*)&len); evConsIovec(&len, INT16SZ, &iov[0]); evConsIovec((void*)buf, buflen, &iov[1]); if (TEMP_FAILURE_RETRY (writev(statp->_vcsock, iov, 2)) |