Date: Fri, 16 Nov 2012 22:38:30 +1100 (EST) From: Bruce Evans <brde@optusnet.com.au> To: Konstantin Belousov <kostikbel@gmail.com> Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, Eitan Adler <eadler@freebsd.org>, Bruce Evans <brde@optusnet.com.au> Subject: Re: svn commit: r243076 - head/usr.sbin/chkgrp Message-ID: <20121116220347.S1856@besplex.bde.org> In-Reply-To: <20121115185958.GG73505@kib.kiev.ua> References: <201211151506.qAFF63v0003848@svn.freebsd.org> <20121115153030.GD73505@kib.kiev.ua> <CAF6rxgk9w0_Qwo=92g-OSe5imvupG8qg7DzpCS9UVxzwMjn20g@mail.gmail.com> <20121116032851.I44199@besplex.bde.org> <CAF6rxgkvh_QEw5o3-8rznkEQMvQHY=ngYVM-7HQ11jHwX2vZ=w@mail.gmail.com> <20121115185958.GG73505@kib.kiev.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 15 Nov 2012, Konstantin Belousov wrote:
> On Thu, Nov 15, 2012 at 01:52:46PM -0500, Eitan Adler wrote:
>> On 15 November 2012 11:52, Bruce Evans <brde@optusnet.com.au> wrote:
>>> strtoul("1garbage", NULL, 10) succeeds and returns value 1, but the input
>>> is garbage.
>>
>> This case is covered earlier
>> 160         /* check that the GID is numeric */
>> 161         if (strspn(f[2], "0123456789") != strlen(f[2])) {
>> 162             warnx("%s: line %d: GID is not numeric", gfn, n);
> So this code shall be removed, if you are introducing strtoul() to check
> for errors at all.
It is indeed strange to mix methods like this, and the check is more
strict that usual since it doesn't allow leading spaces.  I think leading
spaces are normally allowed for numeric args.  This normally happens
automatically, via bad programs using atoi() and better programs using
strto*().  Extra work like the above has to be done to reject leading
spaces.
>>> As the man page says, the EINVAL feature is unportable.  It is almost
>>> useless, since to detect garbage after the number you have to pass an
>>> endptr to strtoul(), and then the check for no conversion (that is,
>>> for garbage at the beginning) is just as easy as the check for garbage
>>> at the end.
>>
>> This patch doesn't care about EINVAL or ERANGE. It just cares strtoul
>> returned an error.
The only possible error for strtol() on a string of digits is ERANGE.
>> I even considered just ignoring the error case because the data is
>> mostly sanity checked prior.
The prior checking doesn't detect range errors.
The later checking detects range errors on 64-bit systems but not on 32-bit
ones, since strtoul() returns ULONG_MAX for range errors and that is a
valid gid (GID_MAX) on 32-bit systems.
Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20121116220347.S1856>
