On Wed, Jul 29, 2015 at 08:52:52AM +1000, Bruce Evans wrote: > On Tue, 28 Jul 2015, Baptiste Daroussin wrote: > > > Log: > > Check uid/gid used when creating a user/group are not larger than > > UID_MAX/GID_MAX > > > > PR: 173977 > > Reported by: nv...@gmx.com > > This is broken in a different way than before. > > > Modified: head/usr.sbin/pw/pw.c > > ============================================================================== > > --- head/usr.sbin/pw/pw.c Tue Jul 28 20:52:10 2015 (r285984) > > +++ head/usr.sbin/pw/pw.c Tue Jul 28 21:10:58 2015 (r285985) > > @@ -269,7 +269,7 @@ main(int argc, char *argv[]) > > } > > if (strspn(optarg, "0123456789") != strlen(optarg)) > > errx(EX_USAGE, "-g expects a number"); > > - id = strtonum(optarg, 0, LONG_MAX, &errstr); > > + id = strtonum(optarg, 0, GID_MAX, &errstr); > > `id' still has type long. The assignment overflows on 32-bit arches when > the value exceeds 0x7fffffff. That is for half of all valid values. pw > is broken in not supporting these values, but at least it detected them > as errors in the previous version. Old versions implemented this bug > using atoi() with no error checking.
So writting a function like strtonum like function with that prototype intmax_t strtonumber(const char *, intmax_t min, intmax_t max, const char **); and an unsigned equivalent uintmax_t strtonumber(const char *, uintmax_t min, uintmax_t max, const char **); would do the right thing? Best regards, Bapt
pgpdO6XSSrNhj.pgp
Description: PGP signature