summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2006-05-06 18:04:35 +0000
committerUlrich Drepper <drepper@redhat.com>2006-05-06 18:04:35 +0000
commitbce16467708a050e1c88a010f7dfb370013e5ea6 (patch)
tree250bdd8bc2d735f826ee108b75554d2586bdf3d4
parent8e45b1acc235d73fc6866849ec302e9c2077a84e (diff)
downloadglibc-bce16467708a050e1c88a010f7dfb370013e5ea6.tar.gz
glibc-bce16467708a050e1c88a010f7dfb370013e5ea6.tar.xz
glibc-bce16467708a050e1c88a010f7dfb370013e5ea6.zip
* 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.
-rw-r--r--ChangeLog7
-rw-r--r--include/arpa/nameser.h20
-rw-r--r--resolv/res_mkquery.c48
-rw-r--r--resolv/res_send.c2
4 files changed, 47 insertions, 30 deletions
diff --git a/ChangeLog b/ChangeLog
index 0bba553cfc..983502f123 100644
--- 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.
diff --git a/include/arpa/nameser.h b/include/arpa/nameser.h
index 09bd504754..449f5b452e 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 815fcf8ab3..4d98b8c5e8 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 ebe4fbfc9b..887d048e19 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))