summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2013-06-11 21:26:53 +0000
committerTom Lane2013-06-11 21:26:53 +0000
commite46753e9b935516b296bff8d46b9234bc46ee596 (patch)
treebfdcb3e675d9d49968f108f5d2ec459c5ac6ce26
parent219ef8e33ce09725a9ae1c345c63b98884a101d6 (diff)
Fix cache flush hazard in cache_record_field_properties().
We need to increment the refcount on the composite type's cached tuple descriptor while we do lookups of its column types. Otherwise a cache flush could occur and release the tuple descriptor before we're done with it. This fails reliably with -DCLOBBER_CACHE_ALWAYS, but the odds of a failure in a production build seem rather low (since the pfree'd descriptor typically wouldn't get scribbled on immediately). That may explain the lack of any previous reports. Buildfarm issue noted by Christian Ullrich. Back-patch to 9.1 where the bogus code was added.
-rw-r--r--src/backend/utils/cache/typcache.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c
index afbe121f7af..5fd02958cf1 100644
--- a/src/backend/utils/cache/typcache.c
+++ b/src/backend/utils/cache/typcache.c
@@ -578,6 +578,9 @@ cache_record_field_properties(TypeCacheEntry *typentry)
load_typcache_tupdesc(typentry);
tupdesc = typentry->tupDesc;
+ /* Must bump the refcount while we do additional catalog lookups */
+ IncrTupleDescRefCount(tupdesc);
+
/* Have each property if all non-dropped fields have the property */
newflags = (TCFLAGS_HAVE_FIELD_EQUALITY |
TCFLAGS_HAVE_FIELD_COMPARE);
@@ -601,6 +604,8 @@ cache_record_field_properties(TypeCacheEntry *typentry)
break;
}
typentry->flags |= newflags;
+
+ DecrTupleDescRefCount(tupdesc);
}
typentry->flags |= TCFLAGS_CHECKED_FIELD_PROPERTIES;
}