I was using the lo contrib a few days ago and wasn't paying attention, and 
forgot the "for each row" in the create trigger command... PostgreSQL 
segfaulted, when the trigger tried to access the row's attributes.

Please find attached a patch to control that the trigger is correctly defined 
(as in the example): a before trigger, for each row, and a parameter (if the 
parameter was omitted, it segfaulted too). I hope I did this correctly.

Regards,

Marc.
diff --git a/contrib/lo/lo.c b/contrib/lo/lo.c
index 9dbbbce..2b9477a 100644
--- a/contrib/lo/lo.c
+++ b/contrib/lo/lo.c
@@ -50,6 +50,13 @@ lo_manage(PG_FUNCTION_ARGS)
 	tupdesc = trigdata->tg_relation->rd_att;
 	args = trigdata->tg_trigger->tgargs;
 
+	if (!TRIGGER_FIRED_FOR_ROW(trigdata->tg_event))     /* internal error */
+		elog(ERROR, "not fired by a for each row trigger");
+
+	if (!TRIGGER_FIRED_BEFORE(trigdata->tg_event))      /* internal error */
+		elog(ERROR, "not fired as a before trigger");
+
+
 	/* tuple to return to Executor */
 	if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
 		rettuple = newtuple;
@@ -59,6 +66,9 @@ lo_manage(PG_FUNCTION_ARGS)
 	/* Are we deleting the row? */
 	isdelete = TRIGGER_FIRED_BY_DELETE(trigdata->tg_event);
 
+	if (args == NULL)                                  /* internal error */
+		elog (ERROR, "no column name provided in the trigger definition");
+
 	/* Get the column we're interested in */
 	attnum = SPI_fnumber(tupdesc, args[0]);
 
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to