aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/csource
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-12-26 09:39:22 +0100
committerDmitry Vyukov <dvyukov@google.com>2017-12-27 09:18:26 +0100
commitb7b7ac19fd9e2afbf5aea4db5e3f318576e6809f (patch)
treec43e8bbb312fc42016cd75526301ac9842ae70c9 /pkg/csource
parent6f03c356200becfa347b8abade66ac74f52c10c9 (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.go14
-rw-r--r--pkg/csource/csource.go1
-rw-r--r--pkg/csource/freebsd_common.go20
-rw-r--r--pkg/csource/linux_common.go20
-rw-r--r--pkg/csource/netbsd_common.go20
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()