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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 #if defined(__ANDROID__) | 112 #if defined(__ANDROID__) |
113 LatePostprocessMappings(); | 113 LatePostprocessMappings(); |
114 #endif | 114 #endif |
115 return true; | 115 return true; |
116 } | 116 } |
117 | 117 |
118 bool | 118 bool |
119 LinuxDumper::ElfFileIdentifierForMapping(const MappingInfo& mapping, | 119 LinuxDumper::ElfFileIdentifierForMapping(const MappingInfo& mapping, |
120 bool member, | 120 bool member, |
121 unsigned int mapping_id, | 121 unsigned int mapping_id, |
122 uint8_t identifier[sizeof(MDGUID)]) { | 122 uint8_t identifier[kMaxBuildID], |
| 123 size_t* identifier_length) { |
123 assert(!member || mapping_id < mappings_.size()); | 124 assert(!member || mapping_id < mappings_.size()); |
124 my_memset(identifier, 0, sizeof(MDGUID)); | 125 assert(identifier_length); |
| 126 my_memset(identifier, 0, kMaxBuildID); |
125 if (IsMappedFileOpenUnsafe(mapping)) | 127 if (IsMappedFileOpenUnsafe(mapping)) |
126 return false; | 128 return false; |
127 | 129 |
128 // Special-case linux-gate because it's not a real file. | 130 // Special-case linux-gate because it's not a real file. |
129 if (my_strcmp(mapping.name, kLinuxGateLibraryName) == 0) { | 131 if (my_strcmp(mapping.name, kLinuxGateLibraryName) == 0) { |
130 void* linux_gate = NULL; | 132 void* linux_gate = NULL; |
131 if (pid_ == sys_getpid()) { | 133 if (pid_ == sys_getpid()) { |
132 linux_gate = reinterpret_cast<void*>(mapping.start_addr); | 134 linux_gate = reinterpret_cast<void*>(mapping.start_addr); |
133 } else { | 135 } else { |
134 linux_gate = allocator_.Alloc(mapping.size); | 136 linux_gate = allocator_.Alloc(mapping.size); |
135 CopyFromProcess(linux_gate, pid_, | 137 CopyFromProcess(linux_gate, pid_, |
136 reinterpret_cast<const void*>(mapping.start_addr), | 138 reinterpret_cast<const void*>(mapping.start_addr), |
137 mapping.size); | 139 mapping.size); |
138 } | 140 } |
139 return FileID::ElfFileIdentifierFromMappedFile(linux_gate, identifier); | 141 return FileID::ElfFileIdentifierFromMappedFile(linux_gate, |
| 142 identifier, |
| 143 identifier_length); |
140 } | 144 } |
141 | 145 |
142 char filename[NAME_MAX]; | 146 char filename[NAME_MAX]; |
143 size_t filename_len = my_strlen(mapping.name); | 147 size_t filename_len = my_strlen(mapping.name); |
144 if (filename_len >= NAME_MAX) { | 148 if (filename_len >= NAME_MAX) { |
145 assert(false); | 149 assert(false); |
146 return false; | 150 return false; |
147 } | 151 } |
148 my_memcpy(filename, mapping.name, filename_len); | 152 my_memcpy(filename, mapping.name, filename_len); |
149 filename[filename_len] = '\0'; | 153 filename[filename_len] = '\0'; |
150 bool filename_modified = HandleDeletedFileInMapping(filename); | 154 bool filename_modified = HandleDeletedFileInMapping(filename); |
151 | 155 |
152 MemoryMappedFile mapped_file(filename, mapping.offset); | 156 MemoryMappedFile mapped_file(filename, mapping.offset); |
153 if (!mapped_file.data() || mapped_file.size() < SELFMAG) | 157 if (!mapped_file.data() || mapped_file.size() < SELFMAG) |
154 return false; | 158 return false; |
155 | 159 |
156 bool success = | 160 bool success = |
157 FileID::ElfFileIdentifierFromMappedFile(mapped_file.data(), identifier); | 161 FileID::ElfFileIdentifierFromMappedFile(mapped_file.data(), |
| 162 identifier, |
| 163 identifier_length); |
158 if (success && member && filename_modified) { | 164 if (success && member && filename_modified) { |
159 mappings_[mapping_id]->name[filename_len - | 165 mappings_[mapping_id]->name[filename_len - |
160 sizeof(kDeletedSuffix) + 1] = '\0'; | 166 sizeof(kDeletedSuffix) + 1] = '\0'; |
161 } | 167 } |
162 | 168 |
163 return success; | 169 return success; |
164 } | 170 } |
165 | 171 |
166 namespace { | 172 namespace { |
167 bool ElfFileSoNameFromMappedFile( | 173 bool ElfFileSoNameFromMappedFile( |
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
596 exe_stat.st_dev == new_path_stat.st_dev && | 602 exe_stat.st_dev == new_path_stat.st_dev && |
597 exe_stat.st_ino == new_path_stat.st_ino) { | 603 exe_stat.st_ino == new_path_stat.st_ino) { |
598 return false; | 604 return false; |
599 } | 605 } |
600 | 606 |
601 my_memcpy(path, exe_link, NAME_MAX); | 607 my_memcpy(path, exe_link, NAME_MAX); |
602 return true; | 608 return true; |
603 } | 609 } |
604 | 610 |
605 } // namespace google_breakpad | 611 } // namespace google_breakpad |
OLD | NEW |