* include/arpa/nameser.h: Also optimize NS_PUT16 and NS_PUT32.
authorUlrich Drepper <drepper@redhat.com>
Sat, 6 May 2006 18:04:35 +0000 (18:04 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 6 May 2006 18:04:35 +0000 (18:04 +0000)
* 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.

ChangeLog
include/arpa/nameser.h
resolv/res_mkquery.c
resolv/res_send.c

index 0bba553..983502f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
index 09bd504..449f5b4 100644 (file)
   } 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)
 
index 815fcf8..4d98b8c 100644 (file)
@@ -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;
index ebe4fbf..887d048 100644 (file)
@@ -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))