Skip to content
Snippets Groups Projects
Unverified Commit 959a80a4 authored by Jonathan Wakely's avatar Jonathan Wakely Committed by Jonathan Wakely
Browse files

libstdc++: Fix uninitialized data in std::basic_spanbuf::seekoff

I noticed a -Wmaybe-uninitialized warning for this function, which turns
out to be correct. If the caller passes a valid std::ios_base::seekdir
value then there's no problem, but if they pass std::seekdir(999) then
we don't initialize the __base variable before adding it to __off.

Rather than initialize it to an arbitrary value, we should return an
error.

Also add [[unlikely]] attributes to the paths that return an error.

libstdc++-v3/ChangeLog:

	* include/std/spanstream (basic_spanbuf::seekoff): Return an
	error for invalid seekdir values.
parent 233860f0
No related branches found
No related tags found
No related merge requests found
...@@ -168,7 +168,7 @@ template<typename _CharT, typename _Traits> ...@@ -168,7 +168,7 @@ template<typename _CharT, typename _Traits>
} }
else else
{ {
off_type __base; off_type __base{};
__which &= (ios_base::in|ios_base::out); __which &= (ios_base::in|ios_base::out);
if (__which == ios_base::out) if (__which == ios_base::out)
...@@ -182,11 +182,13 @@ template<typename _CharT, typename _Traits> ...@@ -182,11 +182,13 @@ template<typename _CharT, typename _Traits>
} }
else if (__way == ios_base::end) else if (__way == ios_base::end)
__base = _M_buf.size(); __base = _M_buf.size();
else /* way is not ios::beg, ios::cur, or ios::end */ [[unlikely]]
return __ret;
if (__builtin_add_overflow(__base, __off, &__off)) if (__builtin_add_overflow(__base, __off, &__off)) [[unlikely]]
return __ret; return __ret;
if (__off < 0 || __off > _M_buf.size()) if (__off < 0 || __off > _M_buf.size()) [[unlikely]]
return __ret; return __ret;
if (__which & ios_base::in) if (__which & ios_base::in)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment