ltree: Zero padding bytes when allocating memory for externally visible data.
authorAndres Freund <andres@anarazel.de>
Tue, 8 Mar 2016 22:59:29 +0000 (14:59 -0800)
committerAndres Freund <andres@anarazel.de>
Tue, 8 Mar 2016 22:59:29 +0000 (14:59 -0800)
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-

contrib/ltree/_ltree_gist.c
contrib/ltree/_ltree_op.c
contrib/ltree/ltree_gist.c
contrib/ltree/ltree_op.c
contrib/ltree/ltxtquery_io.c

index 93507158c02de047c127af92233c42b4cde366a9..7547efc7426219b7168f8b7e0435336f53a24290 100644 (file)
@@ -96,7 +96,7 @@ _ltree_compress(PG_FUNCTION_ARGS)
                    (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
                     errmsg("array must not contain nulls")));
 
-       key = (ltree_gist *) palloc(len);
+       key = (ltree_gist *) palloc0(len);
        SET_VARSIZE(key, len);
        key->flag = 0;
 
@@ -127,7 +127,7 @@ _ltree_compress(PG_FUNCTION_ARGS)
                PG_RETURN_POINTER(retval);
        }
        len = LTG_HDRSIZE;
-       key = (ltree_gist *) palloc(len);
+       key = (ltree_gist *) palloc0(len);
        SET_VARSIZE(key, len);
        key->flag = LTG_ALLTRUE;
 
@@ -207,7 +207,7 @@ _ltree_union(PG_FUNCTION_ARGS)
    }
 
    len = LTG_HDRSIZE + ((flag & LTG_ALLTRUE) ? 0 : ASIGLEN);
-   result = (ltree_gist *) palloc(len);
+   result = (ltree_gist *) palloc0(len);
    SET_VARSIZE(result, len);
    result->flag = flag;
    if (!LTG_ISALLTRUE(result))
@@ -344,26 +344,26 @@ _ltree_picksplit(PG_FUNCTION_ARGS)
    /* form initial .. */
    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);
        datum_l->flag = LTG_ALLTRUE;
    }
    else
    {
-       datum_l = (ltree_gist *) palloc(LTG_HDRSIZE + ASIGLEN);
+       datum_l = (ltree_gist *) palloc0(LTG_HDRSIZE + ASIGLEN);
        SET_VARSIZE(datum_l, LTG_HDRSIZE + ASIGLEN);
        datum_l->flag = 0;
        memcpy((void *) LTG_SIGN(datum_l), (void *) LTG_SIGN(GETENTRY(entryvec, seed_1)), sizeof(ABITVEC));
    }
    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);
        datum_r->flag = LTG_ALLTRUE;
    }
    else
    {
-       datum_r = (ltree_gist *) palloc(LTG_HDRSIZE + ASIGLEN);
+       datum_r = (ltree_gist *) palloc0(LTG_HDRSIZE + ASIGLEN);
        SET_VARSIZE(datum_r, LTG_HDRSIZE + ASIGLEN);
        datum_r->flag = 0;
        memcpy((void *) LTG_SIGN(datum_r), (void *) LTG_SIGN(GETENTRY(entryvec, seed_2)), sizeof(ABITVEC));
index 1b53af816d91c4e054624df6e603dcd624f891ad..2bc75cee6ba7fd7875c3d568a16d8a2b2332f653 100644 (file)
@@ -219,7 +219,7 @@ _ltree_extract_isparent(PG_FUNCTION_ARGS)
        PG_RETURN_NULL();
    }
 
-   item = (ltree *) palloc(VARSIZE(found));
+   item = (ltree *) palloc0(VARSIZE(found));
    memcpy(item, found, VARSIZE(found));
 
    PG_FREE_IF_COPY(la, 0);
@@ -242,7 +242,7 @@ _ltree_extract_risparent(PG_FUNCTION_ARGS)
        PG_RETURN_NULL();
    }
 
-   item = (ltree *) palloc(VARSIZE(found));
+   item = (ltree *) palloc0(VARSIZE(found));
    memcpy(item, found, VARSIZE(found));
 
    PG_FREE_IF_COPY(la, 0);
