diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-12-26 09:39:22 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-12-27 09:18:26 +0100 |
| commit | b7b7ac19fd9e2afbf5aea4db5e3f318576e6809f (patch) | |
| tree | c43e8bbb312fc42016cd75526301ac9842ae70c9 /pkg/csource | |
| parent | 6f03c356200becfa347b8abade66ac74f52c10c9 (diff) | |
executor: check format strings
I see a crash which says:
#0: too much cover 0 (errno 0)
while the code is:
uint64_t n = ...;
if (n >= kCoverSize)
fail("#%d: too much cover %u", th->id, n);
It seems that the high part of n is set, but we don't see it.
Add printf format attribute to fail and friends and fix all similar cases.
Caught a bunch of similar cases and a missing argument in:
exitf("opendir(%s) failed due to NOFILE, exiting");
Diffstat (limited to 'pkg/csource')
| -rw-r--r-- | pkg/csource/akaros_common.go | 14 | ||||
| -rw-r--r-- | pkg/csource/csource.go | 1 | ||||
| -rw-r--r-- | pkg/csource/freebsd_common.go | 20 | ||||
| -rw-r--r-- | pkg/csource/linux_common.go | 20 | ||||
| -rw-r--r-- | pkg/csource/netbsd_common.go | 20 |
5 files changed, 40 insertions, 35 deletions
diff --git a/pkg/csource/akaros_common.go b/pkg/csource/akaros_common.go index 8bc422b6f..949a6ce8e 100644 --- a/pkg/csource/akaros_common.go +++ b/pkg/csource/akaros_common.go @@ -67,17 +67,19 @@ __attribute__((noreturn)) static void doexit(int status) #if defined(SYZ_EXECUTOR) #define exit vsnprintf #define _exit vsnprintf -#endif -#if defined(SYZ_EXECUTOR) +#define uint64_t unsigned long long + #if defined(__GNUC__) #define SYSCALLAPI #define NORETURN __attribute__((noreturn)) #define ALIGNED(N) __attribute__((aligned(N))) +#define PRINTF __attribute__((format(printf, 1, 2))) #else #define SYSCALLAPI WINAPI #define NORETURN __declspec(noreturn) #define ALIGNED(N) __declspec(align(N)) +#define PRINTF #endif typedef long(SYSCALLAPI* syscall_t)(long, long, long, long, long, long, long, long, long); @@ -107,7 +109,7 @@ const int kErrorStatus = 68; #if defined(SYZ_EXECUTOR) || (defined(SYZ_REPEAT) && defined(SYZ_WAIT_REPEAT)) || \ defined(SYZ_USE_TMP_DIR) || defined(SYZ_TUN_ENABLE) || defined(SYZ_SANDBOX_NAMESPACE) || \ defined(SYZ_SANDBOX_NONE) || defined(SYZ_SANDBOX_SETUID) || defined(__NR_syz_kvm_setup_cpu) -NORETURN static void fail(const char* msg, ...) +NORETURN PRINTF static void fail(const char* msg, ...) { int e = errno; va_list args; @@ -120,7 +122,7 @@ NORETURN static void fail(const char* msg, ...) #endif #if defined(SYZ_EXECUTOR) -NORETURN static void error(const char* msg, ...) +NORETURN PRINTF static void error(const char* msg, ...) { va_list args; va_start(args, msg); @@ -132,7 +134,7 @@ NORETURN static void error(const char* msg, ...) #endif #if defined(SYZ_EXECUTOR) || (defined(SYZ_REPEAT) && defined(SYZ_WAIT_REPEAT) && defined(SYZ_USE_TMP_DIR)) || defined(SYZ_FAULT_INJECTION) -NORETURN static void exitf(const char* msg, ...) +NORETURN PRINTF static void exitf(const char* msg, ...) { int e = errno; va_list args; @@ -147,7 +149,7 @@ NORETURN static void exitf(const char* msg, ...) #if defined(SYZ_EXECUTOR) || defined(SYZ_DEBUG) static int flag_debug; -static void debug(const char* msg, ...) +PRINTF static void debug(const char* msg, ...) { if (!flag_debug) return; diff --git a/pkg/csource/csource.go b/pkg/csource/csource.go index 14f381451..13377c57e 100644 --- a/pkg/csource/csource.go +++ b/pkg/csource/csource.go @@ -143,6 +143,7 @@ func Write(p *prog.Prog, opts Options) ([]byte, error) { out0 = re.ReplaceAllString(out0, "") } out0 = strings.Replace(out0, "NORETURN", "", -1) + out0 = strings.Replace(out0, "PRINTF", "", -1) // Remove duplicate new lines. out1 := []byte(out0) diff --git a/pkg/csource/freebsd_common.go b/pkg/csource/freebsd_common.go index 9ab6203f7..0d85c6d66 100644 --- a/pkg/csource/freebsd_common.go +++ b/pkg/csource/freebsd_common.go @@ -58,17 +58,19 @@ __attribute__((noreturn)) static void doexit(int status) #if defined(SYZ_EXECUTOR) #define exit vsnprintf #define _exit vsnprintf -#endif -#if defined(SYZ_EXECUTOR) +#define uint64_t unsigned long long + #if defined(__GNUC__) #define SYSCALLAPI #define NORETURN __attribute__((noreturn)) #define ALIGNED(N) __attribute__((aligned(N))) +#define PRINTF __attribute__((format(printf, 1, 2))) #else #define SYSCALLAPI WINAPI #define NORETURN __declspec(noreturn) #define ALIGNED(N) __declspec(align(N)) +#define PRINTF #endif typedef long(SYSCALLAPI* syscall_t)(long, long, long, long, long, long, long, long, long); @@ -98,7 +100,7 @@ const int kErrorStatus = 68; #if defined(SYZ_EXECUTOR) || (defined(SYZ_REPEAT) && defined(SYZ_WAIT_REPEAT)) || \ defined(SYZ_USE_TMP_DIR) || defined(SYZ_TUN_ENABLE) || defined(SYZ_SANDBOX_NAMESPACE) || \ defined(SYZ_SANDBOX_NONE) || defined(SYZ_SANDBOX_SETUID) || defined(__NR_syz_kvm_setup_cpu) -NORETURN static void fail(const char* msg, ...) +NORETURN PRINTF static void fail(const char* msg, ...) { int e = errno; va_list args; @@ -111,7 +113,7 @@ NORETURN static void fail(const char* msg, ...) #endif #if defined(SYZ_EXECUTOR) -NORETURN static void error(const char* msg, ...) +NORETURN PRINTF static void error(const char* msg, ...) { va_list args; va_start(args, msg); @@ -123,7 +125,7 @@ NORETURN static void error(const char* msg, ...) #endif #if defined(SYZ_EXECUTOR) || (defined(SYZ_REPEAT) && defined(SYZ_WAIT_REPEAT) && defined(SYZ_USE_TMP_DIR)) || defined(SYZ_FAULT_INJECTION) -NORETURN static void exitf(const char* msg, ...) +NORETURN PRINTF static void exitf(const char* msg, ...) { int e = errno; va_list args; @@ -138,7 +140,7 @@ NORETURN static void exitf(const char* msg, ...) #if defined(SYZ_EXECUTOR) || defined(SYZ_DEBUG) static int flag_debug; -static void debug(const char* msg, ...) +PRINTF static void debug(const char* msg, ...) { if (!flag_debug) return; @@ -208,13 +210,11 @@ static void segv_handler(int sig, siginfo_t* info, void* uctx) const uintptr_t prog_start = 1 << 20; const uintptr_t prog_end = 100 << 20; if (__atomic_load_n(&skip_segv, __ATOMIC_RELAXED) && (addr < prog_start || addr > prog_end)) { - debug("SIGSEGV on %p, skipping\n", addr); + debug("SIGSEGV on %p, skipping\n", (void*)addr); _longjmp(segv_env, 1); } - debug("SIGSEGV on %p, exiting\n", addr); + debug("SIGSEGV on %p, exiting\n", (void*)addr); doexit(sig); - for (;;) { - } } static void install_segv_handler() diff --git a/pkg/csource/linux_common.go b/pkg/csource/linux_common.go index 1ec165b89..329c7e5e2 100644 --- a/pkg/csource/linux_common.go +++ b/pkg/csource/linux_common.go @@ -146,17 +146,19 @@ __attribute__((noreturn)) static void doexit(int status) #if defined(SYZ_EXECUTOR) #define exit vsnprintf #define _exit vsnprintf -#endif -#if defined(SYZ_EXECUTOR) +#define uint64_t unsigned long long + #if defined(__GNUC__) #define SYSCALLAPI #define NORETURN __attribute__((noreturn)) #define ALIGNED(N) __attribute__((aligned(N))) +#define PRINTF __attribute__((format(printf, 1, 2))) #else #define SYSCALLAPI WINAPI #define NORETURN __declspec(noreturn) #define ALIGNED(N) __declspec(align(N)) +#define PRINTF #endif typedef long(SYSCALLAPI* syscall_t)(long, long, long, long, long, long, long, long, long); @@ -186,7 +188,7 @@ const int kErrorStatus = 68; #if defined(SYZ_EXECUTOR) || (defined(SYZ_REPEAT) && defined(SYZ_WAIT_REPEAT)) || \ defined(SYZ_USE_TMP_DIR) || defined(SYZ_TUN_ENABLE) || defined(SYZ_SANDBOX_NAMESPACE) || \ defined(SYZ_SANDBOX_NONE) || defined(SYZ_SANDBOX_SETUID) || defined(__NR_syz_kvm_setup_cpu) -NORETURN static void fail(const char* msg, ...) +NORETURN PRINTF static void fail(const char* msg, ...) { int e = errno; va_list args; @@ -199,7 +201,7 @@ NORETURN static void fail(const char* msg, ...) #endif #if defined(SYZ_EXECUTOR) -NORETURN static void error(const char* msg, ...) +NORETURN PRINTF static void error(const char* msg, ...) { va_list args; va_start(args, msg); @@ -211,7 +213,7 @@ NORETURN static void error(const char* msg, ...) #endif #if defined(SYZ_EXECUTOR) || (defined(SYZ_REPEAT) && defined(SYZ_WAIT_REPEAT) && defined(SYZ_USE_TMP_DIR)) || defined(SYZ_FAULT_INJECTION) -NORETURN static void exitf(const char* msg, ...) +NORETURN PRINTF static void exitf(const char* msg, ...) { int e = errno; va_list args; @@ -226,7 +228,7 @@ NORETURN static void exitf(const char* msg, ...) #if defined(SYZ_EXECUTOR) || defined(SYZ_DEBUG) static int flag_debug; -static void debug(const char* msg, ...) +PRINTF static void debug(const char* msg, ...) { if (!flag_debug) return; @@ -296,10 +298,10 @@ static void segv_handler(int sig, siginfo_t* info, void* uctx) const uintptr_t prog_start = 1 << 20; const uintptr_t prog_end = 100 << 20; if (__atomic_load_n(&skip_segv, __ATOMIC_RELAXED) && (addr < prog_start || addr > prog_end)) { - debug("SIGSEGV on %p, skipping\n", addr); + debug("SIGSEGV on %p, skipping\n", (void*)addr); _longjmp(segv_env, 1); } - debug("SIGSEGV on %p, exiting\n", addr); + debug("SIGSEGV on %p, exiting\n", (void*)addr); doexit(sig); } @@ -1931,7 +1933,7 @@ retry: dp = opendir(dir); if (dp == NULL) { if (errno == EMFILE) { - exitf("opendir(%s) failed due to NOFILE, exiting"); + exitf("opendir(%s) failed due to NOFILE, exiting", dir); } exitf("opendir(%s) failed", dir); } diff --git a/pkg/csource/netbsd_common.go b/pkg/csource/netbsd_common.go index 80e52e8ed..86c95859b 100644 --- a/pkg/csource/netbsd_common.go +++ b/pkg/csource/netbsd_common.go @@ -58,17 +58,19 @@ __attribute__((noreturn)) static void doexit(int status) #if defined(SYZ_EXECUTOR) #define exit vsnprintf #define _exit vsnprintf -#endif -#if defined(SYZ_EXECUTOR) +#define uint64_t unsigned long long + #if defined(__GNUC__) #define SYSCALLAPI #define NORETURN __attribute__((noreturn)) #define ALIGNED(N) __attribute__((aligned(N))) +#define PRINTF __attribute__((format(printf, 1, 2))) #else #define SYSCALLAPI WINAPI #define NORETURN __declspec(noreturn) #define ALIGNED(N) __declspec(align(N)) +#define PRINTF #endif typedef long(SYSCALLAPI* syscall_t)(long, long, long, long, long, long, long, long, long); @@ -98,7 +100,7 @@ const int kErrorStatus = 68; #if defined(SYZ_EXECUTOR) || (defined(SYZ_REPEAT) && defined(SYZ_WAIT_REPEAT)) || \ defined(SYZ_USE_TMP_DIR) || defined(SYZ_TUN_ENABLE) || defined(SYZ_SANDBOX_NAMESPACE) || \ defined(SYZ_SANDBOX_NONE) || defined(SYZ_SANDBOX_SETUID) || defined(__NR_syz_kvm_setup_cpu) -NORETURN static void fail(const char* msg, ...) +NORETURN PRINTF static void fail(const char* msg, ...) { int e = errno; va_list args; @@ -111,7 +113,7 @@ NORETURN static void fail(const char* msg, ...) #endif #if defined(SYZ_EXECUTOR) -NORETURN static void error(const char* msg, ...) +NORETURN PRINTF static void error(const char* msg, ...) { va_list args; va_start(args, msg); @@ -123,7 +125,7 @@ NORETURN static void error(const char* msg, ...) #endif #if defined(SYZ_EXECUTOR) || (defined(SYZ_REPEAT) && defined(SYZ_WAIT_REPEAT) && defined(SYZ_USE_TMP_DIR)) || defined(SYZ_FAULT_INJECTION) -NORETURN static void exitf(const char* msg, ...) +NORETURN PRINTF static void exitf(const char* msg, ...) { int e = errno; va_list args; @@ -138,7 +140,7 @@ NORETURN static void exitf(const char* msg, ...) #if defined(SYZ_EXECUTOR) || defined(SYZ_DEBUG) static int flag_debug; -static void debug(const char* msg, ...) +PRINTF static void debug(const char* msg, ...) { if (!flag_debug) return; @@ -208,13 +210,11 @@ static void segv_handler(int sig, siginfo_t* info, void* uctx) const uintptr_t prog_start = 1 << 20; const uintptr_t prog_end = 100 << 20; if (__atomic_load_n(&skip_segv, __ATOMIC_RELAXED) && (addr < prog_start || addr > prog_end)) { - debug("SIGSEGV on %p, skipping\n", addr); + debug("SIGSEGV on %p, skipping\n", (void*)addr); _longjmp(segv_env, 1); } - debug("SIGSEGV on %p, exiting\n", addr); + debug("SIGSEGV on %p, exiting\n", (void*)addr); doexit(sig); - for (;;) { - } } static void install_segv_handler() |
