summaryrefslogtreecommitdiff
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:41 -0500
commit5c38ddebd66bc239b23fe20d489fe03c9ebd4e28 (patch)
treeeb3e79d5889727a7f962b58d3a15f19ae6de58cf
parent2e105cf6db214ec69e62e4c4dfc71e39879485ae (diff)
downloadpostgresql-5c38ddebd66bc239b23fe20d489fe03c9ebd4e28.tar.gz
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 079f662748..78256cac68 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++;