Chromium Code Reviews| Index: src/processor/exploitability_linux.h |
| =================================================================== |
| --- src/processor/exploitability_linux.h (revision 1471) |
| +++ src/processor/exploitability_linux.h (working copy) |
| @@ -37,11 +37,26 @@ |
| #ifndef GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_LINUX_H_ |
| #define GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_LINUX_H_ |
| +#include <elf.h> |
| +#include <string.h> |
| + |
| +#include "common/scoped_ptr.h" |
| #include "google_breakpad/common/breakpad_types.h" |
| #include "google_breakpad/processor/exploitability.h" |
| namespace google_breakpad { |
| +enum LinuxArchitectureType { |
| + // A 32-bit Linux architecture. |
| + LINUX_32_BIT, |
| + |
| + // A 64-bit Linux architecture. |
| + LINUX_64_BIT, |
| + |
| + // Some other architecture that is not Linux. |
| + UNSUPPORTED_ARCHITECTURE |
| +}; |
| + |
| class ExploitabilityLinux : public Exploitability { |
| public: |
| ExploitabilityLinux(Minidump *dump, |
| @@ -57,6 +72,50 @@ |
| // This method checks the exception that triggered the creation of the |
| // minidump and reports whether the exception suggests no exploitability. |
| bool BenignCrashTrigger(const MDRawExceptionStream *raw_exception_stream); |
| + |
| + // Checks if the minidump architecture is 32-bit or 64-bit. |
| + LinuxArchitectureType ArchitectureType(); |
| + |
| + // Loads ELF header data of the module present in the given memory |
| + // region into the scoped pointer. |
| + // This method takes a scoped pointer in which the ELF header data is |
| + // loaded, the memory region containing the ELF header, and the base |
| + // address of the ELF header. |
| + template<typename T> |
| + void LoadElfHeader(MinidumpMemoryRegion *memory, |
| + uint64_t base_address, |
| + T *header) { |
| + for (size_t i = 0; i < sizeof(T); i++) { |
| + uint8_t my_byte = 0; |
| + memory->GetMemoryAtAddress(base_address + i, &my_byte); |
| + memcpy(reinterpret_cast<char *>(header) + i, |
|
ivanpe
2015/07/16 17:20:57
You are copying a single byte here. Why not just
liuandrew
2015/07/16 17:35:08
Done.
|
| + &my_byte, |
| + sizeof(uint8_t)); |
| + } |
| + } |
| + |
| + // Loads the Program Header Table of the module present in the given |
| + // memory region into the scoped array. |
| + // This method takes a scoped array in which the header table data is |
| + // loaded, the memory region containing the table, the base address of |
| + // the program header table, and the number of entries in the table. |
| + template<typename T> |
| + void LoadElfHeaderTable(MinidumpMemoryRegion *memory, |
| + uint64_t base_address, |
| + uint16_t e_phnum, |
| + T table[]) { |
| + uint64_t offset = 0; |
| + for (size_t i = 0; i < e_phnum; i++) { |
| + T *entry = &table[i]; |
| + for (size_t j = 0; j < sizeof(T); j++) { |
| + uint8_t my_byte = 0; |
| + memory->GetMemoryAtAddress(base_address + offset++, &my_byte); |
| + memcpy(reinterpret_cast<char *>(entry) + j, |
|
ivanpe
2015/07/16 17:20:57
*(reinterpret_cast<uint8_t *>(entry) + j) = my_byt
liuandrew
2015/07/16 17:35:08
Done.
|
| + &my_byte, |
| + sizeof(uint8_t)); |
| + } |
| + } |
| + } |
| }; |
| } // namespace google_breakpad |