Commit dc103060 by Jonathan Wakely

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.
parent 8836c35d
2020-05-12 Jonathan Wakely <jwakely@redhat.com> 2020-05-12 Jonathan Wakely <jwakely@redhat.com>
Backport from mainline 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.
Backport from mainline
2020-05-03 Jonathan Wakely <jwakely@redhat.com> 2020-05-03 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/94933 PR libstdc++/94933
......
...@@ -228,8 +228,8 @@ namespace pmr ...@@ -228,8 +228,8 @@ namespace pmr
if (__ch->_M_canary != (__ch->_M_size | __ch->_M_align)) if (__ch->_M_canary != (__ch->_M_size | __ch->_M_align))
return; // buffer overflow detected! return; // buffer overflow detected!
size_t __size = (1u << __ch->_M_size); size_t __size = (size_t)1 << __ch->_M_size;
size_t __align = (1u << __ch->_M_align); size_t __align = (size_t)1 << __ch->_M_align;
void* __start = (char*)(__ch + 1) - __size; void* __start = (char*)(__ch + 1) - __size;
__r->deallocate(__start, __size, __align); __r->deallocate(__start, __size, __align);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment