Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit49e29cb

Browse files
committed
Fix incorrect sentinel byte logic in GenerationRealloc()
This only affects MEMORY_CONTEXT_CHECKING builds.This fixes an off-by-one issue in GenerationRealloc() where thefast-path code which tries to reuse the existing allocation if theexisting chunk is >= the new requested size. The code there thought itwas always ok to use the existing chunk, but when oldsize == size thereisn't enough space to store the sentinel byte. If both sizes matchedexactly set_sentinel() would overwrite the first byte beyond the chunkand then subsequent GenerationRealloc() calls could then fail theAssert(chunk->requested_size < oldsize) check which is trying to ensurethe chunk is large enough to store the sentinel.The same issue does not exist in aset.c as the sentinel checking codeonly adds a sentinel byte if there's enough space in the chunk.Reported-by: Alexander Lakhin <exclusion@gmail.com>Discussion:https://postgr.es/m/49275921-7b39-41af-5eb8-97b50ce3312e@gmail.comBackpatch-through: 16, where the problem was introduced by0e48038
1 parent31423bc commit49e29cb

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

‎src/backend/utils/mmgr/generation.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -780,16 +780,21 @@ GenerationRealloc(void *pointer, Size size)
780780
#endif
781781

782782
/*
783-
* Maybe the allocated area alreadyis >= the new size. (In particular,
784-
*we alwaysfall out here if the requested size is a decrease.)
783+
* Maybe the allocated area alreadybig enough. (In particular, we always
784+
* fall out here if the requested size is a decrease.)
785785
*
786786
* This memory context does not use power-of-2 chunk sizing and instead
787787
* carves the chunks to be as small as possible, so most repalloc() calls
788788
* will end up in the palloc/memcpy/pfree branch.
789789
*
790790
* XXX Perhaps we should annotate this condition with unlikely()?
791791
*/
792+
#ifdefMEMORY_CONTEXT_CHECKING
793+
/* With MEMORY_CONTEXT_CHECKING, we need an extra byte for the sentinel */
794+
if (oldsize>size)
795+
#else
792796
if (oldsize >=size)
797+
#endif
793798
{
794799
#ifdefMEMORY_CONTEXT_CHECKING
795800
Sizeoldrequest=chunk->requested_size;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp