postgres.git / summary / log / commit / refs

commit    c7567e09d5d1e6357b95ad16f2bc4dd6affa07f3
Author:   Michael Paquier <michael@paquier.xyz>
Date:     Mon Dec 17 03:44:02 2018 +0000
First released in: 12.0, 9.4.21, 9.5.16, 9.6.12, 10.7, 11.2

    Fix use-after-free bug when renaming constraints
    
    This is an oversight from recent commit b13fd344.  While on it, tweak
    the previous test with a better name for the renamed primary key.
    
    Detected by buildfarm member prion which forces relation cache release
    with -DRELCACHE_FORCE_RELEASE.  Back-patch down to 9.4 as the previous
    commit.


src/backend/commands/tablecmds.c | 4 ++-- src/test/regress/expected/alter_table.out | 2 +- src/test/regress/sql/alter_table.sql | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 6ff3d46fb29..c8df816f6aa 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -2487,12 +2487,12 @@ rename_constraint_internal(Oid myrelid, if (targetrelation) { - relation_close(targetrelation, NoLock); /* close rel but keep lock */ - /* * Invalidate relcache so as others can see the new constraint name. */ CacheInvalidateRelcache(targetrelation); + + relation_close(targetrelation, NoLock); /* close rel but keep lock */ } return address; diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index de56f69e16f..ce9c9d0e6f2 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -349,7 +349,7 @@ CREATE TABLE constraint_rename_cache (a int, ALTER TABLE constraint_rename_cache RENAME CONSTRAINT chk_a TO chk_a_new; ALTER TABLE constraint_rename_cache - RENAME CONSTRAINT constraint_rename_cache_pkey TO chk_a_gt_zero; + RENAME CONSTRAINT constraint_rename_cache_pkey TO constraint_rename_pkey_new; CREATE TABLE like_constraint_rename_cache (LIKE constraint_rename_cache INCLUDING ALL); \d like_constraint_rename_cache diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index 96b95e013ae..b3390e8ade6 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -258,7 +258,7 @@ CREATE TABLE constraint_rename_cache (a int, ALTER TABLE constraint_rename_cache RENAME CONSTRAINT chk_a TO chk_a_new; ALTER TABLE constraint_rename_cache - RENAME CONSTRAINT constraint_rename_cache_pkey TO chk_a_gt_zero; + RENAME CONSTRAINT constraint_rename_cache_pkey TO constraint_rename_pkey_new; CREATE TABLE like_constraint_rename_cache (LIKE constraint_rename_cache INCLUDING ALL); \d like_constraint_rename_cache [parent: 5812be7b63cf]