On Wed, Aug 21, 2013 at 11:03:10PM +0400, Sergey Kandaurov wrote: > On Wed, Aug 21, 2013 at 09:21:47PM +0400, Andrey Chernov wrote: > > On 21.08.2013 20:46, Sergey Kandaurov wrote: > > > number = strtoumax(buf, &endptr, 0); > > > > > > + if (number == UINTMAX_MAX && errno == ERANGE) { > > > + return (-1); > > > + }
> > You need to reset errno before strtoumax() call (errno = 0), because any > > of previous functions may left it as ERANGE. > Thanks for pointing out. > Does the patch look good? > Index: expand_number.c > =================================================================== > --- expand_number.c (revision 254600) > +++ expand_number.c (working copy) > @@ -53,6 +53,8 @@ > unsigned shift; > char *endptr; > > + errno = 0; > + > number = strtoumax(buf, &endptr, 0); > > if (number == UINTMAX_MAX && errno == ERANGE) { > This may cause the function to set errno=0 if it is successful, which is not allowed for standard library functions from C and POSIX. There may be a problem not only if expand_number() is standardized but also if it is used in the implementation of a standard library function. The best solution is to save and restore errno around this (if [ERANGE] is detected, that is a valid errno value to keep). In an application it is acceptable to set errno=0 without further ado. -- Jilles Tjoelker _______________________________________________ svn-src-head@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"