aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2017-11-25 14:42:10 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2017-11-25 14:42:25 -0500
commitddba320059fcce0126ea43f0c0404d3ed1ce47aa (patch)
tree1e918f20d4e1d4d808f5ce6118ddedcdb71fd5c5
parent5dc7faa91e195a64f58057b7fb90778abfec065c (diff)
downloadpostgresql-ddba320059fcce0126ea43f0c0404d3ed1ce47aa.tar.gz
postgresql-ddba320059fcce0126ea43f0c0404d3ed1ce47aa.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.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/contrib/hstore/hstore_io.c b/contrib/hstore/hstore_io.c
index e03005c9232..8b44b290e4d 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++;