Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250408222526.GA2724612@port70.net>
Date: Wed, 9 Apr 2025 00:25:26 +0200
From: Szabolcs Nagy <nsz@...t70.net>
To: Lénárd Szolnoki <cpp@...ardszolnoki.com>
Cc: musl@...ts.openwall.com
Subject: Re: strtod doesn't set errno to ERANGE for slightly
 out-of-range hex float

* Lénárd Szolnoki <cpp@...ardszolnoki.com> [2025-03-24 10:55:36 +0000]:
> Hi,
> 
> #include <stdlib.h>
> #include <assert.h>
> #include <errno.h>
> 
> int main() {
>   const char* const input = "0x1.fffffffffffff8p+1023";
>   double ret = strtod(input, NULL);
>   assert(errno == ERANGE);
> }
> 
> The input is slightly out of range, DBL_MAX is 1.fffffffffffffp+1023 (one
> fewer binary 1 in the mantissa).
> 
> The assert fails with musl libc, passes with glibc.

this looks valid (might depend on long double
representation).

the overflow threshold is not calculated precisely
for the hexfloat case. __floatscan returns an in
range long double value that is rounded to inf by
strtod, but there is no overflow check there.

i guess hexfloat overflow check should be fixed.

> 
> musl version: 1.2.5 (as shipped in Debian sid)
> 
> Regards,
> Lénárd Szolnoki

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.