aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 0bba553..983502f 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 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))