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, |
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 // See the License for the specific language governing permissions and | 12 // See the License for the specific language governing permissions and |
13 // limitations under the License. | 13 // limitations under the License. |
14 | 14 |
15 #include "snapshot/mac/mach_o_image_reader.h" | 15 #include "snapshot/mac/mach_o_image_reader.h" |
16 | 16 |
17 #include <mach-o/loader.h> | 17 #include <mach-o/loader.h> |
18 #include <mach-o/nlist.h> | 18 #include <mach-o/nlist.h> |
19 #include <string.h> | 19 #include <string.h> |
20 | 20 |
21 #include <limits> | 21 #include <limits> |
22 #include <vector> | 22 #include <vector> |
| 23 #include <utility> |
23 | 24 |
24 #include "base/logging.h" | 25 #include "base/logging.h" |
25 #include "base/strings/stringprintf.h" | 26 #include "base/strings/stringprintf.h" |
26 #include "client/crashpad_info.h" | 27 #include "client/crashpad_info.h" |
27 #include "snapshot/mac/mach_o_image_segment_reader.h" | 28 #include "snapshot/mac/mach_o_image_segment_reader.h" |
28 #include "snapshot/mac/mach_o_image_symbol_table_reader.h" | 29 #include "snapshot/mac/mach_o_image_symbol_table_reader.h" |
29 #include "snapshot/mac/process_reader.h" | 30 #include "snapshot/mac/process_reader.h" |
30 #include "util/mac/checked_mach_address_range.h" | 31 #include "util/mac/checked_mach_address_range.h" |
31 | 32 |
32 namespace { | 33 namespace { |
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 // At this point, the segment itself is considered valid, but if one of the | 537 // At this point, the segment itself is considered valid, but if one of the |
537 // next checks fails, it will render the module invalid. If any of the next | 538 // next checks fails, it will render the module invalid. If any of the next |
538 // checks fail, this method should return false, but it doesn’t need to bother | 539 // checks fail, this method should return false, but it doesn’t need to bother |
539 // removing the segment from segments_. The segment will be properly released | 540 // removing the segment from segments_. The segment will be properly released |
540 // when the image is destroyed, and the image won’t be usable because | 541 // when the image is destroyed, and the image won’t be usable because |
541 // initialization won’t have completed. Most importantly, leaving the segment | 542 // initialization won’t have completed. Most importantly, leaving the segment |
542 // in segments_ means that no other structures (such as perhaps segment_map_) | 543 // in segments_ means that no other structures (such as perhaps segment_map_) |
543 // become inconsistent or require cleanup. | 544 // become inconsistent or require cleanup. |
544 | 545 |
545 const std::string segment_name = segment->Name(); | 546 const std::string segment_name = segment->Name(); |
546 const auto& iterator = segment_map_.find(segment_name); | 547 const auto insert_result = |
547 if (iterator != segment_map_.end()) { | 548 segment_map_.insert(std::make_pair(segment_name, segment_index)); |
| 549 if (!insert_result.second) { |
548 LOG(WARNING) << base::StringPrintf("duplicate %s segment at %zu and %zu", | 550 LOG(WARNING) << base::StringPrintf("duplicate %s segment at %zu and %zu", |
549 segment_name.c_str(), | 551 segment_name.c_str(), |
550 iterator->second, | 552 insert_result.first->second, |
551 segment_index) << load_command_info; | 553 segment_index) << load_command_info; |
552 return false; | 554 return false; |
553 } | 555 } |
554 segment_map_[segment_name] = segment_index; | |
555 | 556 |
556 mach_vm_size_t vmsize = segment->vmsize(); | 557 mach_vm_size_t vmsize = segment->vmsize(); |
557 | 558 |
558 if (segment_name == SEG_TEXT) { | 559 if (segment_name == SEG_TEXT) { |
559 if (vmsize == 0) { | 560 if (vmsize == 0) { |
560 LOG(WARNING) << "zero-sized " SEG_TEXT " segment" << load_command_info; | 561 LOG(WARNING) << "zero-sized " SEG_TEXT " segment" << load_command_info; |
561 return false; | 562 return false; |
562 } | 563 } |
563 | 564 |
564 mach_vm_size_t fileoff = segment->fileoff(); | 565 mach_vm_size_t fileoff = segment->fileoff(); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
713 linkedit_segment, | 714 linkedit_segment, |
714 module_info_)) { | 715 module_info_)) { |
715 symbol_table_.reset(); | 716 symbol_table_.reset(); |
716 return; | 717 return; |
717 } | 718 } |
718 | 719 |
719 symbol_table_initialized_.set_valid(); | 720 symbol_table_initialized_.set_valid(); |
720 } | 721 } |
721 | 722 |
722 } // namespace crashpad | 723 } // namespace crashpad |
OLD | NEW |