summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Rowley <drowley@postgresql.org>2026-01-06 17:30:32 +1300
committerDavid Rowley <drowley@postgresql.org>2026-01-06 17:30:32 +1300
commit0687a6eb03b6f25527c2a6b61e43679e496499d3 (patch)
tree33fad0c7941e7c877072a16fcafe3023f48475f8
parent67edd54f0639d8e194c6f0379b9fed6220f2f36b (diff)
Fix issue with EVENT TRIGGERS and ALTER PUBLICATIONorigin/REL_16_STABLE
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
-rw-r--r--src/backend/commands/publicationcmds.c7
-rw-r--r--src/backend/replication/pgoutput/pgoutput.c6
2 files changed, 11 insertions, 2 deletions
diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c
index f4ba572697a..874a8ce6e14 100644
--- a/src/backend/commands/publicationcmds.c
+++ b/src/backend/commands/publicationcmds.c
@@ -123,7 +123,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,
diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c
index 62e584a2cd1..210d49a2228 100644
--- a/src/backend/replication/pgoutput/pgoutput.c
+++ b/src/backend/replication/pgoutput/pgoutput.c
@@ -340,7 +340,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),