segfault with contrib lo
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.
Attachments:
diff_lotext/x-patch; charset=UTF-8; name=diff_loDownload
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]);
On Mon, Oct 7, 2013 at 12:32 PM, Marc Cousin <cousinmarc@gmail.com> wrote:
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.
Thanks for the patch. Please add it to the next CommitFest.
https://commitfest.postgresql.org/action/commitfest_view/open
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Tuesday 08 October 2013 12:28:46 Robert Haas wrote:
On Mon, Oct 7, 2013 at 12:32 PM, Marc Cousin <cousinmarc@gmail.com> wrote:
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.Thanks for the patch. Please add it to the next CommitFest.
https://commitfest.postgresql.org/action/commitfest_view/open
Done.
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Wed, Oct 9, 2013 at 2:12 AM, Marc Cousin <cousinmarc@gmail.com> wrote:
On Tuesday 08 October 2013 12:28:46 Robert Haas wrote:
On Mon, Oct 7, 2013 at 12:32 PM, Marc Cousin <cousinmarc@gmail.com> wrote:
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.Thanks for the patch. Please add it to the next CommitFest.
https://commitfest.postgresql.org/action/commitfest_view/open
Done.
Sorry for late response.
I tried the patch you attached.
It is simple patch, and works fine.
It is just my suggestion that error message shows name of trigger.
Regards,
-------
Sawada Masahiko
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Sawada Masahiko <sawada.mshk@gmail.com> writes:
On Mon, Oct 7, 2013 at 12:32 PM, Marc Cousin <cousinmarc@gmail.com> wrote:
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.
This looks good to me, except I see no reason for the trigger to refuse to
run as an AFTER trigger. It works fine like that (I checked), and in some
scenarios people might prefer to do it that way to be sure they're seeing
the final version of the update.
Sorry for late response.
I tried the patch you attached.
It is simple patch, and works fine.
It is just my suggestion that error message shows name of trigger.
That seemed like a good idea to me, so I made all the errors (not
just the new ones) do it.
Committed and back-patched.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers