Thread: Fix uninitialized copy_data var (src/backend/commands/subscriptioncmds.c)
DROP PUBLICATION publication_name
Changes the list of subscribed publications.
SET
replaces the entire list of publications with a new list,ADD
adds additional publications,DROP
removes publications from the list of publications. See CREATE SUBSCRIPTION for more information. By default, this command will also act likeREFRESH PUBLICATION
, except that in case ofADD
orDROP
, only the added or dropped publications are refreshed.set_publication_option
specifies additional options for this operation. The supported options are:refresh
(boolean
)When false, the command will not try to refresh table information.
REFRESH PUBLICATION
should then be executed separately. The default istrue
.
Additionally, refresh options as described under
REFRESH PUBLICATION
may be specified."- So, is allowed DROP PUBLICATION with (refresh = true)
+WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables
ALTER SUBSCRIPTION regress_testsub3 REFRESH PUBLICATION;
+ALTER SUBSCRIPTION regress_testsub3 ENABLE;
+ALTER SUBSCRIPTION regress_testsub3 REFRESH PUBLICATION;
+ERROR: could not connect to the publisher: connection to server at "localhost" (::1), port 58080 failed: FATAL: database "regress_doesnotexist" does not exist
ALTER SUBSCRIPTION regress_testsub3 DROP PUBLICATION testpub WITH (refresh = true);
+ALTER SUBSCRIPTION regress_testsub3 DROP PUBLICATION testpub WITH (refresh = true);
+ERROR: subscription must contain at least one publication
Attachment
Re: Fix uninitialized copy_data var (src/backend/commands/subscriptioncmds.c)
Hi,Not per Coverity!About comments:1. For drop, no "copy data"2. Only refresh the added/*dropped* list of publications. (my emphasis)The documentation says:"DROP PUBLICATION
publication_name
Changes the list of subscribed publications.
SET
replaces the entire list of publications with a new list,ADD
adds additional publications,DROP
removes publications from the list of publications. See CREATE SUBSCRIPTION for more information. By default, this command will also act likeREFRESH PUBLICATION
, except that in case ofADD
orDROP
, only the added or dropped publications are refreshed.
set_publication_option
specifies additional options for this operation. The supported options are:
refresh
(boolean
)When false, the command will not try to refresh table information.
REFRESH PUBLICATION
should then be executed separately. The default istrue
.Additionally, refresh options as described under
REFRESH PUBLICATION
may be specified."- So, is allowed DROP PUBLICATION with (refresh = true)
I try some tests with subscription.sql:CREATE SUBSCRIPTION regress_testsub3 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, streaming = true);+CREATE SUBSCRIPTION regress_testsub3 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, streaming = true);
+WARNING: tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tablesALTER SUBSCRIPTION regress_testsub3 ENABLE;
ALTER SUBSCRIPTION regress_testsub3 REFRESH PUBLICATION;
+ALTER SUBSCRIPTION regress_testsub3 ENABLE;
+ALTER SUBSCRIPTION regress_testsub3 REFRESH PUBLICATION;
+ERROR: could not connect to the publisher: connection to server at "localhost" (::1), port 58080 failed: FATAL: database "regress_doesnotexist" does not exist-- ok - delete active publication with refresh = true
ALTER SUBSCRIPTION regress_testsub3 DROP PUBLICATION testpub WITH (refresh = true);+-- ok - delete active publication with refresh = true
+ALTER SUBSCRIPTION regress_testsub3 DROP PUBLICATION testpub WITH (refresh = true);
+ERROR: subscription must contain at least one publicationI think this bug is live, for lack of tests with DROP PUBLICATION WITH (refresh = true).
Re: Fix uninitialized copy_data var (src/backend/commands/subscriptioncmds.c)
On Fri, Jun 25, 2021 at 11:55 PM Ranier Vilela <ranier.vf@gmail.com> wrote: > > > https://github.com/postgres/postgres/commit/3af10943ce21450e299b3915b9cad47cd90369e9 > fixes some issues with subscriptioncmds.c, but IMHO still lack this issue. > I have not tested this, and gcc gave no warnings about it, but just by visual code inspection I do agree with you that this looks like a problem, even in the latest code. IIUC for the case ALTER_SUBSCRIPTION_DROP_PUBLICATION it looks like the uninitialized copy_data local stack var would remain uninitialized (undefined) still at the time it is passed at AlterSubscription_refresh(sub, copy_data); ------ Kind Regards, Peter Smith. Fujitsu Australia.
Re: Fix uninitialized copy_data var (src/backend/commands/subscriptioncmds.c)
On Mon, Jun 28, 2021 at 10:17:55AM +1000, Peter Smith wrote: > IIUC for the case ALTER_SUBSCRIPTION_DROP_PUBLICATION it looks like > the uninitialized copy_data local stack var would remain uninitialized > (undefined) still at the time it is passed at > AlterSubscription_refresh(sub, copy_data); Yes, that's wrong. AlterSubscription_refresh() would happily look at this uninitialized value when performing a refresh with this command. That's the only code path using parse_subscription_options() with this pattern. Applied on HEAD. -- Michael
Attachment
Re: Fix uninitialized copy_data var (src/backend/commands/subscriptioncmds.c)
On Fri, Jun 25, 2021 at 11:55 PM Ranier Vilela <ranier.vf@gmail.com> wrote:
>
>
> https://github.com/postgres/postgres/commit/3af10943ce21450e299b3915b9cad47cd90369e9
> fixes some issues with subscriptioncmds.c, but IMHO still lack this issue.
>
I have not tested this, and gcc gave no warnings about it, but just by
visual code inspection I do agree with you that this looks like a
problem, even in the latest code.
IIUC for the case ALTER_SUBSCRIPTION_DROP_PUBLICATION it looks like
the uninitialized copy_data local stack var would remain uninitialized
(undefined) still at the time it is passed at
AlterSubscription_refresh(sub, copy_data);
Re: Fix uninitialized copy_data var (src/backend/commands/subscriptioncmds.c)
On Mon, Jun 28, 2021 at 10:17:55AM +1000, Peter Smith wrote:
> IIUC for the case ALTER_SUBSCRIPTION_DROP_PUBLICATION it looks like
> the uninitialized copy_data local stack var would remain uninitialized
> (undefined) still at the time it is passed at
> AlterSubscription_refresh(sub, copy_data);
Yes, that's wrong. AlterSubscription_refresh() would happily look at
this uninitialized value when performing a refresh with this command.
That's the only code path using parse_subscription_options() with this
pattern. Applied on HEAD.