* resolv/nss_dns/dns-host.c (_nss_dns_gethostbyaddr_r): Use union
authoraj <aj>
Wed, 1 Jan 2003 16:29:36 +0000 (16:29 +0000)
committeraj <aj>
Wed, 1 Jan 2003 16:29:36 +0000 (16:29 +0000)
        type to avoid strict aliasing problem.
        (_nss_dns_gethostbyname2_r): Likewise.
        * resolv/nss_dns/dns-network.c (_nss_dns_getnetbyaddr_r): Likewise.
        (_nss_dns_getnetbyname_r): Likewise.
* resolv/gethnamaddr.c (_gethtent): Likewise.
(gethostbyname2): Likewise.

resolv/gethnamaddr.c
resolv/nss_dns/dns-host.c
resolv/nss_dns/dns-network.c

index e941b5c..2172375 100644 (file)
@@ -262,9 +262,9 @@ getanswer(answer, anslen, qname, qtype)
                cp += n;                        /* name */
                BOUNDS_CHECK(cp, 3 * INT16SZ + INT32SZ);
                type = ns_get16(cp);
-               cp += INT16SZ;                  /* type */
+               cp += INT16SZ;                  /* type */
                class = ns_get16(cp);
-               cp += INT16SZ + INT32SZ;        /* class, TTL */
+               cp += INT16SZ + INT32SZ;        /* class, TTL */
                n = ns_get16(cp);
                cp += INT16SZ;                  /* len */
                BOUNDS_CHECK(cp, n);
@@ -510,7 +510,12 @@ gethostbyname2(name, af)
        const char *name;
        int af;
 {
-       querybuf *buf, *origbuf;
+       union
+       {
+         querybuf *buf;
+         u_char *ptr;
+       } buf;
+       querybuf *origbuf;
        register const char *cp;
        char *bp;
        int n, size, type, len;
@@ -616,20 +621,20 @@ gethostbyname2(name, af)
                                break;
                }
 
-       buf = origbuf = (querybuf *) alloca (1024);
+       buf.buf = origbuf = (querybuf *) alloca (1024);
 
-       if ((n = __libc_res_nsearch(&_res, name, C_IN, type, buf->buf, 1024,
-                                   (u_char **) &buf)) < 0) {
-               if (buf != origbuf)
-                       free (buf);
+       if ((n = __libc_res_nsearch(&_res, name, C_IN, type, buf.buf->buf, 1024,
+                                   &buf.ptr)) < 0) {
+               if (buf.buf != origbuf)
+                       free (buf.buf);
                dprintf("res_nsearch failed (%d)\n", n);
                if (errno == ECONNREFUSED)
                        return (_gethtbyname2(name, af));
                return (NULL);
        }
-       ret = getanswer(buf, n, name, type);
-       if (buf != origbuf)
-               free (buf);
+       ret = getanswer(buf.buf, n, name, type);
+       if (buf.buf != origbuf)
+               free (buf.buf);
        return ret;
 }
 
@@ -644,7 +649,12 @@ gethostbyaddr(addr, len, af)
        static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 };
        int n;
        socklen_t size;
-       querybuf *buf, *orig_buf;
+       union
+       {
+         querybuf *buf;
+         u_char *ptr;
+       } buf;
+       querybuf *orig_buf;
        register struct hostent *hp;
        char qbuf[MAXDNAME+1], *qp = NULL;
 #ifdef SUNSECURITY
@@ -706,27 +716,27 @@ gethostbyaddr(addr, len, af)
                abort();
        }
 
-       buf = orig_buf = (querybuf *) alloca (1024);
+       buf.buf = orig_buf = (querybuf *) alloca (1024);
 
-       n = __libc_res_nquery(&_res, qbuf, C_IN, T_PTR, buf->buf, 1024,
-                             (u_char **) &buf);
+       n = __libc_res_nquery(&_res, qbuf, C_IN, T_PTR, buf.buf->buf, 1024,
+                             &buf.ptr);
        if (n < 0 && af == AF_INET6) {
                strcpy(qp, "ip6.int");
-               n = __libc_res_nquery(&_res, qbuf, C_IN, T_PTR, buf->buf,
-                                     buf != orig_buf ? MAXPACKET : 1024,
-                                     (u_char **) &buf);
+               n = __libc_res_nquery(&_res, qbuf, C_IN, T_PTR, buf.buf->buf,
+                                     buf.buf != orig_buf ? MAXPACKET : 1024,
+                                     &buf.ptr);
        }
        if (n < 0) {
-               if (buf != orig_buf)
-                       free (buf);
+               if (buf.buf != orig_buf)
+                       free (buf.buf);
                dprintf("res_nquery failed (%d)\n", n);
                if (errno == ECONNREFUSED)
                        return (_gethtbyaddr(addr, len, af));
                return (NULL);
        }
