diff options
author | Michael Paquier <michael@paquier.xyz> | 2018-12-17 12:43:39 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2018-12-17 12:43:39 +0900 |
commit | e83e0988dc62026dbabad76b206bddea3d4f830e (patch) | |
tree | 74ceeb86f05735d2081808c7fa98d93e9f5f01f6 /src | |
parent | 25b8094d33ac66773ba1418457cb74eb22b5d50a (diff) | |
download | postgresql-e83e0988dc62026dbabad76b206bddea3d4f830e.tar.gz postgresql-e83e0988dc62026dbabad76b206bddea3d4f830e.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/commands/tablecmds.c | 4 | ||||
-rw-r--r-- | src/test/regress/expected/alter_table.out | 2 | ||||
-rw-r--r-- | 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 0f03a9b271d..c096a8c4bb3 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -3027,12 +3027,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 0734296c131..83febdae816 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -406,7 +406,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 4ec5d1010da..8b2f7d5b2b2 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -308,7 +308,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 |