Fix unlikely shared memory leak after failure in dshash_create().
Tidy-up for commit 8c0d7bafad36434cb08ac2c78e69ae72c194ca20, based on a complaint from Andres Freund. Author: Thomas Munro Reviewed-By: Andres Freund Discussion: https://postgr.es/m/20170823054644.efuzftxjpfi6wwqs%40alap3.anarazel.de
This commit is contained in:
parent
20fbf25533
commit
4569715bd6
@ -243,10 +243,20 @@ dshash_create(dsa_area *area, const dshash_parameters *params, void *arg)
|
||||
*/
|
||||
hash_table->control->size_log2 = DSHASH_NUM_PARTITIONS_LOG2;
|
||||
hash_table->control->buckets =
|
||||
dsa_allocate(area, sizeof(dsa_pointer) * DSHASH_NUM_PARTITIONS);
|
||||
dsa_allocate_extended(area,
|
||||
sizeof(dsa_pointer) * DSHASH_NUM_PARTITIONS,
|
||||
DSA_ALLOC_NO_OOM | DSA_ALLOC_ZERO);
|
||||
if (!DsaPointerIsValid(hash_table->control->buckets))
|
||||
{
|
||||
dsa_free(area, control);
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_OUT_OF_MEMORY),
|
||||
errmsg("out of memory"),
|
||||
errdetail("Failed on DSA request of size %zu.",
|
||||
sizeof(dsa_pointer) * DSHASH_NUM_PARTITIONS)));
|
||||
}
|
||||
hash_table->buckets = dsa_get_address(area,
|
||||
hash_table->control->buckets);
|
||||
memset(hash_table->buckets, 0, sizeof(dsa_pointer) * DSHASH_NUM_PARTITIONS);
|
||||
|
||||
return hash_table;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user