@@ -265,7 +265,7 @@ _ltq_extract_regex(PG_FUNCTION_ARGS)
        PG_RETURN_NULL();
    }
 
-   item = (ltree *) palloc(VARSIZE(found));
+   item = (ltree *) palloc0(VARSIZE(found));
    memcpy(item, found, VARSIZE(found));
 
    PG_FREE_IF_COPY(la, 0);
@@ -288,7 +288,7 @@ _ltxtq_extract_exec(PG_FUNCTION_ARGS)
        PG_RETURN_NULL();
    }
 
-   item = (ltree *) palloc(VARSIZE(found));
+   item = (ltree *) palloc0(VARSIZE(found));
    memcpy(item, found, VARSIZE(found));
 
    PG_FREE_IF_COPY(la, 0);
index 5324c65f59ef86be0bad50f24104cbb0e2e0c102..11049b6a2b299d20df5b791328db71273f5da1d1 100644 (file)
@@ -72,7 +72,7 @@ ltree_compress(PG_FUNCTION_ARGS)
        ltree      *val = (ltree *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
        int32       len = LTG_HDRSIZE + VARSIZE(val);
 
-       key = (ltree_gist *) palloc(len);
+       key = (ltree_gist *) palloc0(len);
        SET_VARSIZE(key, len);
        key->flag = LTG_ONENODE;
        memcpy((void *) LTG_NODE(key), (void *) val, VARSIZE(val));
@@ -229,7 +229,7 @@ ltree_union(PG_FUNCTION_ARGS)
    isleqr = (left == right || ISEQ(left, right)) ? true : false;
    *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);
    result->flag = 0;
 
@@ -402,7 +402,7 @@ ltree_picksplit(PG_FUNCTION_ARGS)
    lu_l = LTG_GETLNODE(GETENTRY(entryvec, array[FirstOffsetNumber].index));
    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));
-   lu = (ltree_gist *) palloc(size);
+   lu = (ltree_gist *) palloc0(size);
    SET_VARSIZE(lu, size);
    lu->flag = 0;
    if (lisat)
@@ -419,7 +419,7 @@ ltree_picksplit(PG_FUNCTION_ARGS)
    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;
    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);
    ru->flag = 0;
    if (risat)
@@ -461,7 +461,7 @@ gist_isparent(ltree_gist *key, ltree *query)
 static ltree *
 copy_ltree(ltree *src)
 {
-   ltree      *dst = (ltree *) palloc(VARSIZE(src));
+   ltree      *dst = (ltree *) palloc0(VARSIZE(src));
 
    memcpy(dst, src, VARSIZE(src));
    return dst;
index 3a64da51edaac7b546684bc1c32c6e10b5b14ead..88f6d5a85c21d1b46d411b798b8ee5aff7e5b4c4 100644 (file)
@@ -230,7 +230,7 @@ inner_subltree(ltree *t, int32 startpos, int32 endpos)
        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));
    res->numlevel = endpos - startpos;
 
@@ -287,7 +287,7 @@ ltree_concat(ltree *a, ltree *b)
 {
    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);
    r->numlevel = a->numlevel + b->numlevel;
 
@@ -469,7 +469,7 @@ lca_inner(ltree **a, int len)
        l1 = LEVEL_NEXT(l1);
    }
 
-   res = (ltree *) palloc(reslen);
+   res = (ltree *) palloc0(reslen);
    SET_VARSIZE(res, reslen);
    res->numlevel = num;
 
index 0518218395d9fb4070e281bdd38a1a68a982a3c0..a74de74a3ba57ba2deed65d4a7d881056e29fb73 100644 (file)
@@ -353,7 +353,7 @@ queryin(char *buf)
                 errmsg("ltxtquery is too large")));
    commonlen = COMPUTESIZE(state.num, state.sumlen);
 
-   query = (ltxtquery *) palloc(commonlen);
+   query = (ltxtquery *) palloc0(commonlen);
    SET_VARSIZE(query, commonlen);
    query->size = state.num;
    ptr = GETQUERY(query);