OLD | NEW |
1 // Copyright (c) 2010, Google Inc. | 1 // Copyright (c) 2010, Google Inc. |
2 // All rights reserved. | 2 // All rights reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
6 // met: | 6 // met: |
7 // | 7 // |
8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 #if defined(__ANDROID__) | 114 #if defined(__ANDROID__) |
115 LatePostprocessMappings(); | 115 LatePostprocessMappings(); |
116 #endif | 116 #endif |
117 return true; | 117 return true; |
118 } | 118 } |
119 | 119 |
120 bool | 120 bool |
121 LinuxDumper::ElfFileIdentifierForMapping(const MappingInfo& mapping, | 121 LinuxDumper::ElfFileIdentifierForMapping(const MappingInfo& mapping, |
122 bool member, | 122 bool member, |
123 unsigned int mapping_id, | 123 unsigned int mapping_id, |
124 uint8_t identifier[sizeof(MDGUID)]) { | 124 wasteful_vector<uint8_t>& identifier) { |
125 assert(!member || mapping_id < mappings_.size()); | 125 assert(!member || mapping_id < mappings_.size()); |
126 my_memset(identifier, 0, sizeof(MDGUID)); | |
127 if (IsMappedFileOpenUnsafe(mapping)) | 126 if (IsMappedFileOpenUnsafe(mapping)) |
128 return false; | 127 return false; |
129 | 128 |
130 // Special-case linux-gate because it's not a real file. | 129 // Special-case linux-gate because it's not a real file. |
131 if (my_strcmp(mapping.name, kLinuxGateLibraryName) == 0) { | 130 if (my_strcmp(mapping.name, kLinuxGateLibraryName) == 0) { |
132 void* linux_gate = NULL; | 131 void* linux_gate = NULL; |
133 if (pid_ == sys_getpid()) { | 132 if (pid_ == sys_getpid()) { |
134 linux_gate = reinterpret_cast<void*>(mapping.start_addr); | 133 linux_gate = reinterpret_cast<void*>(mapping.start_addr); |
135 } else { | 134 } else { |
136 linux_gate = allocator_.Alloc(mapping.size); | 135 linux_gate = allocator_.Alloc(mapping.size); |
137 CopyFromProcess(linux_gate, pid_, | 136 CopyFromProcess(linux_gate, pid_, |
138 reinterpret_cast<const void*>(mapping.start_addr), | 137 reinterpret_cast<const void*>(mapping.start_addr), |
139 mapping.size); | 138 mapping.size); |
140 } | 139 } |
141 return FileID::ElfFileIdentifierFromMappedFile(linux_gate, identifier); | 140 return FileID::ElfFileIdentifierFromMappedFile(linux_gate, |
| 141 identifier); |
142 } | 142 } |
143 | 143 |
144 char filename[PATH_MAX]; | 144 char filename[PATH_MAX]; |
145 if (!GetMappingAbsolutePath(mapping, filename)) | 145 if (!GetMappingAbsolutePath(mapping, filename)) |
146 return false; | 146 return false; |
147 bool filename_modified = HandleDeletedFileInMapping(filename); | 147 bool filename_modified = HandleDeletedFileInMapping(filename); |
148 | 148 |
149 MemoryMappedFile mapped_file(filename, mapping.offset); | 149 MemoryMappedFile mapped_file(filename, mapping.offset); |
150 if (!mapped_file.data() || mapped_file.size() < SELFMAG) | 150 if (!mapped_file.data() || mapped_file.size() < SELFMAG) |
151 return false; | 151 return false; |
152 | 152 |
153 bool success = | 153 bool success = |
154 FileID::ElfFileIdentifierFromMappedFile(mapped_file.data(), identifier); | 154 FileID::ElfFileIdentifierFromMappedFile(mapped_file.data(), |
| 155 identifier); |
155 if (success && member && filename_modified) { | 156 if (success && member && filename_modified) { |
156 mappings_[mapping_id]->name[my_strlen(mapping.name) - | 157 mappings_[mapping_id]->name[my_strlen(mapping.name) - |
157 sizeof(kDeletedSuffix) + 1] = '\0'; | 158 sizeof(kDeletedSuffix) + 1] = '\0'; |
158 } | 159 } |
159 | 160 |
160 return success; | 161 return success; |
161 } | 162 } |
162 | 163 |
163 bool LinuxDumper::GetMappingAbsolutePath(const MappingInfo& mapping, | 164 bool LinuxDumper::GetMappingAbsolutePath(const MappingInfo& mapping, |
164 char path[PATH_MAX]) const { | 165 char path[PATH_MAX]) const { |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
597 exe_stat.st_dev == new_path_stat.st_dev && | 598 exe_stat.st_dev == new_path_stat.st_dev && |
598 exe_stat.st_ino == new_path_stat.st_ino) { | 599 exe_stat.st_ino == new_path_stat.st_ino) { |
599 return false; | 600 return false; |
600 } | 601 } |
601 | 602 |
602 my_memcpy(path, exe_link, NAME_MAX); | 603 my_memcpy(path, exe_link, NAME_MAX); |
603 return true; | 604 return true; |
604 } | 605 } |
605 | 606 |
606 } // namespace google_breakpad | 607 } // namespace google_breakpad |
OLD | NEW |