]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Fix uninitialized data in std::basic_spanbuf::seekoff
authorJonathan Wakely <jwakely@redhat.com>
Fri, 13 Dec 2024 10:54:29 +0000 (10:54 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 13 Dec 2024 13:06:12 +0000 (13:06 +0000)
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.

libstdc++-v3/include/std/spanstream

index 98ad3fa856a78ef63bf17bf950ee106954a57135..23a340a746e886b5923e3e67c6159e63b04db7b7 100644 (file)
@@ -168,7 +168,7 @@ template<typename _CharT, typename _Traits>
        }
       else
        {
-         off_type __base;
+         off_type __base{};
          __which &= (ios_base::in|ios_base::out);
 
          if (__which == ios_base::out)
@@ -182,11 +182,13 @@ template<typename _CharT, typename _Traits>
            }
          else if (__way == ios_base::end)
            __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;
 
-         if (__off < 0 || __off > _M_buf.size())
+         if (__off < 0 || __off > _M_buf.size()) [[unlikely]]
            return __ret;
 
          if (__which & ios_base::in)