From c629fe3ac1c842fc391fd2e721079c4a63064819 Mon Sep 17 00:00:00 2001 From: April01xxx Date: Mon, 3 Jul 2023 11:42:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DOptMemoryContext=E5=9C=A8Debu?= =?UTF-8?q?g=E6=A8=A1=E5=BC=8F=E4=B8=8B=E6=9C=AA=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=93=A8=E5=85=B5=E5=AF=BC=E8=87=B4=E5=86=85?= =?UTF-8?q?=E5=AD=98=E6=A3=80=E6=9F=A5=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/utils/mmgr/aset.cpp | 10 +++++++--- src/common/backend/utils/mmgr/opt_aset.cpp | 4 ++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/common/backend/utils/mmgr/aset.cpp b/src/common/backend/utils/mmgr/aset.cpp index 34ad4afaf..ece3f5f34 100644 --- a/src/common/backend/utils/mmgr/aset.cpp +++ b/src/common/backend/utils/mmgr/aset.cpp @@ -1603,10 +1603,14 @@ void GenericMemoryAllocator::AllocSetStats(MemoryContext context, int level) void AllocSetCheckPointer(void* pointer) { AllocChunkData* chunk = (AllocChunkData*)(((char*)(pointer)) - ALLOC_CHUNKHDRSZ); - AllocMagicData* magic = - (AllocMagicData*)(((char*)chunk) + ALLOC_CHUNKHDRSZ + MAXALIGN(chunk->requested_size) - ALLOC_MAGICHDRSZ); - Assert(magic->aset == chunk->aset && magic->size == chunk->size && magic->posnum == PosmagicNum); + /* For opt memory context, we use sentinel instead of magic number to protect memory overflow. */ + if (!IsOptAllocSetContext(chunk->aset)) { + AllocMagicData* magic = + (AllocMagicData*)(((char*)chunk) + ALLOC_CHUNKHDRSZ + MAXALIGN(chunk->requested_size) - ALLOC_MAGICHDRSZ); + + Assert(magic->aset == chunk->aset && magic->size == chunk->size && magic->posnum == PosmagicNum); + } } /* diff --git a/src/common/backend/utils/mmgr/opt_aset.cpp b/src/common/backend/utils/mmgr/opt_aset.cpp index 9073cf6e5..0e79d869d 100644 --- a/src/common/backend/utils/mmgr/opt_aset.cpp +++ b/src/common/backend/utils/mmgr/opt_aset.cpp @@ -864,6 +864,8 @@ static void* opt_AllocSetRealloc(MemoryContext context, void* pointer, Size alig if (oldsize >= size) { #ifdef MEMORY_CONTEXT_CHECKING chunk->requested_size = size; + if (size < oldsize) + set_sentinel(pointer, size); #endif return pointer; } @@ -914,6 +916,8 @@ static void* opt_AllocSetRealloc(MemoryContext context, void* pointer, Size alig chunk->size = chksize; #ifdef MEMORY_CONTEXT_CHECKING chunk->requested_size = size; + if (size < chunk->size) + set_sentinel(AllocChunkGetPointer(chunk), size); #endif return AllocChunkGetPointer(chunk); }