Skip to content

Commit b76fb6c

Browse files
committed
Temporarily make MemoryContextContains return false
5265e91 changed MemoryContextContains to update it so that it works correctly with the new MemoryChunk code added in c6e0fe1. However, 5265e91 was done with the assumption that MemoryContextContains would only ever be given pointers to memory that had been returned by one of our MemoryContext allocators. It seems that's not true and many of our 32-bit buildfarm animals are clearly showing that. There are some code paths that call MemoryContextContains with a pointer pointing part way into an allocated chunk. The example of this found by the 32-bit buildfarm animals is the int2int4_sum() function. This function returns transdata->sum, which is not a pointer to memory that was allocated directly. This return value is then subsequently passed to MemoryContextContains which causes it to crash due to it thinking the memory directly prior to that pointer is a MemoryChunk. What's actually in that memory is the field in the struct that comes prior to the "sum" field. This problem didn't occur in 64-bit world because BIGINT is a byval type and the code which was calling MemoryContextContains with the bad pointer only does so with non-byval types. Here, instead of reverting 5265e91 and making MemoryContextContains completely broken again, let's just make it always return false for now. Effectively prior to 5265e91 it was doing that anyway, this at least makes that more explicit. The only repercussions of this with the current MemoryContextContains calls are that we perform a datumCopy() when we might not need to. This should make the 32-bit buildfarm animals happy again and give us more time to consider a long-term fix. Discussion: https://postgr.es/m/20220907130552.sfjri7jublfxyyi4%40jrouhaud
1 parent e7936f8 commit b76fb6c

File tree

1 file changed

+9
-20
lines changed

1 file changed

+9
-20
lines changed

src/backend/utils/mmgr/mcxt.c

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,14 @@ MemoryContextCheck(MemoryContext context)
826826
bool
827827
MemoryContextContains(MemoryContext context, void *pointer)
828828
{
829+
/*
830+
* Temporarily make this always return false as we don't yet have a fully
831+
* baked idea on how to make it work correctly with the new MemoryChunk
832+
* code.
833+
*/
834+
return false;
835+
836+
#ifdef NOT_USED
829837
MemoryContext ptr_context;
830838

831839
/*
@@ -845,6 +853,7 @@ MemoryContextContains(MemoryContext context, void *pointer)
845853
ptr_context = GetMemoryChunkContext(pointer);
846854

847855
return ptr_context == context;
856+
#endif
848857
}
849858

850859
/*
@@ -960,8 +969,6 @@ MemoryContextAlloc(MemoryContext context, Size size)
960969

961970
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
962971

963-
Assert(MemoryContextContains(context, ret));
964-
965972
return ret;
966973
}
967974

@@ -1000,8 +1007,6 @@ MemoryContextAllocZero(MemoryContext context, Size size)
10001007

10011008
MemSetAligned(ret, 0, size);
10021009

1003-
Assert(MemoryContextContains(context, ret));
1004-
10051010
return ret;
10061011
}
10071012

@@ -1040,8 +1045,6 @@ MemoryContextAllocZeroAligned(MemoryContext context, Size size)
10401045

10411046
MemSetLoop(ret, 0, size);
10421047

1043-
Assert(MemoryContextContains(context, ret));
1044-
10451048
return ret;
10461049
}
10471050

@@ -1083,8 +1086,6 @@ MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
10831086
if ((flags & MCXT_ALLOC_ZERO) != 0)
10841087
MemSetAligned(ret, 0, size);
10851088

1086-
Assert(MemoryContextContains(context, ret));
1087-
10881089
return ret;
10891090
}
10901091

@@ -1168,8 +1169,6 @@ palloc(Size size)
11681169

11691170
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
11701171

1171-
Assert(MemoryContextContains(context, ret));
1172-
11731172
return ret;
11741173
}
11751174

@@ -1203,8 +1202,6 @@ palloc0(Size size)
12031202

12041203
MemSetAligned(ret, 0, size);
12051204

1206-
Assert(MemoryContextContains(context, ret));
1207-
12081205
return ret;
12091206
}
12101207

@@ -1244,8 +1241,6 @@ palloc_extended(Size size, int flags)
12441241
if ((flags & MCXT_ALLOC_ZERO) != 0)
12451242
MemSetAligned(ret, 0, size);
12461243

1247-
Assert(MemoryContextContains(context, ret));
1248-
12491244
return ret;
12501245
}
12511246

@@ -1299,8 +1294,6 @@ repalloc(void *pointer, Size size)
12991294

13001295
VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
13011296

1302-
Assert(MemoryContextContains(context, ret));
1303-
13041297
return ret;
13051298
}
13061299

@@ -1336,8 +1329,6 @@ MemoryContextAllocHuge(MemoryContext context, Size size)
13361329

13371330
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
13381331

1339-
Assert(MemoryContextContains(context, ret));
1340-
13411332
return ret;
13421333
}
13431334

@@ -1377,8 +1368,6 @@ repalloc_huge(void *pointer, Size size)
13771368

13781369
VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
13791370

1380-
Assert(MemoryContextContains(context, ret));
1381-
13821371
return ret;
13831372
}
13841373

0 commit comments

Comments
 (0)