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

Side by Side Diff: chrome/renderer/render_crash_handler_linux.cc

Issue 115808: Respect Linux user prefs with regards to crash reporting. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: with nits fixed, also some minor fixes to breakpad_linux.cc Created 11 years, 6 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
(Empty)
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <string>
6
7 #include <unistd.h>
8 #include <sys/socket.h>
9 #include <sys/uio.h>
10
11 #include "base/eintr_wrapper.h"
12 #include "breakpad/linux/exception_handler.h"
13 #include "breakpad/linux/linux_libc_support.h"
14 #include "breakpad/linux/linux_syscall_support.h"
15
16 // This is defined in chrome/renderer/renderer_logging_linux.cc, it's the
17 // static string containing the current active URL. We send this in the crash
18 // report.
19 namespace renderer_logging {
20 extern std::string active_url;
21 }
22
23 static bool
24 CrashHandler(const void* crash_context, size_t crash_context_size,
25 void* context) {
26 const int fd = (int) context;
27 int fds[2];
28 pipe(fds);
29
30 // The length of the control message:
31 static const unsigned kControlMsgSize =
32 CMSG_SPACE(sizeof(int)) + CMSG_SPACE(sizeof(struct ucred));
33
34 union {
35 struct kernel_msghdr msg;
36 struct msghdr sys_msg;
37 };
38 my_memset(&msg, 0, sizeof(struct kernel_msghdr));
39 struct kernel_iovec iov[2];
40 iov[0].iov_base = const_cast<void*>(crash_context);
41 iov[0].iov_len = crash_context_size;
42 iov[1].iov_base = const_cast<char*>(renderer_logging::active_url.data());
43 iov[1].iov_len = renderer_logging::active_url.size();
44
45 msg.msg_iov = iov;
46 msg.msg_iovlen = 2;
47 char cmsg[kControlMsgSize];
48 memset(cmsg, 0, kControlMsgSize);
49 msg.msg_control = cmsg;
50 msg.msg_controllen = sizeof(cmsg);
51
52 struct cmsghdr *hdr = CMSG_FIRSTHDR(&msg);
53 hdr->cmsg_level = SOL_SOCKET;
54 hdr->cmsg_type = SCM_RIGHTS;
55 hdr->cmsg_len = CMSG_LEN(sizeof(int));
56 *((int*) CMSG_DATA(hdr)) = fds[1];
57 hdr = CMSG_NXTHDR(&sys_msg, hdr);
58 hdr->cmsg_level = SOL_SOCKET;
59 hdr->cmsg_type = SCM_CREDENTIALS;
60 hdr->cmsg_len = CMSG_LEN(sizeof(struct ucred));
61 struct ucred *cred = reinterpret_cast<struct ucred*>(CMSG_DATA(hdr));
62 cred->uid = getuid();
63 cred->gid = getgid();
64 cred->pid = getpid();
65
66 HANDLE_EINTR(sys_sendmsg(fd, &msg, 0));
67 sys_close(fds[1]);
68
69 char b;
70 HANDLE_EINTR(sys_read(fds[0], &b, 1));
71
72 return true;
73 }
74
75 void EnableRendererCrashDumping() {
76 // When the browser forks off our process, it installs the crash signal file
77 // descriptor in this slot:
78 static const int kMagicCrashSignalFd = 4;
79
80 // We deliberately leak this object.
81 google_breakpad::ExceptionHandler* handler =
82 new google_breakpad::ExceptionHandler("" /* unused */, NULL, NULL,
83 (void*) kMagicCrashSignalFd, true);
84 handler->set_crash_handler(CrashHandler);
85 }
OLDNEW
« no previous file with comments | « chrome/renderer/render_crash_handler_linux.h ('k') | chrome/renderer/render_crash_handler_linux_stub.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698