Index: sandbox/linux/seccomp-bpf/die.h |
diff --git a/sandbox/linux/seccomp-bpf/die.h b/sandbox/linux/seccomp-bpf/die.h |
index f15f10877e9eca0866c67c0198fa8c1d267152f1..1743b8877e885fe5f27ed560caf213e3d5dcecb4 100644 |
--- a/sandbox/linux/seccomp-bpf/die.h |
+++ b/sandbox/linux/seccomp-bpf/die.h |
@@ -5,6 +5,10 @@ |
#ifndef SANDBOX_LINUX_SECCOMP_BPF_DIE_H__ |
#define SANDBOX_LINUX_SECCOMP_BPF_DIE_H__ |
+#include <stdint.h> |
+#include <stdlib.h> |
+ |
+#include "base/debug/format.h" |
#include "sandbox/linux/seccomp-bpf/port.h" |
@@ -14,10 +18,72 @@ class Die { |
public: |
// This is the main API for using this file. Prints a error message and |
// exits with a fatal error. |
- #define SANDBOX_DIE(m) playground2::Die::SandboxDie(m, __FILE__, __LINE__) |
+ #define SANDBOX_DIE(m, args...) \ |
+ do { \ |
+ /* The optimizer automatically eliminates one of the branches of the */ \ |
+ /* "if" statement. This makes sure we only ever allocate a buffer and*/ \ |
+ /* copy the string, if that is necessary to format the message. */ \ |
+ if (*#args) { \ |
+ const size_t kInitialSize = 80; \ |
+ const size_t kMaxSize = 16384; \ |
+ size_t sz = kInitialSize; \ |
+ for (;;) { \ |
+ /* Allocate a reasonably sized buffer initially. If that wasn't */ \ |
+ /* sufficient, reallocate a bigger buffer. But impose an upper */ \ |
+ /* limit. */ \ |
+ /* This approach maximizes the chances that we will find the full*/ \ |
+ /* message in a crash dump, without needlessly pushing other */ \ |
+ /* valuable data out of the dump. */ \ |
+ char buf[sz]; \ |
+ sz = base::debug::FormatN(buf, sz, (m), ##args) + 1; \ |
+ if (sz > kMaxSize) \ |
+ sz = kMaxSize; \ |
+ if (sz > sizeof(buf) && kInitialSize == sizeof(buf)) { \ |
+ continue; \ |
+ } else { \ |
+ playground2::Die::SandboxDie(sz >= 0 ? buf : "", \ |
+ __FILE__, __LINE__); \ |
+ break; \ |
+ } \ |
+ } \ |
+ } else { \ |
+ playground2::Die::SandboxDie((m), __FILE__, __LINE__); \ |
+ } \ |
+ } while (0) |
// Adds an informational message to the log file or stderr as appropriate. |
- #define SANDBOX_INFO(m) playground2::Die::SandboxInfo(m, __FILE__, __LINE__) |
+ #define SANDBOX_INFO(m, args...) \ |
+ do { \ |
+ /* The optimizer automatically eliminates one of the branches of the */ \ |
+ /* "if" statement. This makes sure we only ever allocate a buffer and*/ \ |
+ /* copy the string, if that is necessary to format the message. */ \ |
+ if (*#args) { \ |
+ const size_t kInitialSize = 80; \ |
+ const size_t kMaxSize = 16384; \ |
+ size_t sz = kInitialSize; \ |
+ for (;;) { \ |
+ /* Allocate a reasonably sized buffer initially. If that wasn't */ \ |
+ /* sufficient, reallocate a bigger buffer. But impose an upper */ \ |
+ /* limit. */ \ |
+ /* This approach maximizes the chances that we will find the full*/ \ |
+ /* message in a crash dump, without needlessly pushing other */ \ |
+ /* valuable data out of the dump. */ \ |
+ char buf[sz]; \ |
+ sz = base::debug::FormatN(buf, sz, (m), ##args) + 1; \ |
+ if (sz > kMaxSize) \ |
+ sz = kMaxSize; \ |
+ if (sz > sizeof(buf) && kInitialSize == sizeof(buf)) { \ |
+ continue; \ |
+ } else { \ |
+ playground2::Die::SandboxInfo(sz >= 0 ? buf : "", \ |
+ __FILE__, __LINE__); \ |
+ break; \ |
+ } \ |
+ } \ |
+ } else { \ |
+ playground2::Die::SandboxInfo((m), __FILE__, __LINE__); \ |
+ } \ |
+ } while (0) |
// Terminate the program, even if the current sandbox policy prevents some |
// of the more commonly used functions used for exiting. |