diff --git a/lib/libc/gen/pw_scan.c b/lib/libc/gen/pw_scan.c index 849effab45d9..d0fb5f17d035 100644 --- a/lib/libc/gen/pw_scan.c +++ b/lib/libc/gen/pw_scan.c @@ -47,6 +47,7 @@ static const char rcsid[] = #include #include +#include #include #include #include @@ -72,7 +73,7 @@ pw_scan(bp, pw) char *bp; struct passwd *pw; { - long id; + uid_t id; int root; char *p, *sh; @@ -100,13 +101,17 @@ pw_scan(bp, pw) return (0); } } - id = atol(p); + id = strtoul(p, (char **)NULL, 10); + if (errno == ERANGE) { + warnx("%s > max uid value (%u)", p, ULONG_MAX); + return (0); + } if (root && id) { warnx("root uid should be 0"); return (0); } if (pw_big_ids_warning && id > USHRT_MAX) { - warnx("%s > max uid value (%u)", p, USHRT_MAX); + warnx("%s > recommended max uid value (%u)", p, USHRT_MAX); /*return (0);*/ /* THIS SHOULD NOT BE FATAL! */ } pw->pw_uid = id; @@ -114,9 +119,13 @@ pw_scan(bp, pw) if (!(p = strsep(&bp, ":"))) /* gid */ goto fmt; if(p[0]) pw->pw_fields |= _PWF_GID; - id = atol(p); + id = strtoul(p, (char **)NULL, 10); + if (errno == ERANGE) { + warnx("%s > max gid value (%u)", p, ULONG_MAX); + return (0); + } if (pw_big_ids_warning && id > USHRT_MAX) { - warnx("%s > max gid value (%u)", p, USHRT_MAX); + warnx("%s > recommended max gid value (%u)", p, USHRT_MAX); /* return (0); This should not be fatal! */ } pw->pw_gid = id; diff --git a/usr.sbin/pwd_mkdb/pw_scan.c b/usr.sbin/pwd_mkdb/pw_scan.c index 849effab45d9..d0fb5f17d035 100644 --- a/usr.sbin/pwd_mkdb/pw_scan.c +++ b/usr.sbin/pwd_mkdb/pw_scan.c @@ -47,6 +47,7 @@ static const char rcsid[] = #include #include +#include #include #include #include @@ -72,7 +73,7 @@ pw_scan(bp, pw) char *bp; struct passwd *pw; { - long id; + uid_t id; int root; char *p, *sh; @@ -100,13 +101,17 @@ pw_scan(bp, pw) return (0); } } - id = atol(p); + id = strtoul(p, (char **)NULL, 10); + if (errno == ERANGE) { + warnx("%s > max uid value (%u)", p, ULONG_MAX); + return (0); + } if (root && id) { warnx("root uid should be 0"); return (0); } if (pw_big_ids_warning && id > USHRT_MAX) { - warnx("%s > max uid value (%u)", p, USHRT_MAX); + warnx("%s > recommended max uid value (%u)", p, USHRT_MAX); /*return (0);*/ /* THIS SHOULD NOT BE FATAL! */ } pw->pw_uid = id; @@ -114,9 +119,13 @@ pw_scan(bp, pw) if (!(p = strsep(&bp, ":"))) /* gid */ goto fmt; if(p[0]) pw->pw_fields |= _PWF_GID; - id = atol(p); + id = strtoul(p, (char **)NULL, 10); + if (errno == ERANGE) { + warnx("%s > max gid value (%u)", p, ULONG_MAX); + return (0); + } if (pw_big_ids_warning && id > USHRT_MAX) { - warnx("%s > max gid value (%u)", p, USHRT_MAX); + warnx("%s > recommended max gid value (%u)", p, USHRT_MAX); /* return (0); This should not be fatal! */ } pw->pw_gid = id; diff --git a/usr.sbin/pwd_mkdb/pwd_mkdb.c b/usr.sbin/pwd_mkdb/pwd_mkdb.c index 5ee9699d57b1..9d77b279e507 100644 --- a/usr.sbin/pwd_mkdb/pwd_mkdb.c +++ b/usr.sbin/pwd_mkdb/pwd_mkdb.c @@ -320,9 +320,9 @@ main(argc, argv) p = buf; COMPACT(pwd.pw_name); COMPACT("*"); - memmove(p, &pwd.pw_uid, sizeof(int)); + memmove(p, &pwd.pw_uid, sizeof(pwd.pw_uid)); p += sizeof(int); - memmove(p, &pwd.pw_gid, sizeof(int)); + memmove(p, &pwd.pw_gid, sizeof(pwd.pw_gid)); p += sizeof(int); memmove(p, &pwd.pw_change, sizeof(time_t)); p += sizeof(time_t); @@ -340,9 +340,9 @@ main(argc, argv) p = sbuf; COMPACT(pwd.pw_name); COMPACT(pwd.pw_passwd); - memmove(p, &pwd.pw_uid, sizeof(int)); + memmove(p, &pwd.pw_uid, sizeof(pwd.pw_uid)); p += sizeof(int); - memmove(p, &pwd.pw_gid, sizeof(int)); + memmove(p, &pwd.pw_gid, sizeof(pwd.pw_gid)); p += sizeof(int); memmove(p, &pwd.pw_change, sizeof(time_t)); p += sizeof(time_t); @@ -420,8 +420,8 @@ main(argc, argv) char uidstr[20]; char gidstr[20]; - snprintf(uidstr, sizeof(uidstr), "%d", pwd.pw_uid); - snprintf(gidstr, sizeof(gidstr), "%d", pwd.pw_gid); + snprintf(uidstr, sizeof(uidstr), "%u", pwd.pw_uid); + snprintf(gidstr, sizeof(gidstr), "%u", pwd.pw_gid); if (fprintf(oldfp, "%s:*:%s:%s:%s:%s:%s\n", pwd.pw_name, pwd.pw_fields & _PWF_UID ? uidstr : "",