-       hp = getanswer(buf, n, qbuf, T_PTR);
-       if (buf != orig_buf)
-               free (buf);
+       hp = getanswer(buf.buf, n, qbuf, T_PTR);
+       if (buf.buf != orig_buf)
+               free (buf.buf);
        if (!hp)
                return (NULL);  /* h_errno was set by getanswer() */
 #ifdef SUNSECURITY
index b01dc54..f362dd7 100644 (file)
@@ -132,7 +132,12 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
                           char *buffer, size_t buflen, int *errnop,
                           int *h_errnop)
 {
-  querybuf *host_buffer, *orig_host_buffer;
+  union
+  {
+    querybuf *buf;
+    u_char *ptr;
+  } host_buffer;
+  querybuf *orig_host_buffer;
   char tmp[NS_MAXDNAME];
   int size, type, n;
   const char *cp;
@@ -170,10 +175,10 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
       && (cp = res_hostalias (&_res, name, tmp, sizeof (tmp))) != NULL)
     name = cp;
 
-  host_buffer = orig_host_buffer = (querybuf *) alloca (1024);
+  host_buffer.buf = orig_host_buffer = (querybuf *) alloca (1024);
 
-  n = __libc_res_nsearch (&_res, name, C_IN, type, host_buffer->buf,
-                         1024, (u_char **) &host_buffer);
+  n = __libc_res_nsearch (&_res, name, C_IN, type, host_buffer.buf->buf,
+                         1024, &host_buffer.ptr);
   if (n < 0)
     {
       enum nss_status status = (errno == ECONNREFUSED
@@ -188,14 +193,14 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
         by having the RES_USE_INET6 bit in _res.options set, we try
         another lookup.  */
       if (af == AF_INET6 && (_res.options & RES_USE_INET6))
-       n = __libc_res_nsearch (&_res, name, C_IN, T_A, host_buffer->buf,
-                               host_buffer != orig_host_buffer
-                               ? MAXPACKET : 1024, (u_char **) &host_buffer);
+       n = __libc_res_nsearch (&_res, name, C_IN, T_A, host_buffer.buf->buf,
+                               host_buffer.buf != orig_host_buffer
+                               ? MAXPACKET : 1024, &host_buffer.ptr);
 
       if (n < 0)
        {
-         if (host_buffer != orig_host_buffer)
-           free (host_buffer);
+         if (host_buffer.buf != orig_host_buffer)
+           free (host_buffer.buf);
          return status;
        }
 
@@ -205,10 +210,10 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
       result->h_length = INADDRSZ;;
     }
 
-  status = getanswer_r (host_buffer, n, name, type, result, buffer, buflen,
+  status = getanswer_r (host_buffer.buf, n, name, type, result, buffer, buflen,
                        errnop, h_errnop, map);
-  if (host_buffer != orig_host_buffer)
-    free (host_buffer);
+  if (host_buffer.buf != orig_host_buffer)
+    free (host_buffer.buf);
   return status;
 }
 
@@ -247,7 +252,12 @@ _nss_dns_gethostbyaddr_r (const void *addr, socklen_t len, int af,
     char *h_addr_ptrs[MAX_NR_ADDRS + 1];
     char linebuffer[0];
   } *host_data = (struct host_data *) buffer;
-  querybuf *host_buffer, *orig_host_buffer;
+  union
+  {
+    querybuf *buf;
+    u_char *ptr;
+  } host_buffer;
+  querybuf *orig_host_buffer;
   char qbuf[MAXDNAME+1], *qp = NULL;
   size_t size;
   int n, status;
@@ -305,30 +315,30 @@ _nss_dns_gethostbyaddr_r (const void *addr, socklen_t len, int af,
       break;
     }
 
-  host_buffer = orig_host_buffer = (querybuf *) alloca (1024);
+  host_buffer.buf = orig_host_buffer = (querybuf *) alloca (1024);
 
-  n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer->buf,
-                        1024, (u_char **) &host_buffer);
+  n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer.buf->buf,
+                        1024, &host_buffer.ptr);
   if (n < 0 && af == AF_INET6)
     {
       strcpy (qp, "ip6.int");
-      n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer->buf,
-                            host_buffer != orig_host_buffer
-                            ? MAXPACKET : 1024, (u_char **) &host_buffer);
+      n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer.buf->buf,
+                            host_buffer.buf != orig_host_buffer
+                            ? MAXPACKET : 1024, &host_buffer.ptr);
     }
   if (n < 0)
     {
       *h_errnop = h_errno;
       __set_errno (olderr);
-      if (host_buffer != orig_host_buffer)
-       free (host_buffer);
+      if (host_buffer.buf != orig_host_buffer)
+       free (host_buffer.buf);
       return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
     }
 
