OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include <stddef.h> | |
6 #include <stdint.h> | |
7 #include <string.h> | |
8 | |
9 #include <streambuf> | |
10 #include <istream> | |
11 #include <memory> | |
12 | |
13 #include "base/memory/free_deleter.h" | |
14 #include "google_breakpad/processor/basic_source_line_resolver.h" | |
15 #include "google_breakpad/processor/minidump.h" | |
16 #include "google_breakpad/processor/minidump_processor.h" | |
17 #include "google_breakpad/processor/process_state.h" | |
18 #include "processor/logging.h" | |
19 #include "processor/simple_symbol_supplier.h" | |
20 #include "processor/stackwalk_common.h" | |
21 | |
22 namespace { | |
23 | |
24 using google_breakpad::BasicSourceLineResolver; | |
25 using google_breakpad::Minidump; | |
26 using google_breakpad::MinidumpProcessor; | |
27 using google_breakpad::ProcessState; | |
28 using google_breakpad::SimpleSymbolSupplier; | |
29 | |
30 struct membuf : std::streambuf { | |
31 membuf(char* begin, char* end) { setg(begin, begin, end); } | |
32 | |
33 protected: | |
34 virtual pos_type seekoff(off_type off, | |
35 std::ios_base::seekdir dir, | |
36 std::ios_base::openmode which = std::ios_base::in) { | |
37 if (dir == std::ios_base::cur) | |
38 gbump(off); | |
39 return gptr() - eback(); | |
40 } | |
41 }; | |
42 | |
43 bool PrintMinidumpProcess(const uint8_t* data, | |
44 size_t size, | |
45 const std::vector<string>& symbol_paths) { | |
46 std::unique_ptr<SimpleSymbolSupplier> symbol_supplier; | |
47 char* ptr = static_cast<char*>(malloc(size)); | |
48 if (!ptr) | |
49 return 0; | |
Lei Zhang
2016/08/31 18:37:23
return false;
| |
50 | |
51 std::unique_ptr<char, base::FreeDeleter> buffer(ptr); | |
52 memcpy(buffer.get(), data, size); | |
53 | |
54 membuf sbuf(buffer.get(), buffer.get() + size); | |
55 std::istream input(&sbuf); | |
56 | |
57 if (!symbol_paths.empty()) { | |
58 symbol_supplier.reset(new SimpleSymbolSupplier(symbol_paths)); | |
59 } | |
60 | |
61 BasicSourceLineResolver resolver; | |
62 MinidumpProcessor minidump_processor(symbol_supplier.get(), &resolver); | |
63 | |
64 // Process the minidump. | |
65 Minidump dump(input); | |
66 if (!dump.Read()) { | |
67 BPLOG(ERROR) << "Minidump " << dump.path() << " could not be read"; | |
68 return false; | |
69 } | |
70 ProcessState process_state; | |
71 if (minidump_processor.Process(&dump, &process_state) != | |
72 google_breakpad::PROCESS_OK) { | |
73 BPLOG(ERROR) << "MinidumpProcessor::Process failed"; | |
74 return false; | |
75 } | |
76 | |
77 PrintProcessStateMachineReadable(process_state); | |
78 | |
79 return true; | |
80 } | |
81 | |
82 } // namespace | |
83 | |
84 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | |
85 // TODO(wfh): Somehow pull symbols in. | |
86 PrintMinidumpProcess(data, size, std::vector<string>()); | |
87 return 0; | |
88 } | |
OLD | NEW |