mirror of
https://github.com/postgres/postgres.git
synced 2025-11-09 06:21:09 +03:00
CheckNNConstraintFetch: Fill all of ConstrCheck in a single pass
Previously, we'd fill all fields except ccbin, and only later obtain and detoast ccbin, with hypothetical failures being possible. If ccbin is null (rare catalog corruption I have never witnessed) or its a corrupted toast entry, we leak a tiny bit of memory in CacheMemoryContext from having strdup'd the constraint name. Repair these by only attempting to fill the struct once ccbin has been detoasted. Author: Ranier Vilela <ranier.vf@gmail.com> Discussion: https://postgr.es/m/CAEudQAr=i3_Z4GvmediX900+sSySTeMkvuytYShhQqEwoGyvhA@mail.gmail.com
This commit is contained in:
12
src/backend/utils/cache/relcache.c
vendored
12
src/backend/utils/cache/relcache.c
vendored
@@ -4658,12 +4658,6 @@ CheckNNConstraintFetch(Relation relation)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
check[found].ccenforced = conform->conenforced;
|
|
||||||
check[found].ccvalid = conform->convalidated;
|
|
||||||
check[found].ccnoinherit = conform->connoinherit;
|
|
||||||
check[found].ccname = MemoryContextStrdup(CacheMemoryContext,
|
|
||||||
NameStr(conform->conname));
|
|
||||||
|
|
||||||
/* Grab and test conbin is actually set */
|
/* Grab and test conbin is actually set */
|
||||||
val = fastgetattr(htup,
|
val = fastgetattr(htup,
|
||||||
Anum_pg_constraint_conbin,
|
Anum_pg_constraint_conbin,
|
||||||
@@ -4676,7 +4670,13 @@ CheckNNConstraintFetch(Relation relation)
|
|||||||
/* detoast and convert to cstring in caller's context */
|
/* detoast and convert to cstring in caller's context */
|
||||||
char *s = TextDatumGetCString(val);
|
char *s = TextDatumGetCString(val);
|
||||||
|
|
||||||
|
check[found].ccenforced = conform->conenforced;
|
||||||
|
check[found].ccvalid = conform->convalidated;
|
||||||
|
check[found].ccnoinherit = conform->connoinherit;
|
||||||
|
check[found].ccname = MemoryContextStrdup(CacheMemoryContext,
|
||||||
|
NameStr(conform->conname));
|
||||||
check[found].ccbin = MemoryContextStrdup(CacheMemoryContext, s);
|
check[found].ccbin = MemoryContextStrdup(CacheMemoryContext, s);
|
||||||
|
|
||||||
pfree(s);
|
pfree(s);
|
||||||
found++;
|
found++;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user