Skip to content

Commit e46753e

Browse files
committed
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.
1 parent 219ef8e commit e46753e

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

src/backend/utils/cache/typcache.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,9 @@ cache_record_field_properties(TypeCacheEntry *typentry)
578578
load_typcache_tupdesc(typentry);
579579
tupdesc = typentry->tupDesc;
580580

581+
/* Must bump the refcount while we do additional catalog lookups */
582+
IncrTupleDescRefCount(tupdesc);
583+
581584
/* Have each property if all non-dropped fields have the property */
582585
newflags = (TCFLAGS_HAVE_FIELD_EQUALITY |
583586
TCFLAGS_HAVE_FIELD_COMPARE);
@@ -601,6 +604,8 @@ cache_record_field_properties(TypeCacheEntry *typentry)
601604
break;
602605
}
603606
typentry->flags |= newflags;
607+
608+
DecrTupleDescRefCount(tupdesc);
604609
}
605610
typentry->flags |= TCFLAGS_CHECKED_FIELD_PROPERTIES;
606611
}

0 commit comments

Comments
 (0)