[libcxx-commits] [libcxx] [libc++] Fix wraparound issue with -fsanitize=integer in string operator>> (PR #106263)
via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Aug 27 11:17:46 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libcxx
Author: Louis Dionne (ldionne)
<details>
<summary>Changes</summary>
Fixes #<!-- -->106261
rdar://133991190
---
Full diff: https://github.com/llvm/llvm-project/pull/106263.diff
1 Files Affected:
- (modified) libcxx/include/istream (+6-6)
``````````diff
diff --git a/libcxx/include/istream b/libcxx/include/istream
index d2b577a9ad9efc..84cb0ac9d9f252 100644
--- a/libcxx/include/istream
+++ b/libcxx/include/istream
@@ -1211,12 +1211,12 @@ operator>>(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _
try {
#endif
__str.clear();
- streamsize __n = __is.width();
- if (__n <= 0)
- __n = __str.max_size();
- if (__n <= 0)
- __n = numeric_limits<streamsize>::max();
- streamsize __c = 0;
+ using _Size = typename basic_string<_CharT, _Traits, _Allocator>::size_type;
+ static_assert(numeric_limits<_Size>::max() >= numeric_limits<streamsize>::max(),
+ "Stream width could be too large to be represented in the string's size_type");
+ streamsize const __width = __is.width();
+ _Size const __n = __width <= 0 ? __str.max_size() : static_cast<_Size>(__width);
+ _Size __c = 0;
const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc());
while (__c < __n) {
typename _Traits::int_type __i = __is.rdbuf()->sgetc();
``````````
</details>
https://github.com/llvm/llvm-project/pull/106263
More information about the libcxx-commits
mailing list