aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2022-01-05 16:25:47 +0000
committerJonathan Wakely <jwakely@redhat.com>2022-01-06 14:56:12 +0000
commitc83ecfbe74a5cf107642b9c5e1680b548ff1a0e1 (patch)
treeeea29434abec921fcbfba59696757331bc9bf47f
parentdb33b1059bcee3eeb36d174d59abf19f2bef5d66 (diff)
downloadgcc-c83ecfbe74a5cf107642b9c5e1680b548ff1a0e1.zip
gcc-c83ecfbe74a5cf107642b9c5e1680b548ff1a0e1.tar.gz
gcc-c83ecfbe74a5cf107642b9c5e1680b548ff1a0e1.tar.bz2
libstdc++: Do not use std::isdigit in <charconv> [PR103911]
This avoids a potential race condition if std::setlocale is used concurrently with std::from_chars. libstdc++-v3/ChangeLog: PR libstdc++/103911 * include/std/charconv (__from_chars_alpha_to_num): Return char instead of unsigned char. Change invalid return value to 127 instead of using numeric trait. (__from_chars_alnum): Fix comment. Do not use std::isdigit. Change type of variable to char.
-rw-r--r--libstdc++-v3/include/std/charconv11
1 files changed, 5 insertions, 6 deletions
diff --git a/libstdc++-v3/include/std/charconv b/libstdc++-v3/include/std/charconv
index 4337a9e..a3f8c77 100644
--- a/libstdc++-v3/include/std/charconv
+++ b/libstdc++-v3/include/std/charconv
@@ -39,7 +39,6 @@
#include <type_traits>
#include <bit> // for __bit_width
-#include <cctype> // for isdigit
#include <bits/charconv.h> // for __to_chars_len, __to_chars_10_impl
#include <bits/error_constants.h> // for std::errc
#include <ext/numeric_traits.h>
@@ -466,7 +465,7 @@ namespace __detail
return true;
}
- constexpr unsigned char
+ constexpr char
__from_chars_alpha_to_num(char __c)
{
switch (__c)
@@ -550,10 +549,10 @@ namespace __detail
case 'Z':
return 35;
}
- return __gnu_cxx::__int_traits<unsigned char>::__max;
+ return 127;
}
- /// std::from_chars implementation for integers in bases 11 to 26.
+ /// std::from_chars implementation for integers in bases 11 to 36.
template<typename _Tp>
bool
__from_chars_alnum(const char*& __first, const char* __last, _Tp& __val,
@@ -562,8 +561,8 @@ namespace __detail
bool __valid = true;
while (__first != __last)
{
- unsigned char __c = *__first;
- if (std::isdigit(__c))
+ char __c = *__first;
+ if ('0' <= __c && __c <= '9') // isdigit
__c -= '0';
else
{