[PATCH resend] webservices: Use sscanf to convert strings to doubles.

Erich E. Hoover erich.e.hoover at gmail.com
Mon Jan 6 10:35:11 CST 2020


On Mon, Jan 6, 2020 at 3:52 AM Hans Leidekker <hans at codeweavers.com> wrote:
> On Fri, 2020-01-03 at 17:08 -0700, Erich E. Hoover wrote:
> > ...
> > +            ret = 0;
> > ...
>
> 'ret' is a pointer.

Ack, sorry about that - supposed to be setting the value.

> > ...
> > +    for (i = 0; i < len; i++)
> >      {
> > -        if (exp & 1) exp_val *= exp_mul;
> > -        exp_mul *= exp_mul;
> > +        if (p[i] >= '0' && p[i] <= '9') continue;
> > +        if (p[i] != 'e' && p[i] != 'E' && p[i] != '.' && p[i] != '+' && p[i] != '-')
> > +            return WS_E_INVALID_FORMAT;
> >      }
>
> Is this part really necessary?

Technically sscanf supports more than what the reader does, but it
does pass all the current tests without this check.  For example,
scanf supports the Fortran-style "d" exponent notation (for msvcr <
140).  If you would like I can fold the +/-/. weirdness into this,
which does have tests, possibly something like:
===
    for (i = 0; i < len; i++)
    {
        if (p[i] >= '0' && p[i] <= '9')
        {
            found_digit = TRUE;
            continue;
        }
        if (p[i] != 'e' && p[i] != 'E' && p[i] != '.' && p[i] != '+'
&& p[i] != '-')
            return WS_E_INVALID_FORMAT;
    }
    if (!found_digit)
    {
        *ret = 0;
        return S_OK;
    }
===

> I also get new failures with a non-mingw build:
> ...
> Looks like scanf returns a different result for %n in this case. It probably
> shouldn't block this patch though.

That's interesting, if you like I could move the length check into the
format checker so that it does not rely on scanf for that to work
properly.

Best,
Erich



More information about the wine-devel mailing list