mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 03:47:02 -05:00
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 of course. Backport from mainline 2020-05-04 Jonathan Wakely <jwakely@redhat.com> PR libstdc++/94906 * src/c++17/memory_resource.cc (monotonic_buffer_resource::_Chunk::release): Use size_t for shift operands.
This commit is contained in:
@@ -1,3 +1,13 @@
|
||||
2020-05-12 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
Backport from mainline
|
||||
2020-05-04 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
PR libstdc++/94906
|
||||
* src/c++17/memory_resource.cc
|
||||
(monotonic_buffer_resource::_Chunk::release): Use size_t for shift
|
||||
operands.
|
||||
|
||||
2020-05-07 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* config/abi/post/sparc64-linux-gnu/baseline_symbols.txt: Update.
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user