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
REL8_4_STABLE
Tom Lane 12 years ago
parent d0378c8a8c
commit 2c3b7d2247
  1. 14
      contrib/lo/lo.c

@ -44,7 +44,12 @@ lo_manage(PG_FUNCTION_ARGS)
HeapTuple trigtuple; /* The original value of tuple */ HeapTuple trigtuple; /* The original value of tuple */
if (!CALLED_AS_TRIGGER(fcinfo)) /* internal error */ 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 * Fetch some values from trigdata
@ -54,6 +59,10 @@ lo_manage(PG_FUNCTION_ARGS)
tupdesc = trigdata->tg_relation->rd_att; tupdesc = trigdata->tg_relation->rd_att;
args = trigdata->tg_trigger->tgargs; 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 */ /* tuple to return to Executor */
if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event)) if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
rettuple = newtuple; rettuple = newtuple;
@ -67,7 +76,8 @@ lo_manage(PG_FUNCTION_ARGS)
attnum = SPI_fnumber(tupdesc, args[0]); attnum = SPI_fnumber(tupdesc, args[0]);
if (attnum <= 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 * Handle updates

Loading…
Cancel
Save