]> granicus.if.org Git - postgresql/commit
Improve valgrind logic in aset.c, and fix multiple issues in generation.c.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 25 Nov 2017 00:28:19 +0000 (19:28 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 25 Nov 2017 00:28:19 +0000 (19:28 -0500)
commit0f2458ff5f970cade04313f1a10fe01d02f888b7
tree86703b1b73b14b2fd0e5bb5256b7d3b4dea8bbb6
parentf65d21b258085bdc8ef2cc282ab1ff12da9c595c
Improve valgrind logic in aset.c, and fix multiple issues in generation.c.

Revise aset.c so that all the "private" fields of chunk headers are
marked NOACCESS when outside the module, improving on the previous
coding which protected only requested_size.  Fix a couple of corner
case bugs, such as failing to re-protect the header during a failure
exit from AllocSetRealloc, and wrong padding-size calculation for an
oversize allocation request.

Apply the same design to generation.c, and also fix several bugs therein
that I found by dint of hacking the code to use generation.c as the
standard allocator and then running the core regression tests with it.
Notably, we have to track the actual size of each block, else the
wipe_mem call in GenerationReset clears the wrong amount of memory for
an oversize-chunk block; and GenerationCheck needs a way of identifying
freed chunks that isn't fooled by palloc(0).  I chose to fix the latter
by resetting the context pointer to NULL in a freed chunk, roughly like
what happens in a freed aset.c chunk.

Discussion: https://postgr.es/m/E1eHa4J-0006hI-Q8@gemulon.postgresql.org
src/backend/utils/mmgr/aset.c
src/backend/utils/mmgr/generation.c