@@ -188,14 +188,6 @@ typedef struct AllocBlockData
188
188
char * endptr ; /* end of space in this block */
189
189
} AllocBlockData ;
190
190
191
- /*
192
- * Only the "hdrmask" field should be accessed outside this module.
193
- * We keep the rest of an allocated chunk's header marked NOACCESS when using
194
- * valgrind. But note that chunk headers that are in a freelist are kept
195
- * accessible, for simplicity.
196
- */
197
- #define ALLOCCHUNK_PRIVATE_LEN offsetof(MemoryChunk, hdrmask)
198
-
199
191
/*
200
192
* AllocPointerIsValid
201
193
* True iff pointer is valid allocation pointer.
@@ -777,8 +769,8 @@ AllocSetAlloc(MemoryContext context, Size size)
777
769
VALGRIND_MAKE_MEM_NOACCESS ((char * ) MemoryChunkGetPointer (chunk ) + size ,
778
770
chunk_size - size );
779
771
780
- /* Disallow external access to private part of chunk header. */
781
- VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOCCHUNK_PRIVATE_LEN );
772
+ /* Disallow access to the chunk header. */
773
+ VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOC_CHUNKHDRSZ );
782
774
783
775
return MemoryChunkGetPointer (chunk );
784
776
}
@@ -801,6 +793,9 @@ AllocSetAlloc(MemoryContext context, Size size)
801
793
{
802
794
AllocFreeListLink * link = GetFreeListLink (chunk );
803
795
796
+ /* Allow access to the chunk header. */
797
+ VALGRIND_MAKE_MEM_DEFINED (chunk , ALLOC_CHUNKHDRSZ );
798
+
804
799
Assert (fidx == MemoryChunkGetValue (chunk ));
805
800
806
801
/* pop this chunk off the freelist */
@@ -823,8 +818,8 @@ AllocSetAlloc(MemoryContext context, Size size)
823
818
VALGRIND_MAKE_MEM_NOACCESS ((char * ) MemoryChunkGetPointer (chunk ) + size ,
824
819
GetChunkSizeFromFreeListIdx (fidx ) - size );
825
820
826
- /* Disallow external access to private part of chunk header. */
827
- VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOCCHUNK_PRIVATE_LEN );
821
+ /* Disallow access to the chunk header. */
822
+ VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOC_CHUNKHDRSZ );
828
823
829
824
return MemoryChunkGetPointer (chunk );
830
825
}
@@ -989,8 +984,8 @@ AllocSetAlloc(MemoryContext context, Size size)
989
984
VALGRIND_MAKE_MEM_NOACCESS ((char * ) MemoryChunkGetPointer (chunk ) + size ,
990
985
chunk_size - size );
991
986
992
- /* Disallow external access to private part of chunk header. */
993
- VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOCCHUNK_PRIVATE_LEN );
987
+ /* Disallow access to the chunk header. */
988
+ VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOC_CHUNKHDRSZ );
994
989
995
990
return MemoryChunkGetPointer (chunk );
996
991
}
@@ -1005,8 +1000,8 @@ AllocSetFree(void *pointer)
1005
1000
AllocSet set ;
1006
1001
MemoryChunk * chunk = PointerGetMemoryChunk (pointer );
1007
1002
1008
- /* Allow access to private part of chunk header. */
1009
- VALGRIND_MAKE_MEM_DEFINED (chunk , ALLOCCHUNK_PRIVATE_LEN );
1003
+ /* Allow access to the chunk header. */
1004
+ VALGRIND_MAKE_MEM_DEFINED (chunk , ALLOC_CHUNKHDRSZ );
1010
1005
1011
1006
if (MemoryChunkIsExternal (chunk ))
1012
1007
{
@@ -1115,8 +1110,8 @@ AllocSetRealloc(void *pointer, Size size)
1115
1110
Size oldchksize ;
1116
1111
int fidx ;
1117
1112
1118
- /* Allow access to private part of chunk header. */
1119
- VALGRIND_MAKE_MEM_DEFINED (chunk , ALLOCCHUNK_PRIVATE_LEN );
1113
+ /* Allow access to the chunk header. */
1114
+ VALGRIND_MAKE_MEM_DEFINED (chunk , ALLOC_CHUNKHDRSZ );
1120
1115
1121
1116
if (MemoryChunkIsExternal (chunk ))
1122
1117
{
@@ -1164,8 +1159,8 @@ AllocSetRealloc(void *pointer, Size size)
1164
1159
block = (AllocBlock ) realloc (block , blksize );
1165
1160
if (block == NULL )
1166
1161
{
1167
- /* Disallow external access to private part of chunk header. */
1168
- VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOCCHUNK_PRIVATE_LEN );
1162
+ /* Disallow access to the chunk header. */
1163
+ VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOC_CHUNKHDRSZ );
1169
1164
return NULL ;
1170
1165
}
1171
1166
@@ -1232,8 +1227,8 @@ AllocSetRealloc(void *pointer, Size size)
1232
1227
/* Ensure any padding bytes are marked NOACCESS. */
1233
1228
VALGRIND_MAKE_MEM_NOACCESS ((char * ) pointer + size , chksize - size );
1234
1229
1235
- /* Disallow external access to private part of chunk header. */
1236
- VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOCCHUNK_PRIVATE_LEN );
1230
+ /* Disallow access to the chunk header . */
1231
+ VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOC_CHUNKHDRSZ );
1237
1232
1238
1233
return pointer ;
1239
1234
}
@@ -1305,8 +1300,8 @@ AllocSetRealloc(void *pointer, Size size)
1305
1300
VALGRIND_MAKE_MEM_DEFINED (pointer , size );
1306
1301
#endif
1307
1302
1308
- /* Disallow external access to private part of chunk header. */
1309
- VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOCCHUNK_PRIVATE_LEN );
1303
+ /* Disallow access to the chunk header. */
1304
+ VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOC_CHUNKHDRSZ );
1310
1305
1311
1306
return pointer ;
1312
1307
}
@@ -1332,8 +1327,8 @@ AllocSetRealloc(void *pointer, Size size)
1332
1327
/* leave immediately if request was not completed */
1333
1328
if (newPointer == NULL )
1334
1329
{
1335
- /* Disallow external access to private part of chunk header. */
1336
- VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOCCHUNK_PRIVATE_LEN );
1330
+ /* Disallow access to the chunk header. */
1331
+ VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOC_CHUNKHDRSZ );
1337
1332
return NULL ;
1338
1333
}
1339
1334
@@ -1374,11 +1369,17 @@ AllocSetGetChunkContext(void *pointer)
1374
1369
AllocBlock block ;
1375
1370
AllocSet set ;
1376
1371
1372
+ /* Allow access to the chunk header. */
1373
+ VALGRIND_MAKE_MEM_DEFINED (chunk , ALLOC_CHUNKHDRSZ );
1374
+
1377
1375
if (MemoryChunkIsExternal (chunk ))
1378
1376
block = ExternalChunkGetBlock (chunk );
1379
1377
else
1380
1378
block = (AllocBlock ) MemoryChunkGetBlock (chunk );
1381
1379
1380
+ /* Disallow access to the chunk header. */
1381
+ VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOC_CHUNKHDRSZ );
1382
+
1382
1383
Assert (AllocBlockIsValid (block ));
1383
1384
set = block -> aset ;
1384
1385
@@ -1396,16 +1397,27 @@ AllocSetGetChunkSpace(void *pointer)
1396
1397
MemoryChunk * chunk = PointerGetMemoryChunk (pointer );
1397
1398
int fidx ;
1398
1399
1400
+ /* Allow access to the chunk header. */
1401
+ VALGRIND_MAKE_MEM_DEFINED (chunk , ALLOC_CHUNKHDRSZ );
1402
+
1399
1403
if (MemoryChunkIsExternal (chunk ))
1400
1404
{
1401
1405
AllocBlock block = ExternalChunkGetBlock (chunk );
1402
1406
1407
+ /* Disallow access to the chunk header. */
1408
+ VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOC_CHUNKHDRSZ );
1409
+
1403
1410
Assert (AllocBlockIsValid (block ));
1411
+
1404
1412
return block -> endptr - (char * ) chunk ;
1405
1413
}
1406
1414
1407
1415
fidx = MemoryChunkGetValue (chunk );
1408
1416
Assert (FreeListIdxIsValid (fidx ));
1417
+
1418
+ /* Disallow access to the chunk header. */
1419
+ VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOC_CHUNKHDRSZ );
1420
+
1409
1421
return GetChunkSizeFromFreeListIdx (fidx ) + ALLOC_CHUNKHDRSZ ;
1410
1422
}
1411
1423
@@ -1471,7 +1483,10 @@ AllocSetStats(MemoryContext context,
1471
1483
{
1472
1484
AllocFreeListLink * link = GetFreeListLink (chunk );
1473
1485
1486
+ /* Allow access to the chunk header. */
1487
+ VALGRIND_MAKE_MEM_DEFINED (chunk , ALLOC_CHUNKHDRSZ );
1474
1488
Assert (MemoryChunkGetValue (chunk ) == fidx );
1489
+ VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOC_CHUNKHDRSZ );
1475
1490
1476
1491
freechunks ++ ;
1477
1492
freespace += chksz + ALLOC_CHUNKHDRSZ ;
@@ -1566,8 +1581,8 @@ AllocSetCheck(MemoryContext context)
1566
1581
Size chsize ,
1567
1582
dsize ;
1568
1583
1569
- /* Allow access to private part of chunk header. */
1570
- VALGRIND_MAKE_MEM_DEFINED (chunk , ALLOCCHUNK_PRIVATE_LEN );
1584
+ /* Allow access to the chunk header. */
1585
+ VALGRIND_MAKE_MEM_DEFINED (chunk , ALLOC_CHUNKHDRSZ );
1571
1586
1572
1587
if (MemoryChunkIsExternal (chunk ))
1573
1588
{
@@ -1617,12 +1632,9 @@ AllocSetCheck(MemoryContext context)
1617
1632
elog (WARNING , "problem in alloc set %s: detected write past chunk end in block %p, chunk %p" ,
1618
1633
name , block , chunk );
1619
1634
1620
- /*
1621
- * If chunk is allocated, disallow external access to private part
1622
- * of chunk header.
1623
- */
1635
+ /* if chunk is allocated, disallow access to the chunk header */
1624
1636
if (dsize != InvalidAllocSize )
1625
- VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOCCHUNK_PRIVATE_LEN );
1637
+ VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOC_CHUNKHDRSZ );
1626
1638
1627
1639
blk_data += chsize ;
1628
1640
nchunks ++ ;
0 commit comments