On 7/11/14, 2:34 PM, Arkadiusz Miśkiewicz wrote: > cvtnum() and cvttime() silently ignore overflows. This leads to error > conditions not being catched. Example: > > $ xfs_quota -x -c 'limit -u bsoft=987654321098765432199 \ > bhard=987654321098765432199 999' / > $ > > Fixed version: > $ xfs_quota -x -c 'limit -u bsoft=987654321098765432199 \ > bhard=987654321098765432199 999' / > xfs_quota: Error: could not parse size 987654321098765432199. > xfs_quota: unrecognised argument bsoft=987654321098765432199 So, strtol(3) suggests setting errno to 0 before the call: NOTES Since strtol() can legitimately return 0, LONG_MAX, or LONG_MIN (LLONG_MAX or LLONG_MIN for strtoll()) on both success and failure, the calling program should set errno to 0 before the call, and then deter- mine if an error occurred by checking whether errno has a non-zero value after the call. Ditto for strtoul(). I guess that is just to ensure that there's not a leftover errno when we make the call? Worth doing, maybe? Thanks, -Eric > Signed-off-by: Arkadiusz Miśkiewicz <arekm@xxxxxxxx> > --- > libxcmd/input.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/libxcmd/input.c b/libxcmd/input.c > index c06b5b8..397a124 100644 > --- a/libxcmd/input.c > +++ b/libxcmd/input.c > @@ -154,6 +154,8 @@ cvtnum( > int c; > > i = strtoll(s, &sp, 0); > + if ((i == LLONG_MIN || i == LLONG_MAX) && errno == ERANGE) > + return -1LL; > if (i == 0 && sp == s) > return -1LL; > if (*sp == '\0') > @@ -238,6 +240,8 @@ cvttime( > char *sp; > > i = strtoul(s, &sp, 0); > + if (i == ULONG_MAX && errno == ERANGE) > + return 0; > if (i == 0 && sp == s) > return 0; > if (*sp == '\0') > _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs