Fix use-after-free bug when renaming constraints
authorMichael Paquier <[email protected]>
Mon, 17 Dec 2018 03:43:00 +0000 (12:43 +0900)
committerMichael Paquier <[email protected]>
Mon, 17 Dec 2018 03:43:00 +0000 (12:43 +0900)
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
src/test/regress/expected/alter_table.out
src/test/regress/sql/alter_table.sql

index fe75f9e80bb60f96f8f14b7428c5698358f4ee2e..9149dfd32851dd0e8bbd522284e9d4fc36a426a4 100644 (file)
@@ -3020,12 +3020,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;
index 3fed5812bcecb3c2276f0c4be50c34c030daa974..889b15fb8e9cd08c3244a6fec57269df2c2b16bd 100644 (file)
@@ -400,7 +400,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
index e5a85c238b5384d1299882a475354db1c0f10e18..9b87fbcf6d768fd40f1da7a25b9d6902da24b295 100644 (file)
@@ -296,7 +296,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