From 7cd4bceffe47f0a7ab2f8d6b0087ab303c3d083a Mon Sep 17 00:00:00 2001 From: Yuriy Grigoryev Date: Fri, 11 Sep 2026 15:50:18 +0700 Subject: [PATCH v1] Reject zero resource kinds in test_resowner_many() test_resowner_many() allowed nkinds to be zero. If resources were requested, RememberManyTestResources() accessed kinds[0] although the array contained no elements. This invokes undefined behavior and may eventually lead to a modulo-by-zero operation. Require at least one resource kind, assert the helper's precondition, and add regression coverage for both resource release phases. --- src/test/modules/test_resowner/expected/test_resowner.out | 5 +++++ src/test/modules/test_resowner/sql/test_resowner.sql | 4 ++++ src/test/modules/test_resowner/test_resowner_many.c | 6 ++++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/test/modules/test_resowner/expected/test_resowner.out b/src/test/modules/test_resowner/expected/test_resowner.out index 527b678fc12..e3ba65be7d8 100644 --- a/src/test/modules/test_resowner/expected/test_resowner.out +++ b/src/test/modules/test_resowner/expected/test_resowner.out @@ -188,6 +188,11 @@ NOTICE: releasing string: my string (1 row) +-- There must be at least one resource kind. +SELECT test_resowner_many(0, 1, 0, 0, 0); +ERROR: nkinds must be greater than zero +SELECT test_resowner_many(0, 0, 0, 1, 0); +ERROR: nkinds must be greater than zero -- Negative tests, using a resource owner after release-phase has started. set client_min_messages='warning'; -- order between ERROR and NOTICE varies SELECT test_resowner_remember_between_phases(); diff --git a/src/test/modules/test_resowner/sql/test_resowner.sql b/src/test/modules/test_resowner/sql/test_resowner.sql index 23284b7c8b9..a522e7d929d 100644 --- a/src/test/modules/test_resowner/sql/test_resowner.sql +++ b/src/test/modules/test_resowner/sql/test_resowner.sql @@ -18,6 +18,10 @@ SELECT test_resowner_many( -- Test resource leak warning SELECT test_resowner_leak(); +-- There must be at least one resource kind. +SELECT test_resowner_many(0, 1, 0, 0, 0); +SELECT test_resowner_many(0, 0, 0, 1, 0); + -- Negative tests, using a resource owner after release-phase has started. set client_min_messages='warning'; -- order between ERROR and NOTICE varies SELECT test_resowner_remember_between_phases(); diff --git a/src/test/modules/test_resowner/test_resowner_many.c b/src/test/modules/test_resowner/test_resowner_many.c index 4bb34ca7e4c..06494b41166 100644 --- a/src/test/modules/test_resowner/test_resowner_many.c +++ b/src/test/modules/test_resowner/test_resowner_many.c @@ -119,6 +119,8 @@ RememberManyTestResources(ResourceOwner owner, { int kind_idx = 0; + Assert(nkinds > 0); + for (int i = 0; i < nresources; i++) { ManyTestResource *mres = palloc_object(ManyTestResource); @@ -214,8 +216,8 @@ test_resowner_many(PG_FUNCTION_ARGS) ManyTestResourceKind *after_kinds; /* Sanity check the arguments */ - if (nkinds < 0) - elog(ERROR, "nkinds must be >= 0"); + if (nkinds <= 0) + elog(ERROR, "nkinds must be greater than zero"); if (nremember_bl < 0) elog(ERROR, "nremember_bl must be >= 0"); if (nforget_bl < 0 || nforget_bl > nremember_bl) -- 2.50.1 (Apple Git-155)