Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: snapshot/mac/mach_o_image_reader.cc

Issue 1044273002: Improve map insertions (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698