From de734fb18f7183d340c8ae63db0508bece9f8e91 Mon Sep 17 00:00:00 2001 From: Jan Nidzwetzki Date: Thu, 11 Apr 2024 00:49:57 +0200 Subject: [PATCH] Check for trigger context before accessing data The ts_hypertable_insert_blocker function was accessing data from the trigger context before it was tested that a trigger context actually exists. This led to a crash when the function was called directly. Fixes: #6819 --- .unreleased/fix_6820 | 2 ++ src/hypertable.c | 9 ++++++--- test/expected/triggers.out | 3 +++ test/sql/triggers.sql | 2 ++ 4 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 .unreleased/fix_6820 diff --git a/.unreleased/fix_6820 b/.unreleased/fix_6820 new file mode 100644 index 00000000000..47ed02ad198 --- /dev/null +++ b/.unreleased/fix_6820 @@ -0,0 +1,2 @@ +Fixes: #6820 Fix a crash when the ts_hypertable_insert_blocker was called directly +Thanks: @brasic for reporting a crash when the ts_hypertable_insert_blocker was called directly diff --git a/src/hypertable.c b/src/hypertable.c index 1199ae96d63..2668c8f6894 100644 --- a/src/hypertable.c +++ b/src/hypertable.c @@ -1318,12 +1318,15 @@ TS_FUNCTION_INFO_V1(ts_hypertable_insert_blocker); Datum ts_hypertable_insert_blocker(PG_FUNCTION_ARGS) { - TriggerData *trigdata = (TriggerData *) fcinfo->context; - const char *relname = get_rel_name(trigdata->tg_relation->rd_id); - if (!CALLED_AS_TRIGGER(fcinfo)) elog(ERROR, "insert_blocker: not called by trigger manager"); + TriggerData *trigdata = (TriggerData *) fcinfo->context; + Ensure(trigdata != NULL, "trigdata has to be set"); + Ensure(trigdata->tg_relation != NULL, "tg_relation has to be set"); + + const char *relname = get_rel_name(trigdata->tg_relation->rd_id); + if (ts_guc_restoring) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), diff --git a/test/expected/triggers.out b/test/expected/triggers.out index c4e9ff82c01..fd7342ebeca 100644 --- a/test/expected/triggers.out +++ b/test/expected/triggers.out @@ -443,3 +443,6 @@ ERROR: trigger with transition tables not supported on hypertables CREATE TRIGGER t4 AFTER DELETE ON transition_test REFERENCING OLD TABLE AS old_trans FOR EACH ROW EXECUTE FUNCTION test_trigger(); ERROR: trigger with transition tables not supported on hypertables \set ON_ERROR_STOP 1 +-- Test insert blocker trigger does not crash when called directly +SELECT _timescaledb_functions.insert_blocker(); +ERROR: insert_blocker: not called by trigger manager diff --git a/test/sql/triggers.sql b/test/sql/triggers.sql index cb4e9c5ed62..011d469dd91 100644 --- a/test/sql/triggers.sql +++ b/test/sql/triggers.sql @@ -324,4 +324,6 @@ CREATE TRIGGER t3 AFTER UPDATE ON transition_test REFERENCING NEW TABLE AS new_t CREATE TRIGGER t4 AFTER DELETE ON transition_test REFERENCING OLD TABLE AS old_trans FOR EACH ROW EXECUTE FUNCTION test_trigger(); \set ON_ERROR_STOP 1 +-- Test insert blocker trigger does not crash when called directly +SELECT _timescaledb_functions.insert_blocker();