]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Defend against bad trigger definitions in contrib/lo's lo_manage() trigger.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 24 Nov 2013 03:45:46 +0000 (22:45 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 24 Nov 2013 03:46:11 +0000 (22:46 -0500)
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

contrib/lo/lo.c

index 0e3559c0201e76f03b164add15d3cb324eca4d7f..f3656d8f883895c35061c2cf91a8c22675c2e8fa 100644 (file)
@@ -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