Avoid fetching past the end of the indoption array.
authorTom Lane
Sun, 7 Apr 2019 22:18:58 +0000 (18:18 -0400)
committerTom Lane
Sun, 7 Apr 2019 22:19:16 +0000 (18:19 -0400)
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

index 7b142e3b188dee63458c30222a6a4cd53e80b0c9..0c7a533e6972ee1c5d1cd38d99a5a17681f5ed76 100644 (file)
@@ -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)));