mirror of
https://github.com/postgres/postgres.git
synced 2025-10-29 22:49:41 +03:00
radixtree: Fix crash when non-creator begins iteration over shared tree.
Previously, if a backend that attached to a shared tree attempted to
start iteration, it resulted in a crash. This commit resolves the
issue by ensuring iter_context is created in RT_ATTACH().
This fix applies only to v17, where radixtree.h was introduced. In the
master branch, this issue was separately resolved by 960013f2a1, which
eliminated the iter_context entirely.
Reviewed-by: John Naylor
Discussion: https://postgr.es/m/CAD21AoBB2U47V=F+wQRB1bERov_of5=BOZGaybjaV8FLQyqG3Q@mail.gmail.com
This commit is contained in:
@@ -1902,6 +1902,7 @@ RT_ATTACH(dsa_area *dsa, RT_HANDLE handle)
|
|||||||
dsa_pointer control;
|
dsa_pointer control;
|
||||||
|
|
||||||
tree = (RT_RADIX_TREE *) palloc0(sizeof(RT_RADIX_TREE));
|
tree = (RT_RADIX_TREE *) palloc0(sizeof(RT_RADIX_TREE));
|
||||||
|
tree->context = CurrentMemoryContext;
|
||||||
|
|
||||||
/* Find the control object in shared memory */
|
/* Find the control object in shared memory */
|
||||||
control = handle;
|
control = handle;
|
||||||
@@ -1910,6 +1911,14 @@ RT_ATTACH(dsa_area *dsa, RT_HANDLE handle)
|
|||||||
tree->ctl = (RT_RADIX_TREE_CONTROL *) dsa_get_address(dsa, control);
|
tree->ctl = (RT_RADIX_TREE_CONTROL *) dsa_get_address(dsa, control);
|
||||||
Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
|
Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the iteration context so that the attached backend also can
|
||||||
|
* begin the iteration.
|
||||||
|
*/
|
||||||
|
tree->iter_context = AllocSetContextCreate(CurrentMemoryContext,
|
||||||
|
RT_STR(RT_PREFIX) "_radix_tree iter context",
|
||||||
|
ALLOCSET_SMALL_SIZES);
|
||||||
|
|
||||||
return tree;
|
return tree;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1917,6 +1926,7 @@ RT_SCOPE void
|
|||||||
RT_DETACH(RT_RADIX_TREE * tree)
|
RT_DETACH(RT_RADIX_TREE * tree)
|
||||||
{
|
{
|
||||||
Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
|
Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
|
||||||
|
MemoryContextDelete(tree->iter_context);
|
||||||
pfree(tree);
|
pfree(tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user