postgres.git / summary / log / commit / refs

commit    0d8d0d027723d4470a9e2571c499752aa6d8df7a
Author:   Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date:     Tue May 13 11:16:28 2014 +0000
First released in: 9.4.0, 8.4.22, 9.0.18, 9.1.14, 9.2.9, 9.3.5

    Initialize padding bytes in btree_gist varbit support.
    
    The code expands a varbit gist leaf key to a node key by copying the bit
    data twice in a varlen datum, as both the lower and upper key. The lower key
    was expanded to INTALIGN size, but the padding bytes were not initialized.
    That's a problem because when the lower/upper keys are compared, the padding
    bytes are used compared too, when the values are otherwise equal. That could
    lead to incorrect query results.
    
    REINDEX is advised for any btree_gist indexes on bit or bit varying data
    type, to fix any garbage padding bytes on disk.
    
    Per Valgrind, reported by Andres Freund. Backpatch to all supported
    versions.


contrib/btree_gist/btree_bit.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/contrib/btree_gist/btree_bit.c b/contrib/btree_gist/btree_bit.c index 5c0d198b090..0f6b70eb0ea 100644 --- a/contrib/btree_gist/btree_bit.c +++ b/contrib/btree_gist/btree_bit.c @@ -83,10 +83,14 @@ static bytea * gbt_bit_xfrm(bytea *leaf) { bytea *out = leaf; - int s = INTALIGN(VARBITBYTES(leaf) + VARHDRSZ); - - out = palloc(s); - SET_VARSIZE(out, s); + int sz = VARBITBYTES(leaf) + VARHDRSZ; + int padded_sz = INTALIGN(sz); + + out = (bytea *) palloc(padded_sz); + /* initialize the padding bytes to zero */ + while (sz < padded_sz) + ((char *) out)[sz++] = 0; + SET_VARSIZE(out, padded_sz); memcpy((void *) VARDATA(out), (void *) VARBITS(leaf), VARBITBYTES(leaf)); return out; } [parent: ada2ff45ec8f]