From c11497ab8117f27680537abccda211c5be560452 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Thu, 16 Mar 2023 15:25:45 +0100 Subject: [PATCH] C2x strtol binary constant handling: Fix special case "0b". This is a follow-up to commit 64924422a99690d147a166b4de3103f3bf3eaf6c by Joseph Myers. The special case of input "0b" was not handled correctly. Test cases: { const char input[] = "0b"; char *ptr; long result; errno = 0; result = strtol (input, &ptr, 2); assert (result == 0L); assert (ptr == input + 1); assert (errno == 0); } { const char input[] = "0b"; char *ptr; long result; errno = 0; result = strtol (input, &ptr, 0); assert (result == 0L); assert (ptr == input + 1); assert (errno == 0); } * stdlib/strtol_l.c (INTERNAL (__strtol_l)): Handle the binary integers also in the 'noconv' part of the code. --- stdlib/strtol_l.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/stdlib/strtol_l.c b/stdlib/strtol_l.c index 3424c3feab..548b46aa52 100644 --- a/stdlib/strtol_l.c +++ b/stdlib/strtol_l.c @@ -526,11 +526,15 @@ INTERNAL (__strtol_l) (const STRING_TYPE *nptr, STRING_TYPE **endptr, noconv: /* We must handle a special case here: the base is 0 or 16 and the first two characters are '0' and 'x', but the rest are no - hexadecimal digits. This is no error case. We return 0 and - ENDPTR points to the `x`. */ + hexadecimal digits. Likewise when the base is 0 or 2 and the + first two characters are '0' and 'b', but the rest are no binary + digits. This is no error case. We return 0 and ENDPTR points to + the 'x' or 'b'. */ if (endptr != NULL) { - if (save - nptr >= 2 && TOUPPER (save[-1]) == L_('X') + if (save - nptr >= 2 + && (TOUPPER (save[-1]) == L_('X') + || (bin_cst && TOUPPER (save[-1]) == L_('B'))) && save[-2] == L_('0')) *endptr = (STRING_TYPE *) &save[-1]; else -- 2.34.1