diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2019-04-07 18:18:59 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2019-04-07 18:18:59 -0400 |
commit | a7ca25cf787c563a92eef5eff1a8d2bb1364a992 (patch) | |
tree | 049bd58d61d4d85069e443d086dac85dbe439a4d | |
parent | 10e3991fad8a300ed268878ae30c96074628c1e1 (diff) | |
download | postgresql-a7ca25cf787c563a92eef5eff1a8d2bb1364a992.tar.gz postgresql-a7ca25cf787c563a92eef5eff1a8d2bb1364a992.zip |
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.
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 01ad716605c..54f5cac1e3e 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -1305,7 +1305,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; @@ -1367,10 +1366,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))); |