1f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// Use of this source code is governed by a BSD-style license that can be 3f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// found in the LICENSE file. 4f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 5f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko#ifndef SANDBOX_LINUX_SECCOMP_BPF_DIE_H__ 6f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko#define SANDBOX_LINUX_SECCOMP_BPF_DIE_H__ 7f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 8f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko#include "base/macros.h" 9f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko#include "sandbox/sandbox_export.h" 10f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 11f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenkonamespace sandbox { 12f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 13f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// This is the main API for using this file. Prints a error message and 14f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// exits with a fatal error. This is not async-signal safe. 15f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko#define SANDBOX_DIE(m) sandbox::Die::SandboxDie(m, __FILE__, __LINE__) 16f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 17f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// An async signal safe version of the same API. Won't print the filename 18f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// and line numbers. 19f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko#define RAW_SANDBOX_DIE(m) sandbox::Die::RawSandboxDie(m) 20f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 21f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// Adds an informational message to the log file or stderr as appropriate. 22f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko#define SANDBOX_INFO(m) sandbox::Die::SandboxInfo(m, __FILE__, __LINE__) 23f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 24f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenkoclass SANDBOX_EXPORT Die { 25f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko public: 26f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // Terminate the program, even if the current sandbox policy prevents some 27f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // of the more commonly used functions used for exiting. 28f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // Most users would want to call SANDBOX_DIE() instead, as it logs extra 29f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // information. But calling ExitGroup() is correct and in some rare cases 30f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // preferable. So, we make it part of the public API. 31f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko static void ExitGroup() __attribute__((noreturn)); 32f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 33f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // This method gets called by SANDBOX_DIE(). There is normally no reason 34f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // to call it directly unless you are defining your own exiting macro. 35f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko static void SandboxDie(const char* msg, const char* file, int line) 36f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko __attribute__((noreturn)); 37f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 38f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko static void RawSandboxDie(const char* msg) __attribute__((noreturn)); 39f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 40f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // This method gets called by SANDBOX_INFO(). There is normally no reason 41f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // to call it directly unless you are defining your own logging macro. 42f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko static void SandboxInfo(const char* msg, const char* file, int line); 43f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 44f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // Writes a message to stderr. Used as a fall-back choice, if we don't have 45f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // any other way to report an error. 46f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko static void LogToStderr(const char* msg, const char* file, int line); 47f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 48f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // We generally want to run all exit handlers. This means, on SANDBOX_DIE() 49f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // we should be calling LOG(FATAL). But there are some situations where 50f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // we just need to print a message and then terminate. This would typically 51f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // happen in cases where we consume the error message internally (e.g. in 52f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // unit tests or in the supportsSeccompSandbox() method). 53f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko static void EnableSimpleExit() { simple_exit_ = true; } 54f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 55f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // Sometimes we need to disable all informational messages (e.g. from within 56f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko // unittests). 57f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko static void SuppressInfoMessages(bool flag) { suppress_info_ = flag; } 58f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 59f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko private: 60f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko static bool simple_exit_; 61f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko static bool suppress_info_; 62f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 63f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko DISALLOW_IMPLICIT_CONSTRUCTORS(Die); 64f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko}; 65f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 66f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko} // namespace sandbox 67f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko 68f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko#endif // SANDBOX_LINUX_SECCOMP_BPF_DIE_H__ 69