utf8.c: Don't copy a buffer to itself
authorKarl Williamson <public@khwilliamson.com>
Mon, 12 Nov 2012 23:43:12 +0000 (16:43 -0700)
committerKarl Williamson <public@khwilliamson.com>
Wed, 14 Nov 2012 17:08:09 +0000 (10:08 -0700)
memcpy(), which is what Copy() resolves to, is not supposed to handle
the possibility of overlapping source and destination.  In some cases
in this code, the source and destination pointers are identical.  What
should happen then is a no-op, so just don't do the copy in that case.
If the ptrs aren't identical, they won't otherwise overlap, so the
Copy() is valid except for when they are identical.

utf8.c

diff --git a/utf8.c b/utf8.c
index 3ee9f2d..322bc46 100644 (file)
--- a/utf8.c
+++ b/utf8.c
@@ -2366,7 +2366,9 @@ Perl_to_utf8_case(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp,
     /* Here, there was no mapping defined, which means that the code point maps
      * to itself.  Return the inputs */
     len = UTF8SKIP(p);
-    Copy(p, ustrp, len, U8);
+    if (p != ustrp) {   /* Don't copy onto itself */
+        Copy(p, ustrp, len, U8);
+    }
 
     if (lenp)
         *lenp = len;