]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix issue with EVENT TRIGGERS and ALTER PUBLICATION
authorDavid Rowley <drowley@postgresql.org>
Tue, 6 Jan 2026 04:30:08 +0000 (17:30 +1300)
committerDavid Rowley <drowley@postgresql.org>
Tue, 6 Jan 2026 04:30:08 +0000 (17:30 +1300)
When processing the "publish" options of an ALTER PUBLICATION command,
we call SplitIdentifierString() to split the options into a List of
strings.  Since SplitIdentifierString() modifies the delimiter
character and puts NULs in their place, this would overwrite the memory
of the AlterPublicationStmt.  Later in AlterPublicationOptions(), the
modified AlterPublicationStmt is copied for event triggers, which would
result in the event trigger only seeing the first "publish" option
rather than all options that were specified in the command.

To fix this, make a copy of the string before passing to
SplitIdentifierString().

Here we also adjust a similar case in the pgoutput plugin.  There's no
known issues caused by SplitIdentifierString() here, so this is being
done out of paranoia.

Thanks to Henson Choi for putting together an example case showing the
ALTER PUBLICATION issue.

Author: sunil s <sunilfeb26@gmail.com>
Reviewed-by: Henson Choi <assam258@gmail.com>
Reviewed-by: zengman <zengman@halodbtech.com>
Backpatch-through: 14

src/backend/commands/publicationcmds.c
src/backend/replication/pgoutput/pgoutput.c

index 6ea709988ee7d7d5b8543906e978f99c51f4e970..0eb05fe8ec3658969dd643d817a99674d0f95bf2 100644 (file)
@@ -116,7 +116,12 @@ parse_publication_options(ParseState *pstate,
                        pubactions->pubtruncate = false;
 
                        *publish_given = true;
-                       publish = defGetString(defel);
+
+                       /*
+                        * SplitIdentifierString destructively modifies its input, so make
+                        * a copy so we don't modify the memory of the executing statement
+                        */
+                       publish = pstrdup(defGetString(defel));
 
                        if (!SplitIdentifierString(publish, ',', &publish_list))
                                ereport(ERROR,
index 972a88e7c183698fa1d3f7c1bb29defd067997e0..e234c28c5053f315e40de91208ad5738793cce81 100644 (file)
@@ -338,7 +338,11 @@ parse_output_parameters(List *options, PGOutputData *data)
                                                 errmsg("conflicting or redundant options")));
                        publication_names_given = true;
 
-                       if (!SplitIdentifierString(strVal(defel->arg), ',',
+                       /*
+                        * Pass a copy of the DefElem->arg since SplitIdentifierString
+                        * modifies its input.
+                        */
+                       if (!SplitIdentifierString(pstrdup(strVal(defel->arg)), ',',
                                                                           &data->publication_names))
                                ereport(ERROR,
                                                (errcode(ERRCODE_INVALID_NAME),