Index: libc/gen/getpwent.c =================================================================== RCS file: /home/ncvs/src/lib/libc/gen/getpwent.c,v retrieving revision 1.55 diff -u -r1.55 getpwent.c --- libc/gen/getpwent.c 2000/09/06 18:16:39 1.55 +++ libc/gen/getpwent.c 2000/10/19 09:27:50 @@ -314,7 +314,6 @@ struct passwd *pw; char *s; { - static char adjunctpw[YPMAXRECORD + 2]; int flags, maptype; maptype = __ypmaptype(); @@ -348,11 +347,7 @@ if (yp_match(__ypdomain, "passwd.adjunct.byname", pw->pw_name, (int)strlen(pw->pw_name), &data, &datalen) == 0) { - if (datalen > sizeof(adjunctpw) - 1) - datalen = sizeof(adjunctpw) - 1; - strncpy(adjunctpw, data, (size_t)datalen); - - /* skip name to get password */ + /* skip name to get password */ if ((bp = strsep(&data, ":")) != NULL && (bp = strsep(&data, ":")) != NULL) pw->pw_passwd = bp; @@ -450,24 +445,28 @@ case _PW_KEYBYNUM: if (_pw_hesnum == -1) return NS_NOTFOUND; /* no more hesiod records */ - snprintf(line, sizeof(line) - 1, "passwd-%u", _pw_hesnum); + if (snprintf(line, sizeof(line), "passwd-%u", _pw_hesnum) >= + sizeof(line)) + return NS_UNAVAIL; _pw_hesnum++; map = "passwd"; break; case _PW_KEYBYNAME: name = va_arg(ap, const char *); - strncpy(line, name, sizeof(line)); + if (strlcpy(line, name, sizeof(line)) >= sizeof(line)) + return NS_UNAVAIL; map = "passwd"; break; case _PW_KEYBYUID: uid = va_arg(ap, uid_t); - snprintf(line, sizeof(line), "%u", (unsigned int)uid); + if (snprintf(line, sizeof(line), "%u", (unsigned int)uid) >= + sizeof(line)) + return NS_UNAVAIL; map = "uid"; /* XXX this is `passwd' on ultrix */ break; default: abort(); } - line[sizeof(line) - 1] = '\0'; r = NS_UNAVAIL; if (hesiod_init(&context) == -1) @@ -484,8 +483,12 @@ goto cleanup_dns_getpw; } - strncpy(line, hp[0], sizeof(line)); /* only check first elem */ - line[sizeof(line) - 1] = '\0'; + /* only check first elem of hp */ + if (strlcpy(line, hp[0], sizeof(line)) >= sizeof(line)) { + hesiod_free_list(context, hp); + r = NS_UNAVAIL; + goto cleanup_dns_getpw; + } hesiod_free_list(context, hp); if (__pwparse(&_pw_passwd, line)) { if (search == _PW_KEYBYNUM) @@ -532,17 +535,19 @@ break; case _PW_KEYBYNAME: name = va_arg(ap, const char *); - strncpy(line, name, sizeof(line)); + if (strlcpy(line, name, sizeof(line)) >= sizeof(line)) + return NS_UNAVAIL; break; case _PW_KEYBYUID: uid = va_arg(ap, uid_t); - snprintf(line, sizeof(line), "%u", (unsigned int)uid); + if (snprintf(line, sizeof(line), "%u", (unsigned int)uid) >= + sizeof(line)) + return NS_UNAVAIL; map = PASSWD_BYUID; break; default: abort(); } - line[sizeof(line) - 1] = '\0'; rval = NS_UNAVAIL; if (search != _PW_KEYBYNUM) { data = NULL; @@ -556,8 +561,10 @@ return (rval); } data[datalen] = '\0'; /* clear trailing \n */ - strncpy(line, data, sizeof(line)); - line[sizeof(line) - 1] = '\0'; + if (strlcpy(line, data, sizeof(line)) >= sizeof(line)) { + free(data); + return NS_UNAVAIL; + } free(data); if (__pwparse(&_pw_passwd, line)) return NS_UNAVAIL; @@ -596,9 +603,11 @@ return (rval); } data[datalen] = '\0'; /* clear trailing \n */ - strncpy(line, data, sizeof(line)); - line[sizeof(line) - 1] = '\0'; - free(data); + if (strlcpy(line, data, sizeof(line)) >= sizeof(line)) { + free(data); + return NS_UNAVAIL; + } + free(data); if (! __pwparse(&_pw_passwd, line)) return NS_SUCCESS; }