| Index: chrome/app/breakpad_linux.cc
|
| ===================================================================
|
| --- chrome/app/breakpad_linux.cc (revision 17371)
|
| +++ chrome/app/breakpad_linux.cc (working copy)
|
| @@ -36,8 +36,11 @@
|
| }
|
| }
|
|
|
| -pid_t UploadCrashDump(const char* filename, const char* crash_url,
|
| - unsigned crash_url_length) {
|
| +pid_t UploadCrashDump(const char* filename,
|
| + const char* crash_url,
|
| + unsigned crash_url_length,
|
| + const char* guid,
|
| + unsigned guid_length) {
|
| // WARNING: this code runs in a compromised context. It may not call into
|
| // libc nor allocate memory normally.
|
|
|
| @@ -128,6 +131,9 @@
|
| // Content-Disposition: form-data; name="ver" \r\n \r\n (11..15)
|
| // 1.2.3.4 \r\n (16, 17)
|
| // BOUNDARY \r\n (18, 19)
|
| + // Content-Disposition: form-data; name="guid" \r\n \r\n (20..24)
|
| + // 1.2.3.4 \r\n (25, 26)
|
| + // BOUNDARY \r\n (27, 28)
|
| //
|
| // zero or more:
|
| // Content-Disposition: form-data; name="url-chunk-1" \r\n \r\n (0..5)
|
| @@ -145,13 +151,14 @@
|
| static const char quote_msg[] = {'"'};
|
| static const char chrome_linux_msg[] = "Chrome_Linux";
|
| static const char ver_msg[] = "ver";
|
| + static const char guid_msg[] = "guid";
|
| static const char dashdash_msg[] = {'-', '-'};
|
| static const char dump_msg[] = "upload_file_minidump\"; filename=\"dump\"";
|
| static const char content_type_msg[] =
|
| "Content-Type: application/octet-stream";
|
| static const char url_chunk_msg[] = "url-chunk-";
|
|
|
| - struct kernel_iovec iov[20];
|
| + struct kernel_iovec iov[29];
|
| iov[0].iov_base = mime_boundary;
|
| iov[0].iov_len = sizeof(mime_boundary) - 1;
|
| iov[1].iov_base = const_cast<char*>(rn);
|
| @@ -199,8 +206,29 @@
|
| iov[19].iov_base = const_cast<char*>(rn);
|
| iov[19].iov_len = sizeof(rn);
|
|
|
| - sys_writev(fd, iov, 20);
|
| + iov[20].iov_base = const_cast<char*>(form_data_msg);
|
| + iov[20].iov_len = sizeof(form_data_msg) - 1;
|
| + iov[21].iov_base = const_cast<char*>(guid_msg);
|
| + iov[21].iov_len = sizeof(guid_msg) - 1;
|
| + iov[22].iov_base = const_cast<char*>(quote_msg);
|
| + iov[22].iov_len = sizeof(quote_msg);
|
| + iov[23].iov_base = const_cast<char*>(rn);
|
| + iov[23].iov_len = sizeof(rn);
|
| + iov[24].iov_base = const_cast<char*>(rn);
|
| + iov[24].iov_len = sizeof(rn);
|
|
|
| + iov[25].iov_base = const_cast<char*>(guid);
|
| + iov[25].iov_len = guid_length;
|
| + iov[26].iov_base = const_cast<char*>(rn);
|
| + iov[26].iov_len = sizeof(rn);
|
| +
|
| + iov[27].iov_base = mime_boundary;
|
| + iov[27].iov_len = sizeof(mime_boundary) - 1;
|
| + iov[28].iov_base = const_cast<char*>(rn);
|
| + iov[28].iov_len = sizeof(rn);
|
| +
|
| + sys_writev(fd, iov, 29);
|
| +
|
| if (crash_url_length) {
|
| unsigned i = 0, done = 0;
|
| static const unsigned kMaxCrashChunkSize = 64;
|
| @@ -338,7 +366,7 @@
|
| id_buf[len] = 0;
|
| static const char msg[] = "\nCrash dump id: ";
|
| sys_write(2, msg, sizeof(msg) - 1);
|
| - sys_write(2, id_buf, my_strlen(buf));
|
| + sys_write(2, id_buf, my_strlen(id_buf));
|
| sys_write(2, "\n", 1);
|
| }
|
| sys_unlink(filename);
|
| @@ -369,6 +397,13 @@
|
| return child;
|
| }
|
|
|
| +// This is defined in chrome/browser/google_update_settings_linux.cc, it's the
|
| +// static string containing the user's unique GUID. We send this in the crash
|
| +// report.
|
| +namespace google_update {
|
| +extern std::string linux_guid;
|
| +}
|
| +
|
| static bool CrashDone(const char* dump_path,
|
| const char* minidump_id,
|
| void* context,
|
| @@ -390,7 +425,8 @@
|
| memcpy(path + dump_path_len + 1 + minidump_id_len, ".dmp", 4);
|
| path[dump_path_len + 1 + minidump_id_len + 4] = 0;
|
|
|
| - UploadCrashDump(path, NULL, 0);
|
| + UploadCrashDump(path, NULL, 0, google_update::linux_guid.data(),
|
| + google_update::linux_guid.length());
|
|
|
| return true;
|
| }
|
| @@ -425,14 +461,16 @@
|
| struct msghdr sys_msg;
|
| };
|
| my_memset(&msg, 0, sizeof(struct kernel_msghdr));
|
| - struct kernel_iovec iov[2];
|
| + struct kernel_iovec iov[3];
|
| iov[0].iov_base = const_cast<void*>(crash_context);
|
| iov[0].iov_len = crash_context_size;
|
| - iov[1].iov_base = const_cast<char*>(renderer_logging::active_url.data());
|
| - iov[1].iov_len = renderer_logging::active_url.size();
|
| + iov[1].iov_base = const_cast<char*>(google_update::linux_guid.data());
|
| + iov[1].iov_len = google_update::linux_guid.size();
|
| + iov[2].iov_base = const_cast<char*>(renderer_logging::active_url.data());
|
| + iov[2].iov_len = renderer_logging::active_url.size();
|
|
|
| msg.msg_iov = iov;
|
| - msg.msg_iovlen = 2;
|
| + msg.msg_iovlen = 3;
|
| char cmsg[kControlMsgSize];
|
| memset(cmsg, 0, kControlMsgSize);
|
| msg.msg_control = cmsg;
|
|
|