]> granicus.if.org Git - postgresql/commitdiff
Fix use-after-free bug when renaming constraints
authorMichael Paquier <michael@paquier.xyz>
Mon, 17 Dec 2018 03:44:02 +0000 (12:44 +0900)
committerMichael Paquier <michael@paquier.xyz>
Mon, 17 Dec 2018 03:44:02 +0000 (12:44 +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 6ff3d46fb295088952ebf152ecc0c9188b639cea..c8df816f6aaf644f0c1f3cc4c6b4a453063cd560 100644 (file)
@@ -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;
index de56f69e16f0910fd5ded765ed5afa56c7439da4..ce9c9d0e6f2bfab98d2ea5cd2c6e3d82ec115044 100644 (file)
@@ -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
index 96b95e013aeadcbabeca7f3a39f07feac05b9ea7..b3390e8ade681026d747dbb158f8157820b29ec4 100644 (file)
@@ -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