* nis/nss_nisplus/nisplus-network.c (_nss_nisplus_getnetbyaddr_r):
authorUlrich Drepper <drepper@redhat.com>
Sat, 3 Dec 2005 22:36:14 +0000 (22:36 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 3 Dec 2005 22:36:14 +0000 (22:36 +0000)
Better sized buffers.  Correct error case handling.

ChangeLog
nis/nss_nisplus/nisplus-network.c

index 4601a7a..ee6b092 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2005-12-03  Ulrich Drepper  <drepper@redhat.com>
 
+       * nis/nss_nisplus/nisplus-network.c (_nss_nisplus_getnetbyaddr_r):
+       Better sized buffers.  Correct error case handling.
        * nis/nis_error.c (nis_sperror_r): Let snprintf determine whether
        there is an overflow.
        * nis/nss_nisplus/nisplus-service.c: Fix locking to use
index 1cd7cf2..dc6b99e 100644 (file)
@@ -416,32 +416,28 @@ _nss_nisplus_getnetbyaddr_r (uint32_t addr, const int type,
     }
 
   {
-    int parse_res, retval;
-    nis_result *result;
-    char buf[1024 + tablename_len];
-    struct in_addr in;
-    char buf2[256];
-    int b2len;
+    char buf[27 + tablename_len];
+    char buf2[18];
     int olderr = errno;
 
-    in = inet_makeaddr (addr, 0);
+    struct in_addr in = inet_makeaddr (addr, 0);
     strcpy (buf2, inet_ntoa (in));
-    b2len = strlen (buf2);
+    size_t b2len = strlen (buf2);
 
     while (1)
       {
-       sprintf (buf, "[addr=%s],%s", buf2, tablename_val);
-       result = nis_list (buf, EXPAND_NAME, NULL, NULL);
+       snprintf (buf, sizeof (buf), "[addr=%s],%s", buf2, tablename_val);
+       nis_result *result = nis_list (buf, EXPAND_NAME, NULL, NULL);
 
        if (result == NULL)
          {
            __set_errno (ENOMEM);
            return NSS_STATUS_TRYAGAIN;
          }
-       retval = niserr2nss (result->status);
-       if (retval != NSS_STATUS_SUCCESS)
+       enum nss_status retval = niserr2nss (result->status);
+       if (__builtin_expect (retval != NSS_STATUS_SUCCESS, 0))
          {
-           if (buf2[b2len -2] == '.' && buf2[b2len -1] == '0')
+           if (b2len > 2 && buf2[b2len - 2] == '.' && buf2[b2len - 1] == '0')
              {
                /* Try again, but with trailing dot(s)
                   removed (one by one) */
@@ -449,8 +445,6 @@ _nss_nisplus_getnetbyaddr_r (uint32_t addr, const int type,
                b2len -= 2;
                continue;
              }
-           else
-             return NSS_STATUS_NOTFOUND;
 
            if (retval == NSS_STATUS_TRYAGAIN)
              {
@@ -463,8 +457,8 @@ _nss_nisplus_getnetbyaddr_r (uint32_t addr, const int type,
            return retval;
          }
 
-       parse_res = _nss_nisplus_parse_netent (result, network, buffer,
-                                              buflen, errnop);
+       int parse_res = _nss_nisplus_parse_netent (result, network, buffer,
+                                                  buflen, errnop);
 
        nis_freeresult (result);