From ad7b48ea08d6c33bae0a33c5f2a06272293c0f2f Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Fri, 7 Mar 2014 13:13:33 +0200
Subject: [PATCH] Avoid memcpy() with same source and destination address.

The behavior of that is undefined, although unlikely to lead to problems in
practice.

Found by running regression tests with Valgrind.
---
 src/backend/tsearch/dict_ispell.c | 9 ++++-----
 src/backend/utils/adt/tsvector.c  | 3 ++-
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/backend/tsearch/dict_ispell.c b/src/backend/tsearch/dict_ispell.c
index 64e2fbe487c..4316c357e13 100644
--- a/src/backend/tsearch/dict_ispell.c
+++ b/src/backend/tsearch/dict_ispell.c
@@ -126,20 +126,19 @@ dispell_lexize(PG_FUNCTION_ARGS)
 	if (res == NULL)
 		PG_RETURN_POINTER(NULL);
 
-	ptr = cptr = res;
-	while (ptr->lexeme)
+	cptr = res;
+	for (ptr = cptr; ptr->lexeme; ptr++)
 	{
 		if (searchstoplist(&(d->stoplist), ptr->lexeme))
 		{
 			pfree(ptr->lexeme);
 			ptr->lexeme = NULL;
-			ptr++;
 		}
 		else
 		{
-			memcpy(cptr, ptr, sizeof(TSLexeme));
+			if (cptr != ptr)
+				memcpy(cptr, ptr, sizeof(TSLexeme));
 			cptr++;
-			ptr++;
 		}
 	}
 	cptr->lexeme = NULL;
diff --git a/src/backend/utils/adt/tsvector.c b/src/backend/utils/adt/tsvector.c
index 6396ad85777..9fdaa5b8b97 100644
--- a/src/backend/utils/adt/tsvector.c
+++ b/src/backend/utils/adt/tsvector.c
@@ -124,7 +124,8 @@ uniqueentry(WordEntryIN *a, int l, char *buf, int *outbuflen)
 				buflen += res->poslen * sizeof(WordEntryPos) + sizeof(uint16);
 			}
 			res++;
-			memcpy(res, ptr, sizeof(WordEntryIN));
+			if (res != ptr)
+				memcpy(res, ptr, sizeof(WordEntryIN));
 		}
 		else if (ptr->entry.haspos)
 		{
-- 
GitLab