* resolv/res_query.c (__libc_res_nquery): Align buffer for T_AAAA
authorUlrich Drepper <drepper@redhat.com>
Wed, 9 Jul 2008 17:59:15 +0000 (17:59 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 9 Jul 2008 17:59:15 +0000 (17:59 +0000)
query.  Adjust buffer size computation for padding.

ChangeLog
resolv/res_query.c

index 96dcaad..febf983 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-07-09  Ulrich Drepper  <drepper@redhat.com>
+
+       * resolv/res_query.c (__libc_res_nquery): Align buffer for T_AAAA
+       query.  Adjust buffer size computation for padding.
+
 2008-07-08  Ulrich Drepper  <drepper@redhat.com>
 
        * stdio-common/Makefile: Add rules to build and run tst-setvbuf1.
index 3d2f2fe..d3a959f 100644 (file)
@@ -146,18 +146,34 @@ __libc_res_nquery(res_state statp,
              {
                if ((oflags & RES_F_EDNS0ERR) == 0
                    && (statp->options & RES_USE_EDNS0) != 0)
-                 n = __res_nopt(statp, n, query1, bufsize, anslen / 2);
+                 {
+                   n = __res_nopt(statp, n, query1, bufsize, anslen / 2);
+                   if (n < 0)
+                     goto unspec_nomem;
+                 }
 
                nquery1 = n;
-               query2 = buf + nquery1;
+               /* Align the buffer.  */
+               int npad = ((nquery1 + __alignof__ (HEADER) - 1)
+                           & ~(__alignof__ (HEADER)));
+               if (n > bufsize - npad)
+                 {
+                   n = -1;
+                   goto unspec_nomem;
+                 }
+               query2 = buf + npad;
+               int nused = n + npad;
                n = res_nmkquery(statp, QUERY, name, class, T_AAAA, NULL, 0,
-                                NULL, query2, bufsize - n);
+                                NULL, query2, bufsize - nused);
                if (n > 0
                    && (oflags & RES_F_EDNS0ERR) == 0
                    && (statp->options & RES_USE_EDNS0) != 0)
-                 n = __res_nopt(statp, n, query2, bufsize - n, anslen / 2);
+                 n = __res_nopt(statp, n, query2, bufsize - nused - n,
+                                anslen / 2);
                nquery2 = n;
              }
+
+         unspec_nomem:;
          }
        else
          {