From 80a96e066eecb6bd1788964b5911a405d932a784 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 7 Apr 2019 18:18:58 -0400 Subject: [PATCH] Avoid fetching past the end of the indoption array. pg_get_indexdef_worker carelessly fetched indoption entries even for non-key index columns that don't have one. 99.999% of the time this would be harmless, since the code wouldn't examine the value ... but some fine day this will be a fetch off the end of memory, resulting in SIGSEGV. Detected through valgrind testing. Odd that the buildfarm's valgrind critters haven't noticed. --- src/backend/utils/adt/ruleutils.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 7b142e3b18..0c7a533e69 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -1308,7 +1308,6 @@ pg_get_indexdef_worker(Oid indexrelid, int colno, for (keyno = 0; keyno < idxrec->indnatts; keyno++) { AttrNumber attnum = idxrec->indkey.values[keyno]; - int16 opt = indoption->values[keyno]; Oid keycoltype; Oid keycolcollation; @@ -1370,10 +1369,10 @@ pg_get_indexdef_worker(Oid indexrelid, int colno, if (!attrsOnly && keyno < idxrec->indnkeyatts && (!colno || colno == keyno + 1)) { - Oid indcoll; + int16 opt = indoption->values[keyno]; + Oid indcoll = indcollation->values[keyno]; /* Add collation, if not default for column */ - indcoll = indcollation->values[keyno]; if (OidIsValid(indcoll) && indcoll != keycolcollation) appendStringInfo(&buf, " COLLATE %s", generate_collation_name((indcoll))); -- 2.40.0