Calculating the size of a chunk being returned to the upstream allocator
was done with a 32-bit type, so it wrapped if the chunk was 4GB or
larger.

I don't know how to test this without allocating 4GB, so there's no test
in the testsuite. It has been tested manually with allocations sizes and
alignments exceeding 4GB.

        PR libstdc++/94906
        * src/c++17/memory_resource.cc
        (monotonic_buffer_resource::_Chunk::release): Use size_t for shift
        operands.

Tested powerpc64le-linux, committed to master.

Backports to follow after 10.1 is released.


commit bb27781b64162e1769df15e0c97e8d2145d2d10d
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Mon May 4 21:13:28 2020 +0100

    libstdc++: Fix incorrect size calculation in PMR resource  (PR 94906)
    
    Calculating the size of a chunk being returned to the upstream allocator
    was done with a 32-bit type, so it wrapped if the chunk was 4GB or
    larger.
    
    I don't know how to test this without allocating 4GB, so there's no test
    in the testsuite. It has been tested manually with allocations sizes and
    alignments exceeding 4GB.
    
            PR libstdc++/94906
            * src/c++17/memory_resource.cc
            (monotonic_buffer_resource::_Chunk::release): Use size_t for shift
            operands.

diff --git a/libstdc++-v3/src/c++17/memory_resource.cc 
b/libstdc++-v3/src/c++17/memory_resource.cc
index 1acab19e306..95352b23537 100644
--- a/libstdc++-v3/src/c++17/memory_resource.cc
+++ b/libstdc++-v3/src/c++17/memory_resource.cc
@@ -228,8 +228,8 @@ namespace pmr
          if (__ch->_M_canary != (__ch->_M_size | __ch->_M_align))
            return; // buffer overflow detected!
 
-         size_t __size = (1u << __ch->_M_size);
-         size_t __align = (1u << __ch->_M_align);
+         size_t __size = (size_t)1 << __ch->_M_size;
+         size_t __align = (size_t)1 << __ch->_M_align;
          void* __start = (char*)(__ch + 1) - __size;
          __r->deallocate(__start, __size, __align);
        }

Reply via email to