Make sure buffer is always NUL terminated.
authordrepper <drepper>
Mon, 16 Feb 1998 17:40:19 +0000 (17:40 +0000)
committerdrepper <drepper>
Mon, 16 Feb 1998 17:40:19 +0000 (17:40 +0000)
nis/nss_nisplus/nisplus-hosts.c
nis/nss_nisplus/nisplus-network.c
nis/nss_nisplus/nisplus-proto.c
nis/nss_nisplus/nisplus-rpc.c
nis/nss_nisplus/nisplus-service.c

index 3b022b6..375315b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -107,7 +107,7 @@ _nss_nisplus_parse_hostent (nis_result *result, int af, struct hostent *host,
   p = first_unused;
 
   line = p;
-  for (i = 0; i < result->objects.objects_len; i++)
+  for (i = 0; i < result->objects.objects_len; ++i)
     {
       if (strcmp (NISENTRYVAL (i, 1, result), host->h_name) != 0)
        {
@@ -121,8 +121,9 @@ _nss_nisplus_parse_hostent (nis_result *result, int af, struct hostent *host,
          room_left -= (NISENTRYLEN (i, 1, result) + 1);
        }
     }
-  ++p;
+  *p++ = '\0';
   first_unused = p;
+
   /* Adjust the pointer so it is aligned for
      storing pointers.  */
   first_unused += __alignof__ (char *) - 1;
@@ -142,7 +143,7 @@ _nss_nisplus_parse_hostent (nis_result *result, int af, struct hostent *host,
     {
       /* Skip leading blanks.  */
       while (isspace (*line))
-       line++;
+       ++line;
 
       if (*line == '\0')
        break;
index b39a54f..f152c49 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -79,7 +79,7 @@ _nss_nisplus_parse_netent (nis_result *result, struct netent *network,
   p = first_unused;
 
   line = p;
-  for (i = 0; i < result->objects.objects_len; i++)
+  for (i = 0; i < result->objects.objects_len; ++i)
     {
       if (strcmp (NISENTRYVAL (i, 1, result), network->n_name) != 0)
         {
@@ -93,7 +93,7 @@ _nss_nisplus_parse_netent (nis_result *result, struct netent *network,
           room_left -= (NISENTRYLEN (i, 1, result) + 1);
         }
     }
-  ++p;
+  *p++ = '\0';
   first_unused = p;
 
   /* Adjust the pointer so it is aligned for
@@ -106,7 +106,7 @@ _nss_nisplus_parse_netent (nis_result *result, struct netent *network,
   room_left -= (2 * sizeof (char *));
   network->n_aliases[0] = NULL;
 
-    i = 0;
+  i = 0;
   while (*line != '\0')
     {
       /* Skip leading blanks.  */
@@ -125,17 +125,14 @@ _nss_nisplus_parse_netent (nis_result *result, struct netent *network,
       while (*line != '\0' && *line != ' ')
         ++line;
 
-      if (line != network->n_aliases[i])
-        {
-          if (*line != '\0')
-            {
-              *line = '\0';
-              ++line;
-            }
+      if (*line == ' ')
+       {
+         *line = '\0';
+         ++line;
           ++i;
         }
       else
-        network->n_aliases[i] = NULL;
+        network->n_aliases[i+1] = NULL;
     }
 
   return 1;
@@ -385,39 +382,57 @@ _nss_nisplus_getnetbyaddr_r (const unsigned long addr, const int type,
     nis_result *result;
     char buf[1024 + tablename_len];
     struct in_addr in;
+    char buf2[256];
+    int b2len;
 
     in = inet_makeaddr (addr, 0);
-    sprintf (buf, "[addr=%s],%s", inet_ntoa (in), tablename_val);
-
-    result = nis_list (buf, EXPAND_NAME, NULL, NULL);
+    strcpy (buf2, inet_ntoa (in));
+    b2len = strlen (buf2);
 
-    retval = niserr2nss (result->status);
-    if (retval != NSS_STATUS_SUCCESS)
+    while (1)
       {
-       if (retval == NSS_STATUS_TRYAGAIN)
+       sprintf (buf, "[addr=%s],%s", buf2, tablename_val);
+       result = nis_list (buf, EXPAND_NAME, NULL, NULL);
+
+       retval = niserr2nss (result->status);
+       if (retval != NSS_STATUS_SUCCESS)
          {
-           *errnop = errno;
-           *herrnop = NETDB_INTERNAL;
+           if (buf2[b2len -2] == '.' && buf2[b2len -1] == '0')
+             {
+               /* Try again, but with trailing dot(s)
+                  removed (one by one) */
+               buf2[b2len - 2] = '\0';
+               b2len -= 2;
+               continue;
+             }
+           else
+             return NSS_STATUS_NOTFOUND;
+
+           if (retval == NSS_STATUS_TRYAGAIN)
+             {
+               *errnop = errno;
+               *herrnop = NETDB_INTERNAL;
+             }
+           nis_freeresult (result);
+           return retval;
          }
-       nis_freeresult (result);
-       return retval;
-      }
 
-    parse_res = _nss_nisplus_parse_netent (result, network, buffer, buflen,
-                                          errnop);
+       parse_res = _nss_nisplus_parse_netent (result, network, buffer,
+                                              buflen, errnop);
 
-    nis_freeresult (result);
+       nis_freeresult (result);
 
-    if (parse_res > 0)
-      return NSS_STATUS_SUCCESS;
+       if (parse_res > 0)
+         return NSS_STATUS_SUCCESS;
 
-    *herrnop = NETDB_INTERNAL;
-    if (parse_res == -1)
-      {
-       *errnop = ERANGE;
-       return NSS_STATUS_TRYAGAIN;
+       *herrnop = NETDB_INTERNAL;
+       if (parse_res == -1)
+         {
+           *errnop = ERANGE;
+           return NSS_STATUS_TRYAGAIN;
+         }
+       else
+         return NSS_STATUS_NOTFOUND;
       }
-    else
-      return NSS_STATUS_NOTFOUND;
   }
 }
index aa2271c..d121b2f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -79,7 +79,7 @@ _nss_nisplus_parse_protoent (nis_result * result, struct protoent *proto,
   p = first_unused;
 
   line = p;
-  for (i = 0; i < result->objects.objects_len; i++)
+  for (i = 0; i < result->objects.objects_len; ++i)
     {
       if (strcmp (NISENTRYVAL (i, 1, result), proto->p_name) != 0)
         {
@@ -92,7 +92,7 @@ _nss_nisplus_parse_protoent (nis_result * result, struct protoent *proto,
           room_left -= (NISENTRYLEN (i, 1, result) + 1);
         }
     }
-  ++p;
+  *p++ = '\0';
   first_unused = p;
 
   /* Adjust the pointer so it is aligned for
index 105e802..9dc412e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -69,13 +69,13 @@ _nss_nisplus_parse_rpcent (nis_result *result, struct rpcent *rpc,
            NISENTRYLEN (0, 0, result));
   first_unused[NISENTRYLEN (0, 0, result)] = '\0';
   rpc->r_name = first_unused;
-  room_left -= strlen (first_unused) + 1;
+  room_left -= (strlen (first_unused) + 1);
   first_unused += strlen (first_unused) + 1;
   rpc->r_number = atoi (NISENTRYVAL (0, 2, result));
   p = first_unused;
 
   line = p;
-  for (i = 0; i < result->objects.objects_len; i++)
+  for (i = 0; i < result->objects.objects_len; ++i)
     {
       if (strcmp (NISENTRYVAL (i, 1, result), rpc->r_name) != 0)
         {
@@ -106,7 +106,7 @@ _nss_nisplus_parse_rpcent (nis_result *result, struct rpcent *rpc,
     {
       /* Skip leading blanks.  */
       while (isspace (*line))
-        line++;
+        ++line;
 
       if (*line == '\0')
         break;
@@ -120,17 +120,14 @@ _nss_nisplus_parse_rpcent (nis_result *result, struct rpcent *rpc,
       while (*line != '\0' && *line != ' ')
         ++line;
 
-      if (line != rpc->r_aliases[i])
+      if (*line == ' ')
         {
-          if (*line != '\0')
-            {
-              *line = '\0';
-              ++line;
-            }
+         *line = '\0';
+         ++line;
           ++i;
         }
       else
-        rpc->r_aliases[i] = NULL;
+        rpc->r_aliases[i+1] = NULL;
     }
 
   return 1;
index 8f681d3..04fed59 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -84,7 +84,7 @@ _nss_nisplus_parse_servent (nis_result *result, struct servent *serv,
   p = first_unused;
 
   line = p;
-  for (i = 0; i < result->objects.objects_len; i++)
+  for (i = 0; i < result->objects.objects_len; ++i)
     {
       if (strcmp (NISENTRYVAL (i, 1, result), serv->s_name) != 0)
         {
@@ -97,7 +97,7 @@ _nss_nisplus_parse_servent (nis_result *result, struct servent *serv,
           room_left -= (NISENTRYLEN (i, 1, result) + 1);
         }
     }
-  ++p;
+  *p++ = '\0';
   first_unused = p;
 
   /* Adjust the pointer so it is aligned for