aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Dreik <gccpatches@pauldreik.se>2023-08-24 11:43:43 +0100
committerJonathan Wakely <jwakely@redhat.com>2023-08-24 13:44:38 +0100
commitdd4bdb9eea436bf06f175d8dbfc2190377455be4 (patch)
treed5ef7fffbfe16fe365849a03e15940be0aa825c4
parentd6271d600d5a181b37093c8984990806a743f16a (diff)
downloadgcc-dd4bdb9eea436bf06f175d8dbfc2190377455be4.zip
gcc-dd4bdb9eea436bf06f175d8dbfc2190377455be4.tar.gz
gcc-dd4bdb9eea436bf06f175d8dbfc2190377455be4.tar.bz2
libstdc++: fix illegal pointer arithmetic in format [PR111102]
When parsing a format string, the width is parsed into an unsigned short but the result is not checked in the case the format string is not a char string (such as a wide string). In case the parse fails, a null pointer is returned which is used for pointer arithmetic which is undefined behaviour. Signed-off-by: Paul Dreik <gccpatches@pauldreik.se> libstdc++-v3/ChangeLog: PR libstdc++/111102 * include/std/format (__format::__parse_integer): Check for non-null pointer.
-rw-r--r--libstdc++-v3/include/std/format3
1 files changed, 2 insertions, 1 deletions
diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format
index f3d9ae1..fe2caa5 100644
--- a/libstdc++-v3/include/std/format
+++ b/libstdc++-v3/include/std/format
@@ -285,7 +285,8 @@ namespace __format
for (int __i = 0; __i < __n && (__first + __i) != __last; ++__i)
__buf[__i] = __first[__i];
auto [__v, __ptr] = __format::__parse_integer(__buf, __buf + __n);
- return {__v, __first + (__ptr - __buf)};
+ if (__ptr) [[likely]]
+ return {__v, __first + (__ptr - __buf)};
}
return {0, nullptr};
}