Fix segment_bins corruption in dsa.c.
authorThomas Munro <tmunro@postgresql.org>
Thu, 20 Sep 2018 03:52:39 +0000 (15:52 +1200)
committerThomas Munro <tmunro@postgresql.org>
Thu, 20 Sep 2018 03:59:34 +0000 (15:59 +1200)
commit8ffc3be10f86af74d1341ba886237a330e47485f
treeae884a0a92926fd74781e595ca6810b6843fb07d
parent9d178fb928040f1a5ab5b566f1ec76d7ac554587
Fix segment_bins corruption in dsa.c.

If a segment has been freed by dsa.c because it is entirely empty, other
backends must make sure to unmap it before following links to new
segments that might happen to have the same index number, or they could
finish up looking at a defunct segment and then corrupt the segment_bins
lists.  The correct protocol requires checking freed_segment_counter
after acquiring the area lock and before resolving any index number to a
segment.  Add the missing checks and an assertion.

Back-patch to 10, where dsa.c first arrived.

Author: Thomas Munro
Reported-by: Tomas Vondra
Discussion: https://postgr.es/m/CAEepm%3D0thg%2Bja5zGVa7jBy-uqyHrTqTm8HGhEOtMmigGrAqTbw%40mail.gmail.com
src/backend/utils/mmgr/dsa.c