Commit 7a1d4a24 authored by Andres Freund's avatar Andres Freund

ltree: Zero padding bytes when allocating memory for externally visible data.

ltree/ltree_gist/ltxtquery's headers stores data at MAXALIGN alignment,
requiring some padding bytes. So far we left these uninitialized. Zero
those by using palloc0.

Author: Andres Freund
Reported-By: Andres Freund / valgrind / buildarm animal skink
Backpatch: 9.1-
parent 61fd2189
...@@ -85,7 +85,7 @@ _ltree_compress(PG_FUNCTION_ARGS) ...@@ -85,7 +85,7 @@ _ltree_compress(PG_FUNCTION_ARGS)
(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
errmsg("array must not contain nulls"))); errmsg("array must not contain nulls")));
key = (ltree_gist *) palloc(len); key = (ltree_gist *) palloc0(len);
SET_VARSIZE(key, len); SET_VARSIZE(key, len);
key->flag = 0; key->flag = 0;
...@@ -116,7 +116,7 @@ _ltree_compress(PG_FUNCTION_ARGS) ...@@ -116,7 +116,7 @@ _ltree_compress(PG_FUNCTION_ARGS)
PG_RETURN_POINTER(retval); PG_RETURN_POINTER(retval);
} }
len = LTG_HDRSIZE; len = LTG_HDRSIZE;
key = (ltree_gist *) palloc(len); key = (ltree_gist *) palloc0(len);
SET_VARSIZE(key, len); SET_VARSIZE(key, len);
key->flag = LTG_ALLTRUE; key->flag = LTG_ALLTRUE;
...@@ -196,7 +196,7 @@ _ltree_union(PG_FUNCTION_ARGS) ...@@ -196,7 +196,7 @@ _ltree_union(PG_FUNCTION_ARGS)
} }
len = LTG_HDRSIZE + ((flag & LTG_ALLTRUE) ? 0 : ASIGLEN); len = LTG_HDRSIZE + ((flag & LTG_ALLTRUE) ? 0 : ASIGLEN);
result = (ltree_gist *) palloc(len); result = (ltree_gist *) palloc0(len);
SET_VARSIZE(result, len); SET_VARSIZE(result, len);
result->flag = flag; result->flag = flag;
if (!LTG_ISALLTRUE(result)) if (!LTG_ISALLTRUE(result))
...@@ -333,26 +333,26 @@ _ltree_picksplit(PG_FUNCTION_ARGS) ...@@ -333,26 +333,26 @@ _ltree_picksplit(PG_FUNCTION_ARGS)
/* form initial .. */ /* form initial .. */
if (LTG_ISALLTRUE(GETENTRY(entryvec, seed_1))) if (LTG_ISALLTRUE(GETENTRY(entryvec, seed_1)))
{ {
datum_l = (ltree_gist *) palloc(LTG_HDRSIZE); datum_l = (ltree_gist *) palloc0(LTG_HDRSIZE);
SET_VARSIZE(datum_l, LTG_HDRSIZE); SET_VARSIZE(datum_l, LTG_HDRSIZE);
datum_l->flag = LTG_ALLTRUE; datum_l->flag = LTG_ALLTRUE;
} }
else else
{ {
datum_l = (ltree_gist *) palloc(LTG_HDRSIZE + ASIGLEN); datum_l = (ltree_gist *) palloc0(LTG_HDRSIZE + ASIGLEN);
SET_VARSIZE(datum_l, LTG_HDRSIZE + ASIGLEN); SET_VARSIZE(datum_l, LTG_HDRSIZE + ASIGLEN);
datum_l->flag = 0; datum_l->flag = 0;
memcpy((void *) LTG_SIGN(datum_l), (void *) LTG_SIGN(GETENTRY(entryvec, seed_1)), sizeof(ABITVEC)); memcpy((void *) LTG_SIGN(datum_l), (void *) LTG_SIGN(GETENTRY(entryvec, seed_1)), sizeof(ABITVEC));
} }
if (LTG_ISALLTRUE(GETENTRY(entryvec, seed_2))) if (LTG_ISALLTRUE(GETENTRY(entryvec, seed_2)))
{ {
datum_r = (ltree_gist *) palloc(LTG_HDRSIZE); datum_r = (ltree_gist *) palloc0(LTG_HDRSIZE);
SET_VARSIZE(datum_r, LTG_HDRSIZE); SET_VARSIZE(datum_r, LTG_HDRSIZE);
datum_r->flag = LTG_ALLTRUE; datum_r->flag = LTG_ALLTRUE;
} }
else else
{ {
datum_r = (ltree_gist *) palloc(LTG_HDRSIZE + ASIGLEN); datum_r = (ltree_gist *) palloc0(LTG_HDRSIZE + ASIGLEN);
SET_VARSIZE(datum_r, LTG_HDRSIZE + ASIGLEN); SET_VARSIZE(datum_r, LTG_HDRSIZE + ASIGLEN);
datum_r->flag = 0; datum_r->flag = 0;
memcpy((void *) LTG_SIGN(datum_r), (void *) LTG_SIGN(GETENTRY(entryvec, seed_2)), sizeof(ABITVEC)); memcpy((void *) LTG_SIGN(datum_r), (void *) LTG_SIGN(GETENTRY(entryvec, seed_2)), sizeof(ABITVEC));
......
...@@ -211,7 +211,7 @@ _ltree_extract_isparent(PG_FUNCTION_ARGS) ...@@ -211,7 +211,7 @@ _ltree_extract_isparent(PG_FUNCTION_ARGS)
PG_RETURN_NULL(); PG_RETURN_NULL();
} }
item = (ltree *) palloc(VARSIZE(found)); item = (ltree *) palloc0(VARSIZE(found));
memcpy(item, found, VARSIZE(found)); memcpy(item, found, VARSIZE(found));
PG_FREE_IF_COPY(la, 0); PG_FREE_IF_COPY(la, 0);
...@@ -234,7 +234,7 @@ _ltree_extract_risparent(PG_FUNCTION_ARGS) ...@@ -234,7 +234,7 @@ _ltree_extract_risparent(PG_FUNCTION_ARGS)
PG_RETURN_NULL(); PG_RETURN_NULL();
} }
item = (ltree *) palloc(VARSIZE(found)); item = (ltree *) palloc0(VARSIZE(found));
memcpy(item, found, VARSIZE(found)); memcpy(item, found, VARSIZE(found));
PG_FREE_IF_COPY(la, 0); PG_FREE_IF_COPY(la, 0);
...@@ -257,7 +257,7 @@ _ltq_extract_regex(PG_FUNCTION_ARGS) ...@@ -257,7 +257,7 @@ _ltq_extract_regex(PG_FUNCTION_ARGS)
PG_RETURN_NULL(); PG_RETURN_NULL();
} }
item = (ltree *) palloc(VARSIZE(found)); item = (ltree *) palloc0(VARSIZE(found));
memcpy(item, found, VARSIZE(found)); memcpy(item, found, VARSIZE(found));
PG_FREE_IF_COPY(la, 0); PG_FREE_IF_COPY(la, 0);
...@@ -280,7 +280,7 @@ _ltxtq_extract_exec(PG_FUNCTION_ARGS) ...@@ -280,7 +280,7 @@ _ltxtq_extract_exec(PG_FUNCTION_ARGS)
PG_RETURN_NULL(); PG_RETURN_NULL();
} }
item = (ltree *) palloc(VARSIZE(found)); item = (ltree *) palloc0(VARSIZE(found));
memcpy(item, found, VARSIZE(found)); memcpy(item, found, VARSIZE(found));
PG_FREE_IF_COPY(la, 0); PG_FREE_IF_COPY(la, 0);
......
...@@ -56,7 +56,7 @@ ltree_compress(PG_FUNCTION_ARGS) ...@@ -56,7 +56,7 @@ ltree_compress(PG_FUNCTION_ARGS)
ltree *val = (ltree *) DatumGetPointer(PG_DETOAST_DATUM(entry->key)); ltree *val = (ltree *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
int32 len = LTG_HDRSIZE + VARSIZE(val); int32 len = LTG_HDRSIZE + VARSIZE(val);
key = (ltree_gist *) palloc(len); key = (ltree_gist *) palloc0(len);
SET_VARSIZE(key, len); SET_VARSIZE(key, len);
key->flag = LTG_ONENODE; key->flag = LTG_ONENODE;
memcpy((void *) LTG_NODE(key), (void *) val, VARSIZE(val)); memcpy((void *) LTG_NODE(key), (void *) val, VARSIZE(val));
...@@ -213,7 +213,7 @@ ltree_union(PG_FUNCTION_ARGS) ...@@ -213,7 +213,7 @@ ltree_union(PG_FUNCTION_ARGS)
isleqr = (left == right || ISEQ(left, right)) ? true : false; isleqr = (left == right || ISEQ(left, right)) ? true : false;
*size = LTG_HDRSIZE + ((isalltrue) ? 0 : SIGLEN) + VARSIZE(left) + ((isleqr) ? 0 : VARSIZE(right)); *size = LTG_HDRSIZE + ((isalltrue) ? 0 : SIGLEN) + VARSIZE(left) + ((isleqr) ? 0 : VARSIZE(right));
result = (ltree_gist *) palloc(*size); result = (ltree_gist *) palloc0(*size);
SET_VARSIZE(result, *size); SET_VARSIZE(result, *size);
result->flag = 0; result->flag = 0;
...@@ -386,7 +386,7 @@ ltree_picksplit(PG_FUNCTION_ARGS) ...@@ -386,7 +386,7 @@ ltree_picksplit(PG_FUNCTION_ARGS)
lu_l = LTG_GETLNODE(GETENTRY(entryvec, array[FirstOffsetNumber].index)); lu_l = LTG_GETLNODE(GETENTRY(entryvec, array[FirstOffsetNumber].index));
isleqr = (lu_l == lu_r || ISEQ(lu_l, lu_r)) ? true : false; isleqr = (lu_l == lu_r || ISEQ(lu_l, lu_r)) ? true : false;
size = LTG_HDRSIZE + ((lisat) ? 0 : SIGLEN) + VARSIZE(lu_l) + ((isleqr) ? 0 : VARSIZE(lu_r)); size = LTG_HDRSIZE + ((lisat) ? 0 : SIGLEN) + VARSIZE(lu_l) + ((isleqr) ? 0 : VARSIZE(lu_r));
lu = (ltree_gist *) palloc(size); lu = (ltree_gist *) palloc0(size);
SET_VARSIZE(lu, size); SET_VARSIZE(lu, size);
lu->flag = 0; lu->flag = 0;
if (lisat) if (lisat)
...@@ -403,7 +403,7 @@ ltree_picksplit(PG_FUNCTION_ARGS) ...@@ -403,7 +403,7 @@ ltree_picksplit(PG_FUNCTION_ARGS)
ru_l = LTG_GETLNODE(GETENTRY(entryvec, array[1 + ((maxoff - FirstOffsetNumber + 1) / 2)].index)); ru_l = LTG_GETLNODE(GETENTRY(entryvec, array[1 + ((maxoff - FirstOffsetNumber + 1) / 2)].index));
isleqr = (ru_l == ru_r || ISEQ(ru_l, ru_r)) ? true : false; isleqr = (ru_l == ru_r || ISEQ(ru_l, ru_r)) ? true : false;
size = LTG_HDRSIZE + ((risat) ? 0 : SIGLEN) + VARSIZE(ru_l) + ((isleqr) ? 0 : VARSIZE(ru_r)); size = LTG_HDRSIZE + ((risat) ? 0 : SIGLEN) + VARSIZE(ru_l) + ((isleqr) ? 0 : VARSIZE(ru_r));
ru = (ltree_gist *) palloc(size); ru = (ltree_gist *) palloc0(size);
SET_VARSIZE(ru, size); SET_VARSIZE(ru, size);
ru->flag = 0; ru->flag = 0;
if (risat) if (risat)
...@@ -445,7 +445,7 @@ gist_isparent(ltree_gist *key, ltree *query) ...@@ -445,7 +445,7 @@ gist_isparent(ltree_gist *key, ltree *query)
static ltree * static ltree *
copy_ltree(ltree *src) copy_ltree(ltree *src)
{ {
ltree *dst = (ltree *) palloc(VARSIZE(src)); ltree *dst = (ltree *) palloc0(VARSIZE(src));
memcpy(dst, src, VARSIZE(src)); memcpy(dst, src, VARSIZE(src));
return dst; return dst;
......
...@@ -211,7 +211,7 @@ inner_subltree(ltree *t, int32 startpos, int32 endpos) ...@@ -211,7 +211,7 @@ inner_subltree(ltree *t, int32 startpos, int32 endpos)
ptr = LEVEL_NEXT(ptr); ptr = LEVEL_NEXT(ptr);
} }
res = (ltree *) palloc(LTREE_HDRSIZE + (end - start)); res = (ltree *) palloc0(LTREE_HDRSIZE + (end - start));
SET_VARSIZE(res, LTREE_HDRSIZE + (end - start)); SET_VARSIZE(res, LTREE_HDRSIZE + (end - start));
res->numlevel = endpos - startpos; res->numlevel = endpos - startpos;
...@@ -268,7 +268,7 @@ ltree_concat(ltree *a, ltree *b) ...@@ -268,7 +268,7 @@ ltree_concat(ltree *a, ltree *b)
{ {
ltree *r; ltree *r;
r = (ltree *) palloc(VARSIZE(a) + VARSIZE(b) - LTREE_HDRSIZE); r = (ltree *) palloc0(VARSIZE(a) + VARSIZE(b) - LTREE_HDRSIZE);
SET_VARSIZE(r, VARSIZE(a) + VARSIZE(b) - LTREE_HDRSIZE); SET_VARSIZE(r, VARSIZE(a) + VARSIZE(b) - LTREE_HDRSIZE);
r->numlevel = a->numlevel + b->numlevel; r->numlevel = a->numlevel + b->numlevel;
...@@ -450,7 +450,7 @@ lca_inner(ltree **a, int len) ...@@ -450,7 +450,7 @@ lca_inner(ltree **a, int len)
l1 = LEVEL_NEXT(l1); l1 = LEVEL_NEXT(l1);
} }
res = (ltree *) palloc(reslen); res = (ltree *) palloc0(reslen);
SET_VARSIZE(res, reslen); SET_VARSIZE(res, reslen);
res->numlevel = num; res->numlevel = num;
......
...@@ -350,7 +350,7 @@ queryin(char *buf) ...@@ -350,7 +350,7 @@ queryin(char *buf)
errmsg("ltxtquery is too large"))); errmsg("ltxtquery is too large")));
commonlen = COMPUTESIZE(state.num, state.sumlen); commonlen = COMPUTESIZE(state.num, state.sumlen);
query = (ltxtquery *) palloc(commonlen); query = (ltxtquery *) palloc0(commonlen);
SET_VARSIZE(query, commonlen); SET_VARSIZE(query, commonlen);
query->size = state.num; query->size = state.num;
ptr = GETQUERY(query); ptr = GETQUERY(query);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment