]> sourceware.org Git - glibc.git/blobdiff - nis/nss_compat/compat-pwd.c
Update.
[glibc.git] / nis / nss_compat / compat-pwd.c
index 5bfff17ca5c0ba8aa0e9683e1df0cf0c6fb8d69e..4cbf739d050a43d0cf2d57af707a9c454cc7f48a 100644 (file)
@@ -393,7 +393,7 @@ getpwent_next_nis_netgr (const char *name, struct passwd *result, ent_t *ent,
       if (domain != NULL && strcmp (ypdomain, domain) != 0)
        continue;
 
-      /* If name != NULL, we are called from getpwnam */
+      /* If name != NULL, we are called from getpwnam */
       if (name != NULL)
        if (strcmp (user, name) != 0)
          continue;
@@ -406,12 +406,21 @@ getpwent_next_nis_netgr (const char *name, struct passwd *result, ent_t *ent,
       p2len = pwd_need_buflen (&ent->pwd);
       if (p2len > buflen)
        {
+         free (outval);
          *errnop = ERANGE;
          return NSS_STATUS_TRYAGAIN;
        }
       p2 = buffer + (buflen - p2len);
       buflen -= p2len;
+
+      if (buflen < ((size_t) outvallen + 1))
+       {
+         free (outval);
+         *errnop = ERANGE;
+         return NSS_STATUS_TRYAGAIN;
+       }
       p = strncpy (buffer, outval, buflen);
+
       while (isspace (*p))
        p++;
       free (outval);
@@ -650,6 +659,13 @@ getpwent_next_nis (struct passwd *result, ent_t *ent, char *buffer,
              return NSS_STATUS_UNAVAIL;
            }
 
+         if (buflen < ((size_t) outvallen + 1))
+           {
+             free (outval);
+             *errnop = ERANGE;
+             return NSS_STATUS_TRYAGAIN;
+           }
+
          saved_first = TRUE;
          saved_oldkey = ent->oldkey;
          saved_oldlen = ent->oldkeylen;
@@ -665,9 +681,17 @@ getpwent_next_nis (struct passwd *result, ent_t *ent, char *buffer,
            {
              ent->nis = 0;
              give_pwd_free (&ent->pwd);
+             *errnop = ENOENT;
              return NSS_STATUS_NOTFOUND;
            }
 
+         if (buflen < ((size_t) outvallen + 1))
+           {
+             free (outval);
+             *errnop = ERANGE;
+             return NSS_STATUS_TRYAGAIN;
+           }
+
          saved_first = FALSE;
          saved_oldkey = ent->oldkey;
          saved_oldlen = ent->oldkeylen;
@@ -767,11 +791,18 @@ getpwnam_plususer (const char *name, struct passwd *result, char *buffer,
 
       if (yp_match (domain, "passwd.byname", name, strlen (name),
                    &outval, &outvallen) != YPERR_SUCCESS)
-       return NSS_STATUS_NOTFOUND;
+       {
+         *errnop = ENOENT;
+         return NSS_STATUS_NOTFOUND;
+       }
 
-      ptr = strncpy (buffer, outval, buflen < (size_t) outvallen ?
-                    buflen : (size_t) outvallen);
-      buffer[buflen < (size_t) outvallen ? buflen : (size_t) outvallen] = '\0';
+      if (buflen < ((size_t) outvallen + 1))
+       {
+         free (outval);
+         *errnop = ERANGE;
+         return NSS_STATUS_TRYAGAIN;
+       }
+      ptr = strncpy (buffer, outval, buflen);
       free (outval);
       while (isspace (*ptr))
        ptr++;
@@ -813,7 +844,10 @@ getpwent_next_file (struct passwd *result, ent_t *ent,
          buffer[buflen - 1] = '\xff';
          p = fgets (buffer, buflen, ent->stream);
          if (p == NULL && feof (ent->stream))
-           return NSS_STATUS_NOTFOUND;
+           {
+             *errnop = ENOENT;
+             return NSS_STATUS_NOTFOUND;
+           }
          if (p == NULL || buffer[buflen - 1] != '\xff')
            {
              fsetpos (ent->stream, &pos);
@@ -888,7 +922,11 @@ getpwent_next_file (struct passwd *result, ent_t *ent,
          if (status == NSS_STATUS_RETURN)
            continue;
          else
-           return status;
+           {
+             if (status == NSS_STATUS_NOTFOUND)
+               *errnop = ENOENT;
+             return status;
+           }
        }
 
       /* -user */
@@ -1024,7 +1062,10 @@ internal_getpwnam_r (const char *name, struct passwd *result, ent_t *ent,
          buffer[buflen - 1] = '\xff';
          p = fgets (buffer, buflen, ent->stream);
          if (p == NULL && feof (ent->stream))
-           return NSS_STATUS_NOTFOUND;
+           {
+             *errnop = ENOENT;
+             return NSS_STATUS_NOTFOUND;
+           }
          if (p == NULL || buffer[buflen - 1] != '\xff')
            {
              fsetpos (ent->stream, &pos);
@@ -1119,7 +1160,10 @@ internal_getpwnam_r (const char *name, struct passwd *result, ent_t *ent,
          && result->pw_name[1] != '@')
        {
          if (strcmp (&result->pw_name[1], name) == 0)
-           return NSS_STATUS_NOTFOUND;
+           {
+             *errnop = ENOENT;
+             return NSS_STATUS_NOTFOUND;
+           }
          else
            continue;
        }
@@ -1169,7 +1213,10 @@ _nss_compat_getpwnam_r (const char *name, struct passwd *pwd,
   enum nss_status status;
 
   if (name[0] == '-' || name[0] == '+')
-    return NSS_STATUS_NOTFOUND;
+    {
+      *errnop = ENOENT;
+      return NSS_STATUS_NOTFOUND;
+    }
 
   __libc_lock_lock (lock);
 
@@ -1259,10 +1306,17 @@ getpwuid_plususer (uid_t uid, struct passwd *result, char *buffer,
          *errnop = errno;
          return NSS_STATUS_TRYAGAIN;
        }
-      ptr = strncpy (buffer, outval, buflen < (size_t) outvallen ?
-                    buflen : (size_t) outvallen);
-      buffer[buflen < (size_t) outvallen ? buflen : (size_t) outvallen] = '\0';
+
+      if ( buflen < ((size_t) outvallen + 1))
+       {
+         free (outval);
+         *errnop = ERANGE;
+         return NSS_STATUS_TRYAGAIN;
+       }
+
+      ptr = strncpy (buffer, outval, buflen);
       free (outval);
+
       while (isspace (*ptr))
        ptr++;
       parse_res = _nss_files_parse_pwent (ptr, result, data, buflen, errnop);
This page took 1.200562 seconds and 5 git commands to generate.