]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Intercept __stpcpy_chk. (Dirk Mueller)
authorJulian Seward <jseward@acm.org>
Sat, 27 Jan 2007 00:49:44 +0000 (00:49 +0000)
committerJulian Seward <jseward@acm.org>
Sat, 27 Jan 2007 00:49:44 +0000 (00:49 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@6553

memcheck/mc_replace_strmem.c

index 72dba66ee2b41fb8e66320e70bb12bb0c4135191..6195b563fc839d3a7025cd6b8373426640531c66 100644 (file)
@@ -568,6 +568,31 @@ GLIBC232_RAWMEMCHR(m_libc_soname, rawmemchr)
 GLIBC25___STRCPY_CHK(m_libc_soname, __strcpy_chk)
 
 
+/* glibc variant of stpcpy that checks the dest is big enough. */
+#define GLIBC25___STPCPY_CHK(soname,fnname) \
+   char* VG_REPLACE_FUNCTION_ZU(soname,fnname) \
+                               (char* dst, const char* src, SizeT len); \
+   char* VG_REPLACE_FUNCTION_ZU(soname,fnname) \
+                               (char* dst, const char* src, SizeT len) \
+   { \
+      extern void _exit(int status); \
+      do { \
+         if (len-- == 0) \
+            goto badness; \
+         *dst++ = *src; \
+      } while (*src++ != '\0'); \
+      return dst - 1; \
+     badness: \
+      VALGRIND_PRINTF_BACKTRACE( \
+         "***buffer overflow detected ***: program terminated"); \
+     _exit(127); \
+     /*NOTREACHED*/ \
+     return NULL; \
+   }
+
+GLIBC25___STPCPY_CHK(m_libc_soname, __stpcpy_chk)
+
+
 /* mempcpy */
 #define GLIBC25_MEMPCPY(soname, fnname) \
    void* VG_REPLACE_FUNCTION_ZU(soname,fnname) \