diff --git a/lib/libc/gen/pw_scan.c b/lib/libc/gen/pw_scan.c index 0ce9b1d6b19a..a24380f60814 100644 --- a/lib/libc/gen/pw_scan.c +++ b/lib/libc/gen/pw_scan.c @@ -56,6 +56,13 @@ static const char rcsid[] = #include "pw_scan.h" +/* + * Some software assumes that IDs are short. We should emit warnings + * for id's which can not be stored in a short, but we are more liberal + * by default, warning for IDs greater than USHRT_MAX. + */ +int pw_big_ids_warning = 1; + int pw_scan(bp, pw) char *bp; @@ -89,8 +96,8 @@ pw_scan(bp, pw) warnx("root uid should be 0"); return (0); } - if (id > USHRT_MAX) { - warnx("%s > max uid value (%d)", p, USHRT_MAX); + if (pw_big_ids_warning && id > USHRT_MAX) { + warnx("%s > max uid value (%u)", p, USHRT_MAX); /*return (0);*/ /* THIS SHOULD NOT BE FATAL! */ } pw->pw_uid = id; @@ -99,8 +106,8 @@ pw_scan(bp, pw) goto fmt; if(p[0]) pw->pw_fields |= _PWF_GID; id = atol(p); - if (id > USHRT_MAX) { - warnx("%s > max gid value (%d)", p, USHRT_MAX); + if (pw_big_ids_warning && id > USHRT_MAX) { + warnx("%s > max gid value (%u)", p, USHRT_MAX); /* return (0); This should not be fatal! */ } pw->pw_gid = id; diff --git a/lib/libc/gen/pw_scan.h b/lib/libc/gen/pw_scan.h index d1d4bc1ef631..2519bd45db01 100644 --- a/lib/libc/gen/pw_scan.h +++ b/lib/libc/gen/pw_scan.h @@ -31,6 +31,10 @@ * SUCH DAMAGE. * * @(#)pw_scan.h 8.1 (Berkeley) 4/1/94 + * + * $FreeBSD$ */ +extern int pw_big_ids_warning; + extern int pw_scan __P((char *, struct passwd *)); diff --git a/usr.sbin/pwd_mkdb/pw_scan.c b/usr.sbin/pwd_mkdb/pw_scan.c index 0ce9b1d6b19a..a24380f60814 100644 --- a/usr.sbin/pwd_mkdb/pw_scan.c +++ b/usr.sbin/pwd_mkdb/pw_scan.c @@ -56,6 +56,13 @@ static const char rcsid[] = #include "pw_scan.h" +/* + * Some software assumes that IDs are short. We should emit warnings + * for id's which can not be stored in a short, but we are more liberal + * by default, warning for IDs greater than USHRT_MAX. + */ +int pw_big_ids_warning = 1; + int pw_scan(bp, pw) char *bp; @@ -89,8 +96,8 @@ pw_scan(bp, pw) warnx("root uid should be 0"); return (0); } - if (id > USHRT_MAX) { - warnx("%s > max uid value (%d)", p, USHRT_MAX); + if (pw_big_ids_warning && id > USHRT_MAX) { + warnx("%s > max uid value (%u)", p, USHRT_MAX); /*return (0);*/ /* THIS SHOULD NOT BE FATAL! */ } pw->pw_uid = id; @@ -99,8 +106,8 @@ pw_scan(bp, pw) goto fmt; if(p[0]) pw->pw_fields |= _PWF_GID; id = atol(p); - if (id > USHRT_MAX) { - warnx("%s > max gid value (%d)", p, USHRT_MAX); + if (pw_big_ids_warning && id > USHRT_MAX) { + warnx("%s > 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.h b/usr.sbin/pwd_mkdb/pw_scan.h index d1d4bc1ef631..2519bd45db01 100644 --- a/usr.sbin/pwd_mkdb/pw_scan.h +++ b/usr.sbin/pwd_mkdb/pw_scan.h @@ -31,6 +31,10 @@ * SUCH DAMAGE. * * @(#)pw_scan.h 8.1 (Berkeley) 4/1/94 + * + * $FreeBSD$ */ +extern int pw_big_ids_warning; + extern int pw_scan __P((char *, struct passwd *)); diff --git a/usr.sbin/pwd_mkdb/pwd_mkdb.8 b/usr.sbin/pwd_mkdb/pwd_mkdb.8 index 32233538cef7..1e52b08fc349 100644 --- a/usr.sbin/pwd_mkdb/pwd_mkdb.8 +++ b/usr.sbin/pwd_mkdb/pwd_mkdb.8 @@ -43,6 +43,7 @@ .Op Fl C .Op Fl N .Op Fl p +.Op Fl q .Op Fl d Ar directory .Op Fl s Ar cachesize .Op Fl u Ar username @@ -78,6 +79,12 @@ the rebuilding of the database. .It Fl p Create a Version 7 style password file and install it into .Pa /etc/passwd . +.It Fl q +Suppress the warnings that +.Nm +normally generates for large user and group IDs. +Such IDs can cause serious problems with software +that makes assumptions about the values of IDs. .It Fl d Ar directory Store databases into specified destination directory instead of .Pa /etc . diff --git a/usr.sbin/pwd_mkdb/pwd_mkdb.c b/usr.sbin/pwd_mkdb/pwd_mkdb.c index 5ee9699d57b1..ef57dc2ee051 100644 --- a/usr.sbin/pwd_mkdb/pwd_mkdb.c +++ b/usr.sbin/pwd_mkdb/pwd_mkdb.c @@ -115,7 +115,7 @@ main(argc, argv) strcpy(prefix, _PATH_PWD); makeold = 0; username = NULL; - while ((ch = getopt(argc, argv, "Cd:ps:u:vN")) != -1) + while ((ch = getopt(argc, argv, "Cd:pqs:u:vN")) != -1) switch(ch) { case 'C': /* verify only */ Cflag = 1; @@ -126,6 +126,9 @@ main(argc, argv) case 'p': /* create V7 "file.orig" */ makeold = 1; break; + case 'q': + pw_big_ids_warning = 0; + break; case 's': /* change default cachesize */ openinfo.cachesize = atoi(optarg) * 1024 * 1024; break;