8000 Avoid possibly accessing off the end of memory in examine_attribute(). · fschopp/postgres@305c5ed · GitHub
[go: up one dir, main page]

Skip to content

Commit 305c5ed

Browse files
committed
Avoid possibly accessing off the end of memory in examine_attribute().
Since the last couple of columns of pg_type are often NULL, sizeof(FormData_pg_type) can be an overestimate of the actual size of the tuple data part. Therefore memcpy'ing that much out of the catalog cache, as analyze.c was doing, poses a small risk of copying past the end of memory and incurring SIGSEGV. No such crash has been identified in the field, but we've certainly seen the equivalent happen in other code paths, so patch this one all the way back. Per valgrind testing by Noah Misch, though this is not his proposed patch. I chose to use SearchSysCacheCopy1 rather than inventing special-purpose infrastructure for copying only the minimal part of a pg_type tuple.
1 parent b7e13b9 commit 305c5ed

File tree

1 file changed

+5
-7
lines changed

1 file changed

+5
-7
lines changed

src/backend/commands/analyze.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -725,14 +725,12 @@ examine_attribute(Relation onerel, int attnum)
725725
stats = (VacAttrStats *) palloc0(sizeof(VacAttrStats));
726726
stats->attr = (Form_pg_attribute) palloc(ATTRIBUTE_FIXED_PART_SIZE);
727727
memcpy(stats->attr, attr, ATTRIBUTE_FIXED_PART_SIZE);
728-
typtuple = SearchSysCache(TYPEOID,
729-
ObjectIdGetDatum(attr->atttypid),
730-
0, 0, 0);
728+
typtuple = SearchSysCacheCopy(TYPEOID,
729+
ObjectIdGetDatum(attr->atttypid),
730+
0, 0, 0);
731731
if (!HeapTupleIsValid(typtuple))
732732
elog(ERROR, "cache lookup failed for type %u", attr->atttypid);
733-
stats->attrtype = (Form_pg_type) palloc(sizeof(FormData_pg_type));
734-
memcpy(stats->attrtype, GETSTRUCT(typtuple), sizeof(FormData_pg_type));
735-
ReleaseSysCache(typtuple);
733+
stats->attrtype = (Form_pg_type) GETSTRUCT(typtuple);
736734
stats->anl_context = anl_context;
737735
stats->tupattnum = attnum;
738736

@@ -761,7 +759,7 @@ examine_attribute(Relation onerel, int attnum)
761759

762760
if (!ok || stats->compute_stats == NULL || stats->minrows <= 0)
763761
{
764-
pfree(stats->attrtype);
762+
heap_freetuple(typtuple);
765763
pfree(stats->attr);
766764
pfree(stats);
767765
return NULL;

0 commit comments

Comments
 (0)
0