-  status = getanswer_r (host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
+  status = getanswer_r (host_buffer.buf, n, qbuf, T_PTR, result, buffer, buflen,
                        errnop, h_errnop, 0 /* XXX */);
-  if (host_buffer != orig_host_buffer)
-    free (host_buffer);
+  if (host_buffer.buf != orig_host_buffer)
+    free (host_buffer.buf);
   if (status != NSS_STATUS_SUCCESS)
     {
       *h_errnop = h_errno;
index 6ba66ba..efda486 100644 (file)
@@ -110,7 +110,12 @@ _nss_dns_getnetbyname_r (const char *name, struct netent *result,
                         int *herrnop)
 {
   /* Return entry for network with NAME.  */
-  querybuf *net_buffer, *orig_net_buffer;
+  union
+  {
+    querybuf *buf;
+    u_char *ptr;
+  } net_buffer;
+  querybuf *orig_net_buffer;
   int anslen;
   char *qbuf;
   enum nss_status status;
@@ -120,25 +125,25 @@ _nss_dns_getnetbyname_r (const char *name, struct netent *result,
 
   qbuf = strdupa (name);
 
-  net_buffer = orig_net_buffer = (querybuf *) alloca (1024);
+  net_buffer.buf = orig_net_buffer = (querybuf *) alloca (1024);
 
-  anslen = __libc_res_nsearch (&_res, qbuf, C_IN, T_PTR, net_buffer->buf,
-                              1024, (u_char **) &net_buffer);
+  anslen = __libc_res_nsearch (&_res, qbuf, C_IN, T_PTR, net_buffer.buf->buf,
+                              1024, &net_buffer.ptr);
   if (anslen < 0)
     {
       /* Nothing found.  */
       *errnop = errno;
-      if (net_buffer != orig_net_buffer)
-       free (net_buffer);
+      if (net_buffer.buf != orig_net_buffer)
+       free (net_buffer.buf);
       return (errno == ECONNREFUSED
              || errno == EPFNOSUPPORT
              || errno == EAFNOSUPPORT)
        ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
     }
 
-  status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYNAME);
-  if (net_buffer != orig_net_buffer)
-    free (net_buffer);
+  status = getanswer_r (net_buffer.buf, anslen, result, buffer, buflen, BYNAME);
+  if (net_buffer.buf != orig_net_buffer)
+    free (net_buffer.buf);
   return status;
 }
 
@@ -150,7 +155,12 @@ _nss_dns_getnetbyaddr_r (uint32_t net, int type, struct netent *result,
 {
   /* Return entry for network with NAME.  */
   enum nss_status status;
-  querybuf *net_buffer, *orig_net_buffer;
+  union
+  {
+    querybuf *buf;
+    u_char *ptr;
+  } net_buffer;
+  querybuf *orig_net_buffer;
   unsigned int net_bytes[4];
   char qbuf[MAXDNAME];
   int cnt, anslen;
@@ -190,26 +200,26 @@ _nss_dns_getnetbyaddr_r (uint32_t net, int type, struct netent *result,
       break;
     }
 
-  net_buffer = orig_net_buffer = (querybuf *) alloca (1024);
+  net_buffer.buf = orig_net_buffer = (querybuf *) alloca (1024);
 
-  anslen = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, net_buffer->buf,
-                             1024, (u_char **) &net_buffer);
+  anslen = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, net_buffer.buf->buf,
+                             1024, &net_buffer.ptr);
   if (anslen < 0)
     {
       /* Nothing found.  */
       int err = errno;
       __set_errno (olderr);
-      if (net_buffer != orig_net_buffer)
-       free (net_buffer);
+      if (net_buffer.buf != orig_net_buffer)
+       free (net_buffer.buf);
       return (err == ECONNREFUSED
              || err == EPFNOSUPPORT
              || err == EAFNOSUPPORT)
        ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
     }
 
-  status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYADDR);
-  if (net_buffer != orig_net_buffer)
-    free (net_buffer);
+  status = getanswer_r (net_buffer.buf, anslen, result, buffer, buflen, BYADDR);
+  if (net_buffer.buf != orig_net_buffer)
+    free (net_buffer.buf);
   if (status == NSS_STATUS_SUCCESS)
     {
       /* Strip trailing zeros.  */