diff options
author | ted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2010-12-13 22:10:23 +0000 |
---|---|---|
committer | ted.mielczarek <ted.mielczarek@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2010-12-13 22:10:23 +0000 |
commit | ef7262d4775bf6de750bc2a26dbf98368d7ec0c3 (patch) | |
tree | a85d6b8c2b66f2da9fdbef3fd0a936dd7f566ac4 /src/client/linux/minidump_writer/linux_dumper.cc | |
parent | Reuse code and fix inconsistent array boundaries. (diff) | |
download | breakpad-ef7262d4775bf6de750bc2a26dbf98368d7ec0c3.tar.xz |
allow passing info about known memory mappings to MinidumpWriter and ExceptionHandler
r=thestig at http://breakpad.appspot.com/242001/show
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@741 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/client/linux/minidump_writer/linux_dumper.cc')
-rw-r--r-- | src/client/linux/minidump_writer/linux_dumper.cc | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/client/linux/minidump_writer/linux_dumper.cc b/src/client/linux/minidump_writer/linux_dumper.cc index 6e6f4cfa..5187120f 100644 --- a/src/client/linux/minidump_writer/linux_dumper.cc +++ b/src/client/linux/minidump_writer/linux_dumper.cc @@ -104,12 +104,12 @@ static bool ResumeThread(pid_t pid) { } inline static bool IsMappedFileOpenUnsafe( - const google_breakpad::MappingInfo* mapping) { + const google_breakpad::MappingInfo& mapping) { // It is unsafe to attempt to open a mapped file that lives under /dev, // because the semantics of the open may be driver-specific so we'd risk // hanging the crash dumper. And a file in /dev/ almost certainly has no // ELF file identifier anyways. - return my_strncmp(mapping->name, + return my_strncmp(mapping.name, kMappedFileUnsafePrefix, sizeof(kMappedFileUnsafePrefix) - 1) == 0; } @@ -203,21 +203,21 @@ LinuxDumper::BuildProcPath(char* path, pid_t pid, const char* node) const { } bool -LinuxDumper::ElfFileIdentifierForMapping(unsigned int mapping_id, +LinuxDumper::ElfFileIdentifierForMapping(const MappingInfo& mapping, + unsigned int mapping_id, uint8_t identifier[sizeof(MDGUID)]) { - assert(mapping_id < mappings_.size()); + assert(mapping_id == -1 || mapping_id < mappings_.size()); my_memset(identifier, 0, sizeof(MDGUID)); - MappingInfo* mapping = mappings_[mapping_id]; if (IsMappedFileOpenUnsafe(mapping)) return false; char filename[NAME_MAX]; - size_t filename_len = my_strlen(mapping->name); + size_t filename_len = my_strlen(mapping.name); assert(filename_len < NAME_MAX); if (filename_len >= NAME_MAX) return false; - memcpy(filename, mapping->name, filename_len); + memcpy(filename, mapping.name, filename_len); filename[filename_len] = '\0'; bool filename_modified = HandleDeletedFileInMapping(filename); @@ -239,8 +239,11 @@ LinuxDumper::ElfFileIdentifierForMapping(unsigned int mapping_id, bool success = FileID::ElfFileIdentifierFromMappedFile(base, identifier); sys_munmap(base, st.st_size); - if (success && filename_modified) - mapping->name[filename_len - sizeof(kDeletedSuffix) + 1] = '\0'; + if (success && mapping_id != -1 && filename_modified) { + mappings_[mapping_id]->name[filename_len - + sizeof(kDeletedSuffix) + 1] = '\0'; + } + return success; } @@ -310,7 +313,7 @@ LinuxDumper::EnumerateMappings(wasteful_vector<MappingInfo*>* result) const { module->offset = offset; const char* name = NULL; // Only copy name if the name is a valid path name, or if - // we've found the VDSO image + // it's the VDSO image. if ((name = my_strchr(line, '/')) != NULL) { const unsigned l = my_strlen(name); if (l < sizeof(module->name)) @@ -500,7 +503,7 @@ const MappingInfo* LinuxDumper::FindMapping(const void* address) const { return NULL; } -bool LinuxDumper::HandleDeletedFileInMapping(char* path) { +bool LinuxDumper::HandleDeletedFileInMapping(char* path) const { static const size_t kDeletedSuffixLen = sizeof(kDeletedSuffix) - 1; // Check for ' (deleted)' in |path|. |