]> granicus.if.org Git - postgresql/commitdiff
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:10 +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 e999a8e12cb8f4a1dfaf2f2f6f1995e709277a35..7a741a779c839c1eb01bf433c5ea12aff10c7db1 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++;