]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Bug 486293 - memccpy false positives
authorPaul Floyd <pjfloyd@wanadoo.fr>
Wed, 1 May 2024 07:24:14 +0000 (09:24 +0200)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Sat, 4 May 2024 12:44:00 +0000 (14:44 +0200)
NEWS
memcheck/tests/memccpy2.c
memcheck/tests/memccpy2.stderr.exp
shared/vg_replace_strmem.c

diff --git a/NEWS b/NEWS
index 1e57a39bf42540cb281981e581d9b1430d3fc71e..fb76e5b2fdefca33f2b20f3bc655b6535d2b1951 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -24,6 +24,7 @@ than mailing the developers (or mailing lists) directly -- bugs that
 are not entered into bugzilla tend to get forgotten about or ignored.
 
 486180  [Valgrind][MIPS] 'VexGuestArchState' has no member named 'guest_IP_AT_SYSCALL'
+486293  memccpy false positives
 
 To see details of a given bug, visit
   https://bugs.kde.org/show_bug.cgi?id=XXXXXX
index a5a1dfc9f0af773a61bdf5344ca27d17da9ce0fb..947324581715a7cb52fff98f72ebe05d4182c183 100644 (file)
@@ -1,6 +1,8 @@
 #include <ctype.h>
 #include <stdio.h>
 #include <string.h>
+#include <assert.h>
+#include <stdlib.h>
  
 int main(void)
 {
@@ -9,5 +11,23 @@ int main(void)
    memccpy(astring+10, astring, '#', len-10);
    sprintf(astring, "this is a string # with something to seek");
    memccpy(astring, astring+10, '#', len);
+   
+   sprintf(astring, "this is a string # with something to seek");
+   /*
+    * space is earlier than len, no overlap
+    * "this " gets copied (up to and including the first ' ')
+    * and it overwrites the destination starting with the 's' of "string"
+    * so res will point to the 'g' of "string"
+    */
+   char* res = memccpy(astring+10, astring, ' ', len-10);
+   assert(res && *res == 'g');
+   sprintf(astring, "this is a string # with something to seek");
+   /* length is 0, nothing copied, returns NULL */
+   res = memccpy(astring, "abcdefhhijklmnopqrstuvwxy", 'z', 0);
+   assert(NULL == res);
+   /* 'z' not found so 20 bytes copied, returns NULL */
+   res = memccpy(astring, "abcdefhhijklmnopqrstuvwxy", 'z', 20);
+   assert(NULL == res);
+   free(astring);
 }
 
index 0132ef06c56a0f53574cdd75e3871b23c8175d97..240ce925c182a9f077d288f38a51ecb5e8b6930f 100644 (file)
@@ -1,8 +1,8 @@
 Source and destination overlap in memccpy(0x........, 0x........, 31)
    at 0x........: memccpy (vg_replace_strmem.c:...)
-   by 0x........: main (memccpy2.c:9)
+   by 0x........: main (memccpy2.c:11)
 
 Source and destination overlap in memccpy(0x........, 0x........, 41)
    at 0x........: memccpy (vg_replace_strmem.c:...)
-   by 0x........: main (memccpy2.c:11)
+   by 0x........: main (memccpy2.c:13)
 
index 737abbf67898facd622eb7f14e865e74db670d51..ae13a2a5f87a34e704e2ceec35a2c712f7248141 100644 (file)
@@ -2364,9 +2364,9 @@ static inline void my_exit ( int x )
       \
       while (i-- > 0) \
          if ((*d++ = *s++) == x) { \
-            SizeT srclen = (i < len) ? i : len; \
+            SizeT srclen = len - i; \
             RECORD_COPY(srclen); \
-            if (is_overlap(dst, src, srclen, srclen)) \
+            if (is_overlap(dst, src, len, srclen)) \
                RECORD_OVERLAP_ERROR("memccpy", dst, src, len); \
             return d; \
          } \