Avoid formally-undefined use of memcpy() in hstoreUniquePairs().
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 25 Nov 2017 19:42:10 +0000 (14:42 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 25 Nov 2017 19:42:25 +0000 (14:42 -0500)
hstoreUniquePairs() often called memcpy with equal source and destination
pointers.  Although this is almost surely harmless in practice, it's
undefined according to the letter of the C standard.  Some versions of
valgrind will complain about it, and some versions of libc as well
(cf. commit ad520ec4a).  Tweak the code to avoid doing that.

Noted by Tomas Vondra.  Back-patch to all supported versions because
of the hazard of libc assertions.

Discussion: https://postgr.es/m/bf84d940-90d4-de91-19dd-612e011007f4@fuzzy.cz

contrib/hstore/hstore_io.c

index e03005c9232b1244738c21e17f05224472820919..8b44b290e4d82ad3737abdd3e458dca475f1cac0 100644 (file)
@@ -340,7 +340,8 @@ hstoreUniquePairs(Pairs *a, int32 l, int32 *buflen)
        {
            *buflen += res->keylen + ((res->isnull) ? 0 : res->vallen);
            res++;
-           memcpy(res, ptr, sizeof(Pairs));
+           if (res != ptr)
+               memcpy(res, ptr, sizeof(Pairs));
        }
 
        ptr++;