summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2013-11-23 22:45:46 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2013-11-23 22:46:21 -0500
commit2c3b7d2247d8989c4ef726ecdd65817c02afbf69 (patch)
tree33436856a71b98637e7c400a565f258fdf211403
parentd0378c8a8c502c7d14b3e4b062988a3f1a0af6ba (diff)
Defend against bad trigger definitions in contrib/lo's lo_manage() trigger.
This function formerly crashed if called as a statement-level trigger, or if a column-name argument wasn't given. In passing, add the trigger name to all error messages from the function. (None of them are expected cases, so this shouldn't pose any compatibility risk.) Marc Cousin, reviewed by Sawada Masahiko
-rw-r--r--contrib/lo/lo.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/contrib/lo/lo.c b/contrib/lo/lo.c
index 2e37a28591e..3eb1a82e7ab 100644
--- a/contrib/lo/lo.c
+++ b/contrib/lo/lo.c
@@ -44,7 +44,12 @@ lo_manage(PG_FUNCTION_ARGS)
HeapTuple trigtuple; /* The original value of tuple */
if (!CALLED_AS_TRIGGER(fcinfo)) /* internal error */
- elog(ERROR, "not fired by trigger manager");
+ elog(ERROR, "%s: not fired by trigger manager",
+ trigdata->tg_trigger->tgname);
+
+ if (!TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) /* internal error */
+ elog(ERROR, "%s: must be fired for row",
+ trigdata->tg_trigger->tgname);
/*
* Fetch some values from trigdata
@@ -54,6 +59,10 @@ lo_manage(PG_FUNCTION_ARGS)
tupdesc = trigdata->tg_relation->rd_att;
args = trigdata->tg_trigger->tgargs;
+ if (args == NULL) /* internal error */
+ elog(ERROR, "%s: no column name provided in the trigger definition",
+ trigdata->tg_trigger->tgname);
+
/* tuple to return to Executor */
if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
rettuple = newtuple;
@@ -67,7 +76,8 @@ lo_manage(PG_FUNCTION_ARGS)
attnum = SPI_fnumber(tupdesc, args[0]);
if (attnum <= 0)
- elog(ERROR, "column \"%s\" does not exist", args[0]);
+ elog(ERROR, "%s: column \"%s\" does not exist",
+ trigdata->tg_trigger->tgname, args[0]);
/*
* Handle updates