[dfsan] Add wrappers for v*printf functions
authorGeorge Balatsouras <gbalats@google.com>
Fri, 16 Jul 2021 21:53:32 +0000 (14:53 -0700)
committerGeorge Balatsouras <gbalats@google.com>
Thu, 22 Jul 2021 22:39:17 +0000 (15:39 -0700)
Functions `vsnprintf`, `vsprintf` and `vfprintf` commonly occur in DFSan warnings.

Reviewed By: stephan.yichao.zhao

Differential Revision: https://reviews.llvm.org/D106195

compiler-rt/lib/dfsan/dfsan_custom.cpp
compiler-rt/lib/dfsan/done_abilist.txt
compiler-rt/test/dfsan/custom.cpp

index 3185184..edc0754 100644 (file)
@@ -2460,6 +2460,49 @@ int __dfso_snprintf(char *str, size_t size, const char *format,
   return ret;
 }
 
+SANITIZER_INTERFACE_ATTRIBUTE
+int __dfsw_vsprintf(char *str, const char *format, dfsan_label str_label,
+                    dfsan_label format_label, dfsan_label *va_labels,
+                    dfsan_label *ret_label, va_list ap) {
+  int ret = format_buffer(str, ~0ul, format, va_labels, ret_label, nullptr,
+                          nullptr, ap);
+  return ret;
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
+int __dfso_vsprintf(char *str, const char *format, dfsan_label str_label,
+                    dfsan_label format_label, dfsan_label *va_labels,
+                    dfsan_label *ret_label, dfsan_origin str_origin,
+                    dfsan_origin format_origin, dfsan_origin *va_origins,
+                    dfsan_origin *ret_origin, va_list ap) {
+  int ret = format_buffer(str, ~0ul, format, va_labels, ret_label, va_origins,
+                          ret_origin, ap);
+  return ret;
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
+int __dfsw_vsnprintf(char *str, size_t size, const char *format,
+                     dfsan_label str_label, dfsan_label size_label,
+                     dfsan_label format_label, dfsan_label *va_labels,
+                     dfsan_label *ret_label, va_list ap) {
+  int ret = format_buffer(str, size, format, va_labels, ret_label, nullptr,
+                          nullptr, ap);
+  return ret;
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE
+int __dfso_vsnprintf(char *str, size_t size, const char *format,
+                     dfsan_label str_label, dfsan_label size_label,
+                     dfsan_label format_label, dfsan_label *va_labels,
+                     dfsan_label *ret_label, dfsan_origin str_origin,
+                     dfsan_origin size_origin, dfsan_origin format_origin,
+                     dfsan_origin *va_origins, dfsan_origin *ret_origin,
+                     va_list ap) {
+  int ret = format_buffer(str, size, format, va_labels, ret_label, va_origins,
+                          ret_origin, ap);
+  return ret;
+}
+
 static void BeforeFork() {
   StackDepotLockAll();
   GetChainedOriginDepot()->LockAll();
index 111c7d5..4e4466e 100644 (file)
@@ -206,6 +206,7 @@ fun:symlink=discard
 fun:syscall=discard
 fun:unlink=discard
 fun:uselocale=discard
+fun:vfprintf=discard
 
 # Functions that produce output does not depend on the input (need to zero the
 # shadow manually).
@@ -285,6 +286,8 @@ fun:gettimeofday=custom
 # sprintf-like
 fun:sprintf=custom
 fun:snprintf=custom
+fun:vsprintf=custom
+fun:vsnprintf=custom
 
 # TODO: custom
 fun:asprintf=discard
index 99450a6..8d1ef49 100644 (file)
@@ -1939,6 +1939,14 @@ void test_snprintf() {
   ASSERT_LABEL(r, 0);
 }
 
+// This is essentially the same as sprintf with the only difference that it
+// uses a va_list instead of varargs. This empty function is here to appease
+// the check-wrappers script.
+void test_vsprintf() {}
+
+// Same here, but for snprintf.
+void test_vsnprintf() {}
+
 // Tested by a seperate source file.  This empty function is here to appease the
 // check-wrappers script.
 void test_fork() {}
@@ -2019,5 +2027,7 @@ int main(void) {
   test_strtoul();
   test_strtoull();
   test_time();
+  test_vsprintf();
+  test_vsnprintf();
   test_write();
 }