Fix unlikely shared memory leak after failure in dshash_create().
authorAndres Freund <andres@anarazel.de>
Thu, 24 Aug 2017 23:58:30 +0000 (16:58 -0700)
committerAndres Freund <andres@anarazel.de>
Thu, 24 Aug 2017 23:58:30 +0000 (16:58 -0700)
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

src/backend/lib/dshash.c

index 988d569b841ef48ad1238606072002d86617672a..06ff32313cdfc60b4f5bb861cbd264fd54fbd71e 100644 (file)
@@ -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;
 }