Remove 1024 byte limit.Remove 1024 byte limit.
[kopensolaris-gnu/glibc.git] / nis / nis_subr.c
index 74eb0b5..3283e4c 100644 (file)
 #include <errno.h>
 #include <string.h>
 #include <rpcsvc/nis.h>
-#include <rpcsvc/nislib.h>
 
 nis_name
-nis_leaf_of (const nis_name name)
+nis_leaf_of (const_nis_name name)
 {
   static char result[NIS_MAXNAMELEN + 1];
 
@@ -31,7 +30,7 @@ nis_leaf_of (const nis_name name)
 }
 
 nis_name
-nis_leaf_of_r (const nis_name name, char *buffer, size_t buflen)
+nis_leaf_of_r (const_nis_name name, char *buffer, size_t buflen)
 {
   size_t i = 0;
 
@@ -46,14 +45,22 @@ nis_leaf_of_r (const nis_name name, char *buffer, size_t buflen)
       return NULL;
     }
 
-  if (i > 1)
-    strncpy (buffer, name, i - 1);
+  if (i > 0)
+    {
+      if ((size_t)i >= buflen)
+       {
+         errno = ERANGE;
+         return NULL;
+       }
+      strncpy (buffer, name, i);
+      buffer[i] = 0;
+    }
 
   return buffer;
 }
 
 nis_name
-nis_name_of (const nis_name name)
+nis_name_of (const_nis_name name)
 {
   static char result[NIS_MAXNAMELEN + 1];
 
@@ -61,7 +68,7 @@ nis_name_of (const nis_name name)
 }
 
 nis_name
-nis_name_of_r (const nis_name name, char *buffer, size_t buflen)
+nis_name_of_r (const_nis_name name, char *buffer, size_t buflen)
 {
   char *local_domain;
   int diff;
@@ -89,40 +96,8 @@ nis_name_of_r (const nis_name name, char *buffer, size_t buflen)
   return buffer;
 }
 
-nis_name
-nis_domain_of (const nis_name name)
-{
-  static char result[NIS_MAXNAMELEN + 1];
-
-  return nis_domain_of_r (name, result, NIS_MAXNAMELEN);
-}
-
-nis_name
-nis_domain_of_r (const nis_name name, char *buffer, size_t buflen)
-{
-  char *cptr;
-  size_t cptr_len;
-
-  cptr = strchr (name, '.');   /* XXX What happens if the NIS name
-                                  does not contain a `.'?  */
-  ++cptr;
-  cptr_len = strlen (cptr);
-
-  if (cptr_len == 0)
-    strcpy (buffer, ".");
-  else if (cptr_len >= buflen)
-    {
-      errno = ERANGE;
-      return NULL;
-    }
-  else
-    memcpy (buffer, cptr, cptr_len + 1);
-
-  return buffer;
-}
-
 static int
-count_dots (const nis_name str)
+count_dots (const_nis_name str)
 {
   int count = 0;
   size_t i;
@@ -135,13 +110,12 @@ count_dots (const nis_name str)
 }
 
 nis_name *
-nis_getnames (const nis_name name)
+nis_getnames (const_nis_name name)
 {
   nis_name *getnames = NULL;
   char local_domain[NIS_MAXNAMELEN + 1];
   char *path, *cp;
-  int count, pos;
-
+  int count, pos, have_point;
 
   strncpy (local_domain, nis_local_directory (), NIS_MAXNAMELEN);
   local_domain[NIS_MAXNAMELEN] = '\0';
@@ -170,6 +144,8 @@ nis_getnames (const nis_name name)
   else
     path = strdupa (path);
 
+  have_point = (strchr (name, '.') != NULL);
+
   pos = 0;
 
   cp = strtok (path, ":");
@@ -180,7 +156,7 @@ nis_getnames (const nis_name name)
          char *cptr = local_domain;
          char *tmp;
 
-         while (count_dots (cptr) >= 2)
+         while ((have_point && *cptr != '\0') || (count_dots (cptr) >= 2))
            {
              if (pos >= count)
                {
@@ -195,13 +171,18 @@ nis_getnames (const nis_name name)
              getnames[pos] = tmp;
              tmp = stpcpy (tmp, name);
              *tmp++ = '.';
-             stpcpy (tmp, cptr);
+             if (cptr[1] != '\0')
+               stpcpy (tmp, cptr);
+             else
+               ++cptr;
 
              ++pos;
 
-             while (*cptr != '.')
+             while (*cptr != '.' && *cptr != '\0')
+               ++cptr;
+             if (cptr[0] != '\0' && cptr[1] != '\0')
+               /* If we have only ".", don't remove the "." */
                ++cptr;
-             ++cptr;
            }
        }
       else
@@ -210,31 +191,35 @@ nis_getnames (const nis_name name)
 
          if (cp[strlen (cp) - 1] == '$')
            {
+             char *p;
+
              tmp = malloc (strlen (cp) + strlen (local_domain) +
                            strlen (name) + 2);
              if (tmp == NULL)
                return NULL;
 
-             tmp = stpcpy (tmp, name);
-             *tmp++ = '.';
-             tmp = stpcpy (tmp, cp);
-             --tmp;
-             if (tmp[-1] != '.')
-               *tmp++ = '.';
-             stpcpy (tmp, local_domain);
+             p = stpcpy (tmp, name);
+             *p++ = '.';
+             p = stpcpy (p, cp);
+             --p;
+             if (p[-1] != '.')
+               *p++ = '.';
+             stpcpy (p, local_domain);
            }
          else
            {
+             char *p;
+
              tmp = malloc (strlen (cp) + strlen (name) + 2);
              if (tmp == NULL)
                return NULL;
 
-             tmp = stpcpy (tmp, name);
-             *tmp++ = '.';
-             stpcpy (tmp, cp);
+             p = stpcpy (tmp, name);
+             *p++ = '.';
+             stpcpy (p, cp);
            }
 
-         if (pos > count)
+         if (pos >= count)
            {
              count += 5;
              getnames = realloc (getnames, (count + 1) * sizeof (char *));
@@ -267,7 +252,7 @@ nis_freenames (nis_name *names)
 }
 
 name_pos
-nis_dir_cmp (const nis_name n1, const nis_name n2)
+nis_dir_cmp (const_nis_name n1, const_nis_name n2)
 {
   int len1, len2;