summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Freund2017-08-24 23:58:30 +0000
committerAndres Freund2017-08-24 23:58:30 +0000
commit4569715bd6faa4c43e489a7069ab7abca68ff663 (patch)
treef535b8e04fee9cc0663dc182179ebd325d0c5ce2
parent20fbf25533763c8c78c9c668b718d831236fb111 (diff)
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
-rw-r--r--src/backend/lib/dshash.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/backend/lib/dshash.c b/src/backend/lib/dshash.c
index 988d569b84..06ff32313c 100644
--- a/src/backend/lib/dshash.c
+++ b/src/backend/lib/dshash.c
@@ -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;
}