[compiler-rt] r184545 - [msan] Intercept (v)asprintf.

Evgeniy Stepanov eugeni.stepanov at gmail.com
Fri Jun 21 06:32:26 PDT 2013


Author: eugenis
Date: Fri Jun 21 08:32:26 2013
New Revision: 184545

URL: http://llvm.org/viewvc/llvm-project?rev=184545&view=rev
Log:
[msan] Intercept (v)asprintf.

Modified:
    compiler-rt/trunk/lib/msan/msan_interceptors.cc
    compiler-rt/trunk/lib/msan/tests/msan_test.cc

Modified: compiler-rt/trunk/lib/msan/msan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan_interceptors.cc?rev=184545&r1=184544&r2=184545&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/msan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/msan/msan_interceptors.cc Fri Jun 21 08:32:26 2013
@@ -311,11 +311,30 @@ INTERCEPTOR(long double, strtold, const
   return res;
 }
 
+INTERCEPTOR(int, vasprintf, char **strp, const char *format, va_list ap) {
+  ENSURE_MSAN_INITED();
+  int res = REAL(vasprintf)(strp, format, ap);
+  if (res >= 0 && !__msan_has_dynamic_component()) {
+    __msan_unpoison(strp, sizeof(*strp));
+    __msan_unpoison(*strp, res + 1);
+  }
+  return res;
+}
+
+INTERCEPTOR(int, asprintf, char **strp, const char *format, ...) {  // NOLINT
+  ENSURE_MSAN_INITED();
+  va_list ap;
+  va_start(ap, format);
+  int res = vasprintf(strp, format, ap);  // NOLINT
+  va_end(ap);
+  return res;
+}
+
 INTERCEPTOR(int, vsnprintf, char *str, uptr size,
             const char *format, va_list ap) {
   ENSURE_MSAN_INITED();
   int res = REAL(vsnprintf)(str, size, format, ap);
-  if (!__msan_has_dynamic_component()) {
+  if (res >= 0 && !__msan_has_dynamic_component()) {
     __msan_unpoison(str, res + 1);
   }
   return res;
@@ -324,7 +343,7 @@ INTERCEPTOR(int, vsnprintf, char *str, u
 INTERCEPTOR(int, vsprintf, char *str, const char *format, va_list ap) {
   ENSURE_MSAN_INITED();
   int res = REAL(vsprintf)(str, format, ap);
-  if (!__msan_has_dynamic_component()) {
+  if (res >= 0 && !__msan_has_dynamic_component()) {
     __msan_unpoison(str, res + 1);
   }
   return res;
@@ -333,7 +352,7 @@ INTERCEPTOR(int, vsprintf, char *str, co
 INTERCEPTOR(int, vswprintf, void *str, uptr size, void *format, va_list ap) {
   ENSURE_MSAN_INITED();
   int res = REAL(vswprintf)(str, size, format, ap);
-  if (!__msan_has_dynamic_component()) {
+  if (res >= 0 && !__msan_has_dynamic_component()) {
     __msan_unpoison(str, 4 * (res + 1));
   }
   return res;
@@ -1144,6 +1163,8 @@ void InitializeInterceptors() {
   INTERCEPT_FUNCTION(strtod);
   INTERCEPT_FUNCTION(strtof);
   INTERCEPT_FUNCTION(strtold);
+  INTERCEPT_FUNCTION(vasprintf);
+  INTERCEPT_FUNCTION(asprintf);
   INTERCEPT_FUNCTION(vsprintf);
   INTERCEPT_FUNCTION(vsnprintf);
   INTERCEPT_FUNCTION(vswprintf);

Modified: compiler-rt/trunk/lib/msan/tests/msan_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/tests/msan_test.cc?rev=184545&r1=184544&r2=184545&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/tests/msan_test.cc (original)
+++ compiler-rt/trunk/lib/msan/tests/msan_test.cc Fri Jun 21 08:32:26 2013
@@ -1055,6 +1055,20 @@ TEST(MemorySanitizer, swprintf) {
   EXPECT_POISONED(buff[8]);
 }
 
+TEST(MemorySanitizer, asprintf) {  // NOLINT
+  char *pbuf;
+  EXPECT_POISONED(pbuf);
+  int res = asprintf(&pbuf, "%d", 1234567);  // NOLINT
+  assert(res == 7);
+  EXPECT_NOT_POISONED(pbuf);
+  assert(pbuf[0] == '1');
+  assert(pbuf[1] == '2');
+  assert(pbuf[2] == '3');
+  assert(pbuf[6] == '7');
+  assert(pbuf[7] == 0);
+  free(pbuf);
+}
+
 TEST(MemorySanitizer, wcstombs) {
   const wchar_t *x = L"abc";
   char buff[10];





More information about the llvm-commits mailing list