Package: release.debian.org Severity: normal X-Debbugs-Cc: pg-show-pl...@packages.debian.org Control: affects -1 + src:pg-show-plans User: release.debian....@packages.debian.org Usertags: unblock
Please unblock package pg-show-plans [ Reason ] Fix possible spinlock leakage. https://github.com/cybertec-postgresql/pg_show_plans/issues/46 [ Tests ] Package passes tests. [ Checklist ] [x] all changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in testing unblock pg-show-plans/2.1.5-2 Thanks, Christoph diff -Nru pg-show-plans-2.1.5/debian/changelog pg-show-plans-2.1.5/debian/changelog --- pg-show-plans-2.1.5/debian/changelog 2025-05-12 11:35:08.000000000 +0200 +++ pg-show-plans-2.1.5/debian/changelog 2025-07-21 11:58:29.000000000 +0200 @@ -1,3 +1,9 @@ +pg-show-plans (2.1.5-2) unstable; urgency=medium + + * Fix possible spinlock leakage. + + -- Christoph Berg <m...@debian.org> Mon, 21 Jul 2025 11:58:29 +0200 + pg-show-plans (2.1.5-1) unstable; urgency=medium * New upstream version 2.1.5. diff -Nru pg-show-plans-2.1.5/debian/patches/6c8b1037e4a9c54c72861d400a9bb4c360a983a6 pg-show-plans-2.1.5/debian/patches/6c8b1037e4a9c54c72861d400a9bb4c360a983a6 --- pg-show-plans-2.1.5/debian/patches/6c8b1037e4a9c54c72861d400a9bb4c360a983a6 1970-01-01 01:00:00.000000000 +0100 +++ pg-show-plans-2.1.5/debian/patches/6c8b1037e4a9c54c72861d400a9bb4c360a983a6 2025-07-21 11:58:29.000000000 +0200 @@ -0,0 +1,58 @@ +commit 6c8b1037e4a9c54c72861d400a9bb4c360a983a6 +Author: Ivan Kovmir <i...@kovmir.eu> +Date: Mon Jul 21 10:42:17 2025 +0200 + + Fix possible spinlock leakage + + * Spinlock is held longer than it is allowed to be. + * `heap_form_tuple()` may raise errors while the lock is being held, + which could result in spinlock leakage. + + Thanks https://github.com/ocean-dot-li + Close #46. + +--- a/pg_show_plans.c ++++ b/pg_show_plans.c +@@ -68,6 +68,7 @@ typedef struct pgspCtx { /* Used as `fun + pgspEntry *pgsp_tmp_entry; /* PGSP entry currently processing. */ + int curr_nest; /* Current nest level porcessing. */ + bool is_done; /* Done processing current PGSP entry? */ ++ int n_plans; + } pgspCtx; + + /* Function Prototypes */ +@@ -611,6 +612,7 @@ pg_show_plans(PG_FUNCTION_ARGS) + pgsp_ctx = (pgspCtx *)palloc(sizeof(pgspCtx)); + pgsp_ctx->is_done = true; + pgsp_ctx->curr_nest = 0; ++ pgsp_ctx->n_plans = 0; + pgsp_ctx->hash_seq = (HASH_SEQ_STATUS *)palloc(sizeof(HASH_SEQ_STATUS)); + hash_seq_init(pgsp_ctx->hash_seq, pgsp_hash); + funcctx->user_fctx = (void *)pgsp_ctx; +@@ -663,6 +665,8 @@ pg_show_plans(PG_FUNCTION_ARGS) + call_cntr++; + } + SpinLockAcquire(&pgsp_tmp_entry->mutex); ++ pgsp_ctx->n_plans = pgsp_tmp_entry->n_plans; ++ SpinLockRelease(&pgsp_tmp_entry->mutex); + } + + /* A single hash entry may store multiple (nested) plans, so +@@ -679,7 +683,7 @@ pg_show_plans(PG_FUNCTION_ARGS) + values[4] = CStringGetTextDatum(pgsp_tmp_entry->plan + offset); + htup = heap_form_tuple(funcctx->tuple_desc, values, nulls); + +- if (curr_nest < pgsp_tmp_entry->n_plans-1) ++ if (curr_nest < pgsp_ctx->n_plans - 1) + { /* Still have nested plans. */ + curr_nest++; + call_cntr--; /* May not be legal, but it works. */ +@@ -687,7 +691,7 @@ pg_show_plans(PG_FUNCTION_ARGS) + } else { /* No more nested plans, get a new entry. */ + curr_nest = 0; + is_done = true; +- SpinLockRelease(&pgsp_tmp_entry->mutex); ++ pgsp_ctx->n_plans = 0; + } + /* Save values back to the context. */ + pgsp_ctx->is_done = is_done; diff -Nru pg-show-plans-2.1.5/debian/patches/series pg-show-plans-2.1.5/debian/patches/series --- pg-show-plans-2.1.5/debian/patches/series 1970-01-01 01:00:00.000000000 +0100 +++ pg-show-plans-2.1.5/debian/patches/series 2025-07-21 11:58:29.000000000 +0200 @@ -0,0 +1 @@ +6c8b1037e4a9c54c72861d400a9bb4c360a983a6