| Index: chrome/app/breakpad_linux.cc
|
| diff --git a/chrome/app/breakpad_linux.cc b/chrome/app/breakpad_linux.cc
|
| index 598ad28fce77a9e158cfb1d0f4993ce91c1e043d..8d8492eca35e5b0aa32da314735387edda6eb35e 100644
|
| --- a/chrome/app/breakpad_linux.cc
|
| +++ b/chrome/app/breakpad_linux.cc
|
| @@ -479,16 +479,12 @@ RendererCrashHandler(const void* crash_context, size_t crash_context_size,
|
| void* context) {
|
| const int fd = (int) context;
|
| int fds[2];
|
| - pipe(fds);
|
| + socketpair(AF_UNIX, SOCK_STREAM, 0, fds);
|
|
|
| // The length of the control message:
|
| - static const unsigned kControlMsgSize =
|
| - CMSG_SPACE(sizeof(int)) + CMSG_SPACE(sizeof(struct ucred));
|
| + static const unsigned kControlMsgSize = CMSG_SPACE(sizeof(int));
|
|
|
| - union {
|
| - struct kernel_msghdr msg;
|
| - struct msghdr sys_msg;
|
| - };
|
| + struct kernel_msghdr msg;
|
| my_memset(&msg, 0, sizeof(struct kernel_msghdr));
|
| struct kernel_iovec iov[3];
|
| iov[0].iov_base = const_cast<void*>(crash_context);
|
| @@ -510,14 +506,6 @@ RendererCrashHandler(const void* crash_context, size_t crash_context_size,
|
| hdr->cmsg_type = SCM_RIGHTS;
|
| hdr->cmsg_len = CMSG_LEN(sizeof(int));
|
| *((int*) CMSG_DATA(hdr)) = fds[1];
|
| - hdr = CMSG_NXTHDR(&sys_msg, hdr);
|
| - hdr->cmsg_level = SOL_SOCKET;
|
| - hdr->cmsg_type = SCM_CREDENTIALS;
|
| - hdr->cmsg_len = CMSG_LEN(sizeof(struct ucred));
|
| - struct ucred *cred = reinterpret_cast<struct ucred*>(CMSG_DATA(hdr));
|
| - cred->uid = getuid();
|
| - cred->gid = getgid();
|
| - cred->pid = getpid();
|
|
|
| HANDLE_EINTR(sys_sendmsg(fd, &msg, 0));
|
| sys_close(fds[1]);
|
| @@ -538,17 +526,21 @@ void EnableRendererCrashDumping() {
|
| }
|
|
|
| void InitCrashReporter() {
|
| - if (!GoogleUpdateSettings::GetCollectStatsConsent())
|
| - return;
|
| -
|
| // Determine the process type and take appropriate action.
|
| const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
|
| const std::wstring process_type =
|
| parsed_command_line.GetSwitchValue(switches::kProcessType);
|
| if (process_type.empty()) {
|
| + if (!GoogleUpdateSettings::GetCollectStatsConsent())
|
| + return;
|
| EnableCrashDumping();
|
| } else if (process_type == switches::kRendererProcess ||
|
| process_type == switches::kZygoteProcess) {
|
| + // We might be chrooted in a zygote or renderer process so we cannot call
|
| + // GetCollectStatsConsent because that needs access the the user's home
|
| + // dir. Instead, we set a command line flag for these processes.
|
| + if (!parsed_command_line.HasSwitch(switches::kRendererCrashDump))
|
| + return;
|
| EnableRendererCrashDumping();
|
| }
|
| }
|
|
|