diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2017-11-25 14:42:10 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2017-11-25 14:42:10 -0500 |
commit | d3f4e8a8a78be60f3a971f1f8ef6acc2d0576e5f (patch) | |
tree | 7dc66e011afbba57ccbc79a040b3c475e0bd8205 | |
parent | 9b63c13f0a213bfb38bb70a3df3f28cc1f496b30 (diff) | |
download | postgresql-d3f4e8a8a78be60f3a971f1f8ef6acc2d0576e5f.tar.gz postgresql-d3f4e8a8a78be60f3a971f1f8ef6acc2d0576e5f.zip |
Avoid formally-undefined use of memcpy() in hstoreUniquePairs().
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
-rw-r--r-- | contrib/hstore/hstore_io.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/contrib/hstore/hstore_io.c b/contrib/hstore/hstore_io.c index e999a8e12cb..7a741a779c8 100644 --- a/contrib/hstore/hstore_io.c +++ b/contrib/hstore/hstore_io.c @@ -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++; |