[compiler-rt] r199895 - [Sanitizer] Fix false positive in printf interceptors: properly handle precision for %s
Alexey Samsonov
samsonov at google.com
Thu Jan 23 06:35:28 PST 2014
Author: samsonov
Date: Thu Jan 23 08:35:28 2014
New Revision: 199895
URL: http://llvm.org/viewvc/llvm-project?rev=199895&view=rev
Log:
[Sanitizer] Fix false positive in printf interceptors: properly handle precision for %s
Modified:
compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors_format.inc
compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_format_interceptor_test.cc
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors_format.inc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors_format.inc?rev=199895&r1=199894&r2=199895&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors_format.inc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors_format.inc Thu Jan 23 08:35:28 2014
@@ -381,7 +381,8 @@ static const char *maybe_parse_number_or
// Parse printf format string. Same as scanf_parse_next.
static const char *printf_parse_next(const char *p, PrintfDirective *dir) {
internal_memset(dir, 0, sizeof(*dir));
- dir->argIdx = dir->precisionIdx = -1;
+ dir->argIdx = -1;
+ dir->precisionIdx = -1;
while (*p) {
if (*p != '%') {
@@ -526,7 +527,17 @@ static void printf_common(void *ctx, con
continue;
} else if (size == FSS_STRLEN) {
if (void *argp = va_arg(aq, void *)) {
- size = internal_strlen((const char *)argp) + 1;
+ if (dir.starredPrecision) {
+ // FIXME: properly support starred precision for strings.
+ size = 0;
+ } else if (dir.fieldPrecision > 0) {
+ // Won't read more than "precision" symbols.
+ size = internal_strnlen((const char *)argp, dir.fieldPrecision);
+ if (size < dir.fieldPrecision) size++;
+ } else {
+ // Whole string will be accessed.
+ size = internal_strlen((const char *)argp) + 1;
+ }
COMMON_INTERCEPTOR_READ_RANGE(ctx, argp, size);
}
} else {
Modified: compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_format_interceptor_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_format_interceptor_test.cc?rev=199895&r1=199894&r2=199895&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_format_interceptor_test.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_format_interceptor_test.cc Thu Jan 23 08:35:28 2014
@@ -238,8 +238,13 @@ TEST(SanitizerCommonInterceptors, Printf
// Precision
testPrintf("%10.10n", 1, I);
+ testPrintf("%.3s", 1, 3);
+ testPrintf("%.20s", 1, test_buf_size);
// Dynamic precision
testPrintf("%.*n", 1, I);
testPrintf("%10.*n", 1, I);
+
+ // Dynamic precision for strings is not implemented yet.
+ testPrintf("%.*s", 1, 0);
}
More information about the llvm-commits
mailing list