OLD | NEW |
---|---|
1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
97 } | 97 } |
98 | 98 |
99 scoped_ptr<process_types::nlist[]> symbols( | 99 scoped_ptr<process_types::nlist[]> symbols( |
100 new process_types::nlist[symtab_command->nsyms]); | 100 new process_types::nlist[symtab_command->nsyms]); |
101 if (!process_types::nlist::ReadArrayInto( | 101 if (!process_types::nlist::ReadArrayInto( |
102 process_reader_, symtab_address, symbol_count, &symbols[0])) { | 102 process_reader_, symtab_address, symbol_count, &symbols[0])) { |
103 LOG(WARNING) << "could not read symbol table" << module_info_; | 103 LOG(WARNING) << "could not read symbol table" << module_info_; |
104 return false; | 104 return false; |
105 } | 105 } |
106 | 106 |
107 scoped_ptr<TaskMemory::MappedMemory> string_table; | |
107 for (size_t symbol_index = 0; symbol_index < symbol_count; ++symbol_index) { | 108 for (size_t symbol_index = 0; symbol_index < symbol_count; ++symbol_index) { |
108 const process_types::nlist& symbol = symbols[symbol_index]; | 109 const process_types::nlist& symbol = symbols[symbol_index]; |
109 std::string symbol_info = base::StringPrintf(", symbol index %zu%s", | 110 std::string symbol_info = base::StringPrintf(", symbol index %zu%s", |
110 skip_count + symbol_index, | 111 skip_count + symbol_index, |
111 module_info_.c_str()); | 112 module_info_.c_str()); |
112 uint8_t symbol_type = symbol.n_type & N_TYPE; | 113 uint8_t symbol_type = symbol.n_type & N_TYPE; |
113 if ((symbol.n_type & N_STAB) == 0 && (symbol.n_type & N_PEXT) == 0 && | 114 if ((symbol.n_type & N_STAB) == 0 && (symbol.n_type & N_PEXT) == 0 && |
114 (symbol_type == N_ABS || symbol_type == N_SECT) && | 115 (symbol_type == N_ABS || symbol_type == N_SECT) && |
115 (symbol.n_type & N_EXT)) { | 116 (symbol.n_type & N_EXT)) { |
116 if (symbol.n_strx >= strtab_size) { | 117 if (symbol.n_strx >= strtab_size) { |
117 LOG(WARNING) << base::StringPrintf( | 118 LOG(WARNING) << base::StringPrintf( |
118 "string at 0x%x out of bounds (0x%llx)", | 119 "string at 0x%x out of bounds (0x%llx)", |
119 symbol.n_strx, | 120 symbol.n_strx, |
120 strtab_size) << symbol_info; | 121 strtab_size) << symbol_info; |
121 return false; | 122 return false; |
122 } | 123 } |
123 | 124 |
125 if (!string_table) { | |
126 string_table = process_reader_->Memory()->ReadMapped( | |
127 strtab_address, strtab_size); | |
128 if (!string_table) { | |
129 LOG(WARNING) << "could not read string table" << module_info_; | |
130 return false; | |
131 } | |
132 } | |
133 | |
124 std::string name; | 134 std::string name; |
125 if (!process_reader_->Memory()->ReadCStringSizeLimited( | 135 if (!string_table->ReadCString(symbol.n_strx, &name)) { |
Robert Sesek
2014/09/10 21:37:40
This doesn't take into the size limiting anymore.
Mark Mentovai
2014/09/10 22:16:55
rsesek wrote:
| |
126 strtab_address + symbol.n_strx, | |
127 strtab_size - symbol.n_strx, | |
128 &name)) { | |
129 LOG(WARNING) << "could not read string" << symbol_info; | 136 LOG(WARNING) << "could not read string" << symbol_info; |
130 return false; | 137 return false; |
131 } | 138 } |
132 | 139 |
133 if (symbol_type == N_ABS && symbol.n_sect != NO_SECT) { | 140 if (symbol_type == N_ABS && symbol.n_sect != NO_SECT) { |
134 LOG(WARNING) << base::StringPrintf("N_ABS symbol %s in section %u", | 141 LOG(WARNING) << base::StringPrintf("N_ABS symbol %s in section %u", |
135 name.c_str(), | 142 name.c_str(), |
136 symbol.n_sect) << symbol_info; | 143 symbol.n_sect) << symbol_info; |
137 return false; | 144 return false; |
138 } | 145 } |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
258 INITIALIZATION_STATE_DCHECK_VALID(initialized_); | 265 INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
259 | 266 |
260 const auto& iterator = external_defined_symbols_.find(name); | 267 const auto& iterator = external_defined_symbols_.find(name); |
261 if (iterator == external_defined_symbols_.end()) { | 268 if (iterator == external_defined_symbols_.end()) { |
262 return NULL; | 269 return NULL; |
263 } | 270 } |
264 return &iterator->second; | 271 return &iterator->second; |
265 } | 272 } |
266 | 273 |
267 } // namespace crashpad | 274 } // namespace crashpad |
OLD | NEW |