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

Side by Side Diff: components/breakpad/app/breakpad_linux.cc

Issue 296553002: Breakpad Linux: Prevent some memory leaks. (Try 2) (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: fix asan Created 6 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // For linux_syscall_support.h. This makes it safe to call embedded system 5 // For linux_syscall_support.h. This makes it safe to call embedded system
6 // calls when in seccomp mode. 6 // calls when in seccomp mode.
7 7
8 #include "components/breakpad/app/breakpad_linux.h" 8 #include "components/breakpad/app/breakpad_linux.h"
9 9
10 #include <fcntl.h> 10 #include <fcntl.h>
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 } 196 }
197 #endif 197 #endif
198 198
199 size_t LengthWithoutTrailingSpaces(const char* str, size_t len) { 199 size_t LengthWithoutTrailingSpaces(const char* str, size_t len) {
200 while (len > 0 && str[len - 1] == ' ') { 200 while (len > 0 && str[len - 1] == ' ') {
201 len--; 201 len--;
202 } 202 }
203 return len; 203 return len;
204 } 204 }
205 205
206 // Populates the passed in allocated string and its size with the distro of
207 // the crashing process.
208 // The passed string is expected to be at least kDistroSize bytes long.
209 void PopulateDistro(char* distro, size_t* distro_len_param) {
210 size_t distro_len = std::min(my_strlen(base::g_linux_distro), kDistroSize);
211 memcpy(distro, base::g_linux_distro, distro_len);
212 if (distro_len_param)
213 *distro_len_param = distro_len;
214 }
215
216 void SetClientIdFromCommandLine(const CommandLine& command_line) { 206 void SetClientIdFromCommandLine(const CommandLine& command_line) {
217 // Get the guid and linux distro from the command line switch. 207 // Get the guid and linux distro from the command line switch.
218 std::string switch_value = 208 std::string switch_value =
219 command_line.GetSwitchValueASCII(switches::kEnableCrashReporter); 209 command_line.GetSwitchValueASCII(switches::kEnableCrashReporter);
220 size_t separator = switch_value.find(","); 210 size_t separator = switch_value.find(",");
221 if (separator != std::string::npos) { 211 if (separator != std::string::npos) {
222 GetBreakpadClient()->SetClientID(switch_value.substr(0, separator)); 212 GetBreakpadClient()->SetClientID(switch_value.substr(0, separator));
223 base::SetLinuxDistro(switch_value.substr(separator + 1)); 213 base::SetLinuxDistro(switch_value.substr(separator + 1));
224 } else { 214 } else {
225 GetBreakpadClient()->SetClientID(switch_value); 215 GetBreakpadClient()->SetClientID(switch_value);
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 const bool succeeded) { 681 const bool succeeded) {
692 // WARNING: this code runs in a compromised context. It may not call into 682 // WARNING: this code runs in a compromised context. It may not call into
693 // libc nor allocate memory normally. 683 // libc nor allocate memory normally.
694 if (!succeeded) { 684 if (!succeeded) {
695 static const char msg[] = "Crash dump generation failed.\n"; 685 static const char msg[] = "Crash dump generation failed.\n";
696 WriteLog(msg, sizeof(msg) - 1); 686 WriteLog(msg, sizeof(msg) - 1);
697 return false; 687 return false;
698 } 688 }
699 689
700 // Start constructing the message to send to the browser. 690 // Start constructing the message to send to the browser.
701 char distro[kDistroSize + 1] = {0};
702 size_t distro_length = 0;
703 PopulateDistro(distro, &distro_length);
704 BreakpadInfo info = {0}; 691 BreakpadInfo info = {0};
705 info.filename = NULL; 692 info.filename = NULL;
706 info.fd = descriptor.fd(); 693 info.fd = descriptor.fd();
707 info.process_type = g_process_type; 694 info.process_type = g_process_type;
708 info.process_type_length = my_strlen(g_process_type); 695 info.process_type_length = my_strlen(g_process_type);
709 info.distro = distro; 696 info.distro = NULL;
710 info.distro_length = distro_length; 697 info.distro_length = 0;
711 info.upload = false; 698 info.upload = false;
712 info.process_start_time = g_process_start_time; 699 info.process_start_time = g_process_start_time;
713 info.pid = g_pid; 700 info.pid = g_pid;
714 info.crash_keys = g_crash_keys; 701 info.crash_keys = g_crash_keys;
715 HandleCrashDump(info); 702 HandleCrashDump(info);
716 bool finalize_result = FinalizeCrashDoneAndroid(); 703 bool finalize_result = FinalizeCrashDoneAndroid();
717 base::android::BuildInfo* android_build_info = 704 base::android::BuildInfo* android_build_info =
718 base::android::BuildInfo::GetInstance(); 705 base::android::BuildInfo::GetInstance();
719 if (android_build_info->sdk_int() >= 18 && 706 if (android_build_info->sdk_int() >= 18 &&
720 my_strcmp(android_build_info->build_type(), "eng") != 0 && 707 my_strcmp(android_build_info->build_type(), "eng") != 0 &&
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 virtual bool RequestDump(const void* crash_context, 768 virtual bool RequestDump(const void* crash_context,
782 size_t crash_context_size) OVERRIDE { 769 size_t crash_context_size) OVERRIDE {
783 int fds[2] = { -1, -1 }; 770 int fds[2] = { -1, -1 };
784 if (sys_socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0) { 771 if (sys_socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0) {
785 static const char msg[] = "Failed to create socket for crash dumping.\n"; 772 static const char msg[] = "Failed to create socket for crash dumping.\n";
786 WriteLog(msg, sizeof(msg) - 1); 773 WriteLog(msg, sizeof(msg) - 1);
787 return false; 774 return false;
788 } 775 }
789 776
790 // Start constructing the message to send to the browser. 777 // Start constructing the message to send to the browser.
791 char distro[kDistroSize + 1] = {0};
792 PopulateDistro(distro, NULL);
793
794 char b; // Dummy variable for sys_read below. 778 char b; // Dummy variable for sys_read below.
795 const char* b_addr = &b; // Get the address of |b| so we can create the 779 const char* b_addr = &b; // Get the address of |b| so we can create the
796 // expected /proc/[pid]/syscall content in the 780 // expected /proc/[pid]/syscall content in the
797 // browser to convert namespace tids. 781 // browser to convert namespace tids.
798 782
799 // The length of the control message: 783 // The length of the control message:
800 static const unsigned kControlMsgSize = sizeof(int); 784 static const unsigned kControlMsgSize = sizeof(int);
801 static const unsigned kControlMsgSpaceSize = CMSG_SPACE(kControlMsgSize); 785 static const unsigned kControlMsgSpaceSize = CMSG_SPACE(kControlMsgSize);
802 static const unsigned kControlMsgLenSize = CMSG_LEN(kControlMsgSize); 786 static const unsigned kControlMsgLenSize = CMSG_LEN(kControlMsgSize);
803 787
804 struct kernel_msghdr msg; 788 struct kernel_msghdr msg;
805 my_memset(&msg, 0, sizeof(struct kernel_msghdr)); 789 my_memset(&msg, 0, sizeof(struct kernel_msghdr));
806 struct kernel_iovec iov[kCrashIovSize]; 790 struct kernel_iovec iov[kCrashIovSize];
807 iov[0].iov_base = const_cast<void*>(crash_context); 791 iov[0].iov_base = const_cast<void*>(crash_context);
808 iov[0].iov_len = crash_context_size; 792 iov[0].iov_len = crash_context_size;
809 iov[1].iov_base = distro; 793 iov[1].iov_base = &b_addr;
810 iov[1].iov_len = kDistroSize + 1; 794 iov[1].iov_len = sizeof(b_addr);
811 iov[2].iov_base = &b_addr; 795 iov[2].iov_base = &fds[0];
812 iov[2].iov_len = sizeof(b_addr); 796 iov[2].iov_len = sizeof(fds[0]);
813 iov[3].iov_base = &fds[0]; 797 iov[3].iov_base = &g_process_start_time;
814 iov[3].iov_len = sizeof(fds[0]); 798 iov[3].iov_len = sizeof(g_process_start_time);
815 iov[4].iov_base = &g_process_start_time; 799 iov[4].iov_base = &base::g_oom_size;
816 iov[4].iov_len = sizeof(g_process_start_time); 800 iov[4].iov_len = sizeof(base::g_oom_size);
817 iov[5].iov_base = &base::g_oom_size;
818 iov[5].iov_len = sizeof(base::g_oom_size);
819 google_breakpad::SerializedNonAllocatingMap* serialized_map; 801 google_breakpad::SerializedNonAllocatingMap* serialized_map;
820 iov[6].iov_len = g_crash_keys->Serialize( 802 iov[5].iov_len = g_crash_keys->Serialize(
821 const_cast<const google_breakpad::SerializedNonAllocatingMap**>( 803 const_cast<const google_breakpad::SerializedNonAllocatingMap**>(
822 &serialized_map)); 804 &serialized_map));
823 iov[6].iov_base = serialized_map; 805 iov[5].iov_base = serialized_map;
824 #if defined(ADDRESS_SANITIZER) 806 #if !defined(ADDRESS_SANITIZER)
825 iov[7].iov_base = const_cast<char*>(g_asan_report_str); 807 COMPILE_ASSERT(5 == kCrashIovSize - 1, Incorrect_Number_Of_Iovec_Members);
826 iov[7].iov_len = kMaxAsanReportSize + 1; 808 #else
809 iov[6].iov_base = const_cast<char*>(g_asan_report_str);
810 iov[6].iov_len = kMaxAsanReportSize + 1;
811 COMPILE_ASSERT(6 == kCrashIovSize - 1, Incorrect_Number_Of_Iovec_Members);
827 #endif 812 #endif
828 813
829 msg.msg_iov = iov; 814 msg.msg_iov = iov;
830 msg.msg_iovlen = kCrashIovSize; 815 msg.msg_iovlen = kCrashIovSize;
831 char cmsg[kControlMsgSpaceSize]; 816 char cmsg[kControlMsgSpaceSize];
832 my_memset(cmsg, 0, kControlMsgSpaceSize); 817 my_memset(cmsg, 0, kControlMsgSpaceSize);
833 msg.msg_control = cmsg; 818 msg.msg_control = cmsg;
834 msg.msg_controllen = sizeof(cmsg); 819 msg.msg_controllen = sizeof(cmsg);
835 820
836 struct cmsghdr *hdr = CMSG_FIRSTHDR(&msg); 821 struct cmsghdr *hdr = CMSG_FIRSTHDR(&msg);
(...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after
1628 } 1613 }
1629 } 1614 }
1630 } 1615 }
1631 #endif // OS_ANDROID 1616 #endif // OS_ANDROID
1632 1617
1633 bool IsCrashReporterEnabled() { 1618 bool IsCrashReporterEnabled() {
1634 return g_is_crash_reporter_enabled; 1619 return g_is_crash_reporter_enabled;
1635 } 1620 }
1636 1621
1637 } // namespace breakpad 1622 } // namespace breakpad
OLDNEW
« no previous file with comments | « no previous file | components/breakpad/app/breakpad_linux_impl.h » ('j') | components/breakpad/browser/crash_handler_host_linux.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698