Fix segmentation fault in test_tidstore.
authorMasahiko Sawada <[email protected]>
Wed, 12 Jun 2024 00:56:13 +0000 (09:56 +0900)
committerMasahiko Sawada <[email protected]>
Wed, 12 Jun 2024 00:56:13 +0000 (09:56 +0900)
The do_set_block_offsets() and other functions accessing the tidstore
did not check if the tidstore was NULL. This led to a segmentation
fault when these functions are called without calling the
test_create().

This commit adds NULL checks in relevant functions of test_tidstore to
raise an error instead if the tidstore is not initialized.

Bug: #18483
Reported-by: Alexander Kozhemyakin
Reviewed-by: Michael Paquier
Discussion: https://postgr.es/m/18483-30bfff42de238000%40postgresql.org

src/test/modules/test_tidstore/test_tidstore.c

index 5417163407bf1081db72812757d49879840e7f69..3f6a11bf21c3889882d8c8b06d268109b0587c5b 100644 (file)
@@ -146,6 +146,13 @@ sanity_check_array(ArrayType *ta)
                 errmsg("argument must be empty or one-dimensional array")));
 }
 
+static void
+check_tidstore_available(void)
+{
+   if (tidstore == NULL)
+       elog(ERROR, "tidstore is not created");
+}
+
 static void
 purge_from_verification_array(BlockNumber blkno)
 {
@@ -167,6 +174,7 @@ do_set_block_offsets(PG_FUNCTION_ARGS)
    OffsetNumber *offs;
    int         noffs;
 
+   check_tidstore_available();
    sanity_check_array(ta);
 
    noffs = ArrayGetNItems(ARR_NDIM(ta), ARR_DIMS(ta));
@@ -217,6 +225,8 @@ check_set_block_offsets(PG_FUNCTION_ARGS)
    int         num_lookup_tids = 0;
    BlockNumber prevblkno = 0;
 
+   check_tidstore_available();
+
    /* lookup each member in the verification array */
    for (int i = 0; i < items.num_tids; i++)
        if (!TidStoreIsMember(tidstore, &items.insert_tids[i]))
@@ -305,6 +315,8 @@ test_is_full(PG_FUNCTION_ARGS)
 {
    bool        is_full;
 
+   check_tidstore_available();
+
    is_full = (TidStoreMemoryUsage(tidstore) > tidstore_empty_size);
 
    PG_RETURN_BOOL(is_full);
@@ -314,6 +326,8 @@ test_is_full(PG_FUNCTION_ARGS)
 Datum
 test_destroy(PG_FUNCTION_ARGS)
 {
+   check_tidstore_available();
+
    TidStoreDestroy(tidstore);
    tidstore = NULL;
    items.num_tids = 0;