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.
REL8_4_STABLE
Heikki Linnakangas 12 years ago
parent 8607099a19
commit e31d77c96f
  1. 12
      contrib/btree_gist/btree_bit.c

@ -70,10 +70,14 @@ static bytea *
gbt_bit_xfrm(bytea *leaf) gbt_bit_xfrm(bytea *leaf)
{ {
bytea *out = leaf; bytea *out = leaf;
int s = INTALIGN(VARBITBYTES(leaf) + VARHDRSZ); int sz = VARBITBYTES(leaf) + VARHDRSZ;
int padded_sz = INTALIGN(sz);
out = palloc(s);
SET_VARSIZE(out, s); 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)); memcpy((void *) VARDATA(out), (void *) VARBITS(leaf), VARBITBYTES(leaf));
return out; return out;
} }

Loading…
Cancel
Save