[PATCH] [Msvcrt]: fixing errno handling in strtol and strtoul (#18151)
David Laight
david at l8s.co.uk
Mon Aug 31 10:57:27 CDT 2009
On Mon, Aug 31, 2009 at 12:03:11PM +0200, Alexandre Julliard wrote:
> Eric Pouech <eric.pouech at orange.fr> writes:
>
> > @@ -250,3 +250,25 @@ int CDECL __STRINGTOLD( MSVCRT__LDOUBLE *value, char **endptr, const char *str,
> > #endif
> > return 0;
> > }
> > +
> > +/******************************************************************
> > + * strtol (MSVCRT.@)
> > + */
> > +long int MSVCRT_strtol(const char* nptr, char** end, int base)
> > +{
> > + /* wrapper to forward libc error code to msvcrt's error codes */
> > + long ret = strtol(nptr, end, base);
> > + msvcrt_set_unix_errno();
> > + return ret;
> > +}
>
> You can't simply use long here, you need to handle the difference in the
> size of long between Win32 and Unix.
You also need to an 'errno = 0' before the strtol() call.
strtol() will only change errno if there is a numeric overflow.
In the overflow cases the return value will be LONG_MIN or LONG_MAX and
errno is set to ERANGE. No other errno values should appear.
I thought that the only 'size' difference is that 64bit windows has a
32bit long ?
So values outside 32bits need truncating and ERANGE set ??
David
--
David Laight: david at l8s.co.uk
More information about the wine-devel
mailing list