Date: Tue, 13 May 1997 02:15:23 +1000 From: Bruce Evans <bde@zeta.org.au> To: wollman@khavrinen.lcs.mit.edu, wosch@apfel.de Cc: freebsd-security@FreeBSD.ORG, qwe@ht.eimb.rssi.ru Subject: Re: Linux UID/GID 'Feature' Message-ID: <199705121615.CAA16319@godzilla.zeta.org.au>
index | next in thread | raw e-mail
>> id = atol(p);
>> + for(; *p != '\0'; p++)
>> + if (!isdigit(*p))
>> + goto fmt;
>> +
>
>This is why you should never use atol(). Always, always, always use
>strtol(), and then you won't have these problems. Properly written to
>use strtol:
> errno = 0;
> ltmp = strtol(p, &ep, 10);
> if (*ep != '\0' || ltmp > MAX_UID_VALUE || ltmp < MIN_UID_VALUE
> || errno != 0) {
> do_error_action();
> }
> id = ltmp;
MAX_UID_VALUE is 0xffffffff, so it can only be read using strtol() on
systems with more than 32 bits in an int. This is why you should rarely
use strtol() :-). Always use strtoul() or strtouq() to read unsigned
values. These functions are often more convenient even for reading
possibly-signed values.
Another problem: isdigit(*p) is usually undefined if *p < 0.
>> if (id > USHRT_MAX) {
>> warnx("%s > max gid value (%d)", p, USHRT_MAX);
>> /* return (0); This should not be fatal! */
>
>This is really evil. The pw_mkdb program should not have built into
>it the identity of the type which is u/gid_t. Rather, the constants I
>mentioned above should be carefully defined somewhere (probably in
><pwd.h> under the non-POSIX section).
Well, it needs to know something about the type, or depend on the
constants being representable by the type returned by the strto*
function used. This is difficult to program POSIX-portably, since
uid_t might be long double.
Bruce
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199705121615.CAA16319>
