diff --git a/Makefile.am b/Makefile.am index bd8eca67..2ff80244 100644 --- a/Makefile.am +++ b/Makefile.am @@ -128,7 +128,6 @@ pkgconfig_DATA += breakpad-client.pc src_client_linux_libbreakpad_client_a_SOURCES = \ src/client/linux/crash_generation/crash_generation_client.cc \ src/client/linux/crash_generation/crash_generation_server.cc \ - src/client/linux/dump_writer_common/seccomp_unwinder.cc \ src/client/linux/dump_writer_common/thread_info.cc \ src/client/linux/dump_writer_common/ucontext_reader.cc \ src/client/linux/handler/exception_handler.cc \ @@ -457,7 +456,6 @@ src_client_linux_linux_client_unittest_shlib_LDFLAGS = \ -Wl,-h,linux_client_unittest_shlib src_client_linux_linux_client_unittest_shlib_LDADD = \ src/client/linux/crash_generation/crash_generation_client.o \ - src/client/linux/dump_writer_common/seccomp_unwinder.o \ src/client/linux/dump_writer_common/thread_info.o \ src/client/linux/dump_writer_common/ucontext_reader.o \ src/client/linux/handler/exception_handler.o \ diff --git a/Makefile.in b/Makefile.in index 28c140a4..4b09f2ca 100644 --- a/Makefile.in +++ b/Makefile.in @@ -285,7 +285,6 @@ src_client_linux_libbreakpad_client_a_LIBADD = am__src_client_linux_libbreakpad_client_a_SOURCES_DIST = \ src/client/linux/crash_generation/crash_generation_client.cc \ src/client/linux/crash_generation/crash_generation_server.cc \ - src/client/linux/dump_writer_common/seccomp_unwinder.cc \ src/client/linux/dump_writer_common/thread_info.cc \ src/client/linux/dump_writer_common/ucontext_reader.cc \ src/client/linux/handler/exception_handler.cc \ @@ -307,7 +306,6 @@ am__dirstamp = $(am__leading_dot)dirstamp @ANDROID_HOST_TRUE@@LINUX_HOST_TRUE@am__objects_1 = src/common/android/breakpad_getcontext.$(OBJEXT) @LINUX_HOST_TRUE@am_src_client_linux_libbreakpad_client_a_OBJECTS = src/client/linux/crash_generation/crash_generation_client.$(OBJEXT) \ @LINUX_HOST_TRUE@ src/client/linux/crash_generation/crash_generation_server.$(OBJEXT) \ -@LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/seccomp_unwinder.$(OBJEXT) \ @LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/thread_info.$(OBJEXT) \ @LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/ucontext_reader.$(OBJEXT) \ @LINUX_HOST_TRUE@ src/client/linux/handler/exception_handler.$(OBJEXT) \ @@ -1959,7 +1957,6 @@ noinst_LIBRARIES = $(am__append_7) lib_LIBRARIES = $(am__append_5) $(am__append_8) @LINUX_HOST_TRUE@src_client_linux_libbreakpad_client_a_SOURCES = src/client/linux/crash_generation/crash_generation_client.cc \ @LINUX_HOST_TRUE@ src/client/linux/crash_generation/crash_generation_server.cc \ -@LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/seccomp_unwinder.cc \ @LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/thread_info.cc \ @LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/ucontext_reader.cc \ @LINUX_HOST_TRUE@ src/client/linux/handler/exception_handler.cc \ @@ -2189,7 +2186,6 @@ TESTS = $(check_PROGRAMS) $(check_SCRIPTS) @LINUX_HOST_TRUE@ $(am__append_20) @LINUX_HOST_TRUE@src_client_linux_linux_client_unittest_shlib_LDADD = \ @LINUX_HOST_TRUE@ src/client/linux/crash_generation/crash_generation_client.o \ -@LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/seccomp_unwinder.o \ @LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/thread_info.o \ @LINUX_HOST_TRUE@ src/client/linux/dump_writer_common/ucontext_reader.o \ @LINUX_HOST_TRUE@ src/client/linux/handler/exception_handler.o \ @@ -3232,9 +3228,6 @@ src/client/linux/dump_writer_common/$(am__dirstamp): src/client/linux/dump_writer_common/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/client/linux/dump_writer_common/$(DEPDIR) @: > src/client/linux/dump_writer_common/$(DEPDIR)/$(am__dirstamp) -src/client/linux/dump_writer_common/seccomp_unwinder.$(OBJEXT): \ - src/client/linux/dump_writer_common/$(am__dirstamp) \ - src/client/linux/dump_writer_common/$(DEPDIR)/$(am__dirstamp) src/client/linux/dump_writer_common/thread_info.$(OBJEXT): \ src/client/linux/dump_writer_common/$(am__dirstamp) \ src/client/linux/dump_writer_common/$(DEPDIR)/$(am__dirstamp) @@ -4400,7 +4393,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@src/client/$(DEPDIR)/minidump_file_writer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/crash_generation/$(DEPDIR)/crash_generation_client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/crash_generation/$(DEPDIR)/crash_generation_server.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/dump_writer_common/$(DEPDIR)/seccomp_unwinder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/dump_writer_common/$(DEPDIR)/thread_info.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/dump_writer_common/$(DEPDIR)/ucontext_reader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/handler/$(DEPDIR)/exception_handler.Po@am__quote@ diff --git a/src/client/linux/dump_writer_common/seccomp_unwinder.cc b/src/client/linux/dump_writer_common/seccomp_unwinder.cc deleted file mode 100644 index e9d1ec78..00000000 --- a/src/client/linux/dump_writer_common/seccomp_unwinder.cc +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright (c) 2014, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include "client/linux/dump_writer_common/seccomp_unwinder.h" - -#include - -#include "google_breakpad/common/minidump_format.h" -#include "common/linux/linux_libc_support.h" - -namespace google_breakpad { - -void SeccompUnwinder::PopSeccompStackFrame(RawContextCPU* cpu, - const MDRawThread& thread, - uint8_t* stack_copy) { -#if defined(__x86_64) - uint64_t bp = cpu->rbp; - uint64_t top = thread.stack.start_of_memory_range; - for (int i = 4; i--; ) { - if (bp < top || - bp > thread.stack.start_of_memory_range + - thread.stack.memory.data_size - sizeof(bp) || - bp & 1) { - break; - } - uint64_t old_top = top; - top = bp; - uint8_t* bp_addr = stack_copy + bp - thread.stack.start_of_memory_range; - my_memcpy(&bp, bp_addr, sizeof(bp)); - if (bp == 0xDEADBEEFDEADBEEFull) { - struct { - uint64_t r15; - uint64_t r14; - uint64_t r13; - uint64_t r12; - uint64_t r11; - uint64_t r10; - uint64_t r9; - uint64_t r8; - uint64_t rdi; - uint64_t rsi; - uint64_t rdx; - uint64_t rcx; - uint64_t rbx; - uint64_t deadbeef; - uint64_t rbp; - uint64_t fakeret; - uint64_t ret; - /* char redzone[128]; */ - } seccomp_stackframe; - if (top - offsetof(__typeof__(seccomp_stackframe), deadbeef) < old_top || - top - offsetof(__typeof__(seccomp_stackframe), deadbeef) + - sizeof(seccomp_stackframe) > - thread.stack.start_of_memory_range+thread.stack.memory.data_size) { - break; - } - my_memcpy(&seccomp_stackframe, - bp_addr - offsetof(__typeof__(seccomp_stackframe), deadbeef), - sizeof(seccomp_stackframe)); - cpu->rbx = seccomp_stackframe.rbx; - cpu->rcx = seccomp_stackframe.rcx; - cpu->rdx = seccomp_stackframe.rdx; - cpu->rsi = seccomp_stackframe.rsi; - cpu->rdi = seccomp_stackframe.rdi; - cpu->rbp = seccomp_stackframe.rbp; - cpu->rsp = top + 4*sizeof(uint64_t) + 128; - cpu->r8 = seccomp_stackframe.r8; - cpu->r9 = seccomp_stackframe.r9; - cpu->r10 = seccomp_stackframe.r10; - cpu->r11 = seccomp_stackframe.r11; - cpu->r12 = seccomp_stackframe.r12; - cpu->r13 = seccomp_stackframe.r13; - cpu->r14 = seccomp_stackframe.r14; - cpu->r15 = seccomp_stackframe.r15; - cpu->rip = seccomp_stackframe.fakeret; - return; - } - } -#elif defined(__i386__) - uint32_t bp = cpu->ebp; - uint32_t top = thread.stack.start_of_memory_range; - for (int i = 4; i--; ) { - if (bp < top || - bp > thread.stack.start_of_memory_range + - thread.stack.memory.data_size - sizeof(bp) || - bp & 1) { - break; - } - uint32_t old_top = top; - top = bp; - uint8_t* bp_addr = stack_copy + bp - thread.stack.start_of_memory_range; - my_memcpy(&bp, bp_addr, sizeof(bp)); - if (bp == 0xDEADBEEFu) { - struct { - uint32_t edi; - uint32_t esi; - uint32_t edx; - uint32_t ecx; - uint32_t ebx; - uint32_t deadbeef; - uint32_t ebp; - uint32_t fakeret; - uint32_t ret; - } seccomp_stackframe; - if (top - offsetof(__typeof__(seccomp_stackframe), deadbeef) < old_top || - top - offsetof(__typeof__(seccomp_stackframe), deadbeef) + - sizeof(seccomp_stackframe) > - thread.stack.start_of_memory_range+thread.stack.memory.data_size) { - break; - } - my_memcpy(&seccomp_stackframe, - bp_addr - offsetof(__typeof__(seccomp_stackframe), deadbeef), - sizeof(seccomp_stackframe)); - cpu->ebx = seccomp_stackframe.ebx; - cpu->ecx = seccomp_stackframe.ecx; - cpu->edx = seccomp_stackframe.edx; - cpu->esi = seccomp_stackframe.esi; - cpu->edi = seccomp_stackframe.edi; - cpu->ebp = seccomp_stackframe.ebp; - cpu->esp = top + 4*sizeof(void*); - cpu->eip = seccomp_stackframe.fakeret; - return; - } - } -#endif -} - -} // namespace google_breakpad diff --git a/src/client/linux/dump_writer_common/seccomp_unwinder.h b/src/client/linux/dump_writer_common/seccomp_unwinder.h deleted file mode 100644 index 0f5637b6..00000000 --- a/src/client/linux/dump_writer_common/seccomp_unwinder.h +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2014, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef CLIENT_LINUX_DUMP_WRITER_COMMON_SECCOMP_UNWINDER_H -#define CLIENT_LINUX_DUMP_WRITER_COMMON_SECCOMP_UNWINDER_H - -#include "client/linux/dump_writer_common/raw_context_cpu.h" -#include "google_breakpad/common/minidump_format.h" - -namespace google_breakpad { - -struct SeccompUnwinder { - - // Check if the top of the stack is part of a system call that has been - // redirected by the seccomp sandbox. If so, try to pop the stack frames - // all the way back to the point where the interception happened. - static void PopSeccompStackFrame(RawContextCPU* cpu, - const MDRawThread& thread, - uint8_t* stack_copy); -}; - -} // namespace google_breakpad - -#endif // CLIENT_LINUX_DUMP_WRITER_COMMON_SECCOMP_UNWINDER_H diff --git a/src/client/linux/microdump_writer/microdump_writer.cc b/src/client/linux/microdump_writer/microdump_writer.cc index c2dba35b..d2eaa6ee 100644 --- a/src/client/linux/microdump_writer/microdump_writer.cc +++ b/src/client/linux/microdump_writer/microdump_writer.cc @@ -34,7 +34,6 @@ #include -#include "client/linux/dump_writer_common/seccomp_unwinder.h" #include "client/linux/dump_writer_common/thread_info.h" #include "client/linux/dump_writer_common/ucontext_reader.h" #include "client/linux/handler/exception_handler.h" @@ -50,7 +49,6 @@ using google_breakpad::LinuxPtraceDumper; using google_breakpad::MappingInfo; using google_breakpad::MappingList; using google_breakpad::RawContextCPU; -using google_breakpad::SeccompUnwinder; using google_breakpad::ThreadInfo; using google_breakpad::UContextReader; @@ -287,8 +285,6 @@ class MicrodumpWriter { #else UContextReader::FillCPUContext(&cpu, ucontext_); #endif - if (stack_copy) - SeccompUnwinder::PopSeccompStackFrame(&cpu, thread, stack_copy); DumpCPUState(&cpu); } return true; diff --git a/src/client/linux/minidump_writer/minidump_writer.cc b/src/client/linux/minidump_writer/minidump_writer.cc index 9c1db99b..4b1e6f87 100644 --- a/src/client/linux/minidump_writer/minidump_writer.cc +++ b/src/client/linux/minidump_writer/minidump_writer.cc @@ -64,7 +64,6 @@ #include -#include "client/linux/dump_writer_common/seccomp_unwinder.h" #include "client/linux/dump_writer_common/thread_info.h" #include "client/linux/dump_writer_common/ucontext_reader.h" #include "client/linux/handler/exception_handler.h" @@ -95,7 +94,6 @@ using google_breakpad::MinidumpFileWriter; using google_breakpad::PageAllocator; using google_breakpad::ProcCpuInfoReader; using google_breakpad::RawContextCPU; -using google_breakpad::SeccompUnwinder; using google_breakpad::ThreadInfo; using google_breakpad::TypedMDRVA; using google_breakpad::UContextReader; @@ -383,8 +381,6 @@ class MinidumpWriter { #else UContextReader::FillCPUContext(cpu.get(), ucontext_); #endif - if (stack_copy) - SeccompUnwinder::PopSeccompStackFrame(cpu.get(), thread, stack_copy); thread.thread_context = cpu.location(); crashing_thread_context_ = cpu.location(); } else { @@ -405,8 +401,6 @@ class MinidumpWriter { return false; my_memset(cpu.get(), 0, sizeof(RawContextCPU)); info.FillCPUContext(cpu.get()); - if (stack_copy) - SeccompUnwinder::PopSeccompStackFrame(cpu.get(), thread, stack_copy); thread.thread_context = cpu.location(); if (dumper_->threads()[i] == GetCrashThread()) { crashing_thread_context_ = cpu.location();