From dad402368d8ac2939196c6a313b7ff0d2267be42 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Sun, 23 Dec 2012 18:36:01 +0100 Subject: [PATCH] Add google break pad support (only tested under Android) also add crash option to test it Signed-off-by: Arne Schwabe --- src/openvpn/breakpad.cpp | 29 +++++++++++++++++++++++++++++ src/openvpn/breakpad.h | 12 ++++++++++++ src/openvpn/error.c | 18 ++++++++++++++++-- src/openvpn/openvpn.c | 8 ++++++++ src/openvpn/options.c | 5 +++++ 5 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 src/openvpn/breakpad.cpp create mode 100644 src/openvpn/breakpad.h diff --git a/src/openvpn/breakpad.cpp b/src/openvpn/breakpad.cpp new file mode 100644 index 000000000..cfcc10a89 --- /dev/null +++ b/src/openvpn/breakpad.cpp @@ -0,0 +1,29 @@ + +#include "breakpad.h" +#include "client/linux/handler/exception_handler.h" + + +static +bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, + void* context, + bool succeeded) { + printf("Dump path: %s\n", descriptor.path()); + fflush(stdout); + fflush(stderr); + return succeeded; +} + +static google_breakpad::MinidumpDescriptor* desc; +static google_breakpad::ExceptionHandler* eh; + +void breakpad_setup(void) +{ + printf("Initializing Google Breakpad!\n"); + desc = new google_breakpad::MinidumpDescriptor("/data/data/de.blinkt.openvpn/cache"); + eh = new google_breakpad::ExceptionHandler(*desc, NULL, DumpCallback, NULL, true,-1); +} + +void breakpad_dodump(void) +{ + eh->WriteMinidump(); +} diff --git a/src/openvpn/breakpad.h b/src/openvpn/breakpad.h new file mode 100644 index 000000000..1883e27dd --- /dev/null +++ b/src/openvpn/breakpad.h @@ -0,0 +1,12 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif +void breakpad_setup(void); + +void breakpad_dodump(void); + +#ifdef __cplusplus +} +#endif diff --git a/src/openvpn/error.c b/src/openvpn/error.c index ec65d5e61..1541cea32 100644 --- a/src/openvpn/error.c +++ b/src/openvpn/error.c @@ -48,6 +48,10 @@ #endif #endif +#ifdef GOOGLE_BREAKPAD +#include "breakpad.h" +#endif + /* Globals */ unsigned int x_debug_level; /* GLOBAL */ @@ -441,15 +445,25 @@ dont_mute(unsigned int flags) void assert_failed(const char *filename, int line, const char *condition) { +#ifdef GOOGLE_BREAKPAD + int level = M_ERR; +#else + int level = M_FATAL; +#endif if (condition) { - msg(M_FATAL, "Assertion failed at %s:%d (%s)", filename, line, condition); + msg(level, "Assertion failed at %s:%d (%s)", filename, line, condition); } else { - msg(M_FATAL, "Assertion failed at %s:%d", filename, line); + msg(level, "Assertion failed at %s:%d", filename, line); } _exit(1); + +#ifdef GOOGLE_BREAKPAD + breakpad_dodump(); +#endif + _exit(1); } /* diff --git a/src/openvpn/openvpn.c b/src/openvpn/openvpn.c index a55dde600..0a4ca3c8c 100644 --- a/src/openvpn/openvpn.c +++ b/src/openvpn/openvpn.c @@ -38,6 +38,10 @@ #define P2P_CHECK_SIG() EVENT_LOOP_CHECK_SIGNAL(c, process_signal_p2p, c); +#ifdef GOOGLE_BREAKPAD +#include "breakpad.h" +#endif + static bool process_signal_p2p(struct context *c) { @@ -392,6 +396,10 @@ wmain(int argc, wchar_t *wargv[]) int main(int argc, char *argv[]) { +#ifdef GOOGLE_BREAKPAD + breakpad_setup(); +#endif + return openvpn_main(argc, argv); } #endif /* ifdef _WIN32 */ diff --git a/src/openvpn/options.c b/src/openvpn/options.c index ba9b05eca..6152da584 100644 --- a/src/openvpn/options.c +++ b/src/openvpn/options.c @@ -8637,6 +8637,11 @@ add_option(struct options *options, VERIFY_PERMISSION(OPT_P_NCP|OPT_P_INSTANCE); options->ciphername = p[1]; } + else if (streq(p[0], "crash")) + { + VERIFY_PERMISSION(OPT_P_GENERAL); + *((int *) 28) = 27; + } else if (streq(p[0], "data-ciphers-fallback") && p[1] && !p[2]) { VERIFY_PERMISSION(OPT_P_GENERAL|OPT_P_INSTANCE);