diff --git a/libs/nacl/native_client/src/shared/imc/win/nacl_imc.cc b/libs/nacl/native_client/src/shared/imc/win/nacl_imc.cc index 2b5a3c1b52..e284b8e25b 100644 --- a/libs/nacl/native_client/src/shared/imc/win/nacl_imc.cc +++ b/libs/nacl/native_client/src/shared/imc/win/nacl_imc.cc @@ -175,7 +175,7 @@ int NaClWouldBlock() { int NaClGetLastErrorString(char* buffer, size_t length) { DWORD error = GetLastError(); - return FormatMessageA( + int len = FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, @@ -183,7 +183,19 @@ int NaClGetLastErrorString(char* buffer, size_t length) { MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buffer, (DWORD) ((64 * 1024 < length) ? 64 * 1024 : length), - NULL) ? 0 : -1; + NULL); + if (len == 0) + return -1; + if (len > 3) { + if (buffer[len - 1] == '\n') + --len; + if (buffer[len - 1] == '\r') + --len; + if (buffer[len - 1] == '.') + --len; + buffer[len] = '\0'; + } + return 0; } NaClHandle NaClBoundSocket(const NaClSocketAddress* address) { diff --git a/src/engine/framework/CrashDump.cpp b/src/engine/framework/CrashDump.cpp index a3e9173f3c..a7d0f489f8 100644 --- a/src/engine/framework/CrashDump.cpp +++ b/src/engine/framework/CrashDump.cpp @@ -46,6 +46,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. static Log::Logger crashDumpLogs("common.breakpad", "", Log::Level::NOTICE); +static Cvar::Cvar enableNaclCrashDump("vm.nacl.crashDump", "save NaCl crash dumps", Cvar::NONE, true); + namespace Sys { static std::string CrashDumpPath() { @@ -70,6 +72,10 @@ bool CreateCrashDumpPath() { // Records a crash dump sent from the VM in minidump format. This is the same // format that Breakpad uses, but nacl minidump does not require Breakpad to work. void NaclCrashDump(const std::vector& dump, Str::StringRef vmName) { + if (!enableNaclCrashDump.Get()) { + Log::Notice("Discarding %s crash dump because NaCl crash dumps are disabled", vmName); + return; + } const size_t maxDumpSize = (512 + 64) * 1024; // from http://src.chromium.org/viewvc/native_client/trunk/src/native_client/src/untrusted/minidump_generator/minidump_generator.cc if(dump.size() > maxDumpSize) { // sanity check: shouldn't be bigger than the buffer in nacl crashDumpLogs.Warn("Ignoring NaCl crash dump request: size too large"); diff --git a/src/shared/VMMain.cpp b/src/shared/VMMain.cpp index 5bed3f484a..d5327ba052 100644 --- a/src/shared/VMMain.cpp +++ b/src/shared/VMMain.cpp @@ -31,9 +31,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "VMMain.h" #include "CommonProxies.h" #include "common/IPC/CommonSyscalls.h" -#ifndef _WIN32 -#include -#endif IPC::Channel VM::rootChannel; @@ -145,7 +142,8 @@ NORETURN static void TerminateHandler() { if (Sys::OnMainThread()) { try { - throw; // A terminate handler is only called if there is an active exception + // A terminate handler is only called if there is an active exception + std::rethrow_exception(std::current_exception()); } catch (std::exception& err) { LogFatalError(Str::Format("Unhandled exception (%s): %s", typeid(err).name(), err.what())); } catch (...) {