]> granicus.if.org Git - postgresql/commitdiff
Avoid memcpy() with same source and destination address.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 7 Mar 2014 11:13:33 +0000 (13:13 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 7 Mar 2014 11:29:47 +0000 (13:29 +0200)
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
src/backend/utils/adt/tsvector.c

index 31929c00acff018e0e48d8b00892acaf2fcbdac0..a7f13b2a94c3b7238e634567c30adc322d4bb8a7 100644 (file)
@@ -128,20 +128,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;
index 6810615a2537a4ac8684d4cbd3be86529bcfa6a2..b28a32d69d06b2b38ac51baa00f92136b12cf20a 100644 (file)
@@ -125,7 +125,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)
                {