OLD | NEW |
---|---|
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/crash/app/breakpad_linux.h" | 8 #include "components/crash/app/breakpad_linux.h" |
9 | 9 |
10 #include <fcntl.h> | 10 #include <fcntl.h> |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
159 } | 159 } |
160 | 160 |
161 // uint64_t version of my_uitos() from | 161 // uint64_t version of my_uitos() from |
162 // breakpad/src/common/linux/linux_libc_support.h. Convert a non-negative | 162 // breakpad/src/common/linux/linux_libc_support.h. Convert a non-negative |
163 // integer to a string (not null-terminated). | 163 // integer to a string (not null-terminated). |
164 void my_uint64tos(char* output, uint64_t i, unsigned i_len) { | 164 void my_uint64tos(char* output, uint64_t i, unsigned i_len) { |
165 for (unsigned index = i_len; index; --index, i /= 10) | 165 for (unsigned index = i_len; index; --index, i /= 10) |
166 output[index - 1] = '0' + (i % 10); | 166 output[index - 1] = '0' + (i % 10); |
167 } | 167 } |
168 | 168 |
169 #if defined(OS_ANDROID) | |
170 char* my_strncpy(char* dst, const char* src, size_t len) { | |
171 int i = len; | |
172 char* p = dst; | |
173 if (!dst || !src) | |
174 return dst; | |
175 while (i != 0 && *src != '\0') { | |
176 *p++ = *src++; | |
177 i--; | |
178 } | |
179 while (i != 0) { | |
180 *p++ = '\0'; | |
181 i--; | |
182 } | |
183 return dst; | |
184 } | |
185 | |
186 char* my_strncat(char *dest, const char* src, size_t len) { | |
187 char* ret = dest; | |
188 while (*dest) | |
189 dest++; | |
190 while (len--) | |
191 if (!(*dest++ = *src++)) | |
192 return ret; | |
193 *dest = 0; | |
194 return ret; | |
195 } | |
196 #endif | |
197 | |
198 #if !defined(OS_CHROMEOS) | 169 #if !defined(OS_CHROMEOS) |
199 bool my_isxdigit(char c) { | 170 bool my_isxdigit(char c) { |
200 return (c >= '0' && c <= '9') || ((c | 0x20) >= 'a' && (c | 0x20) <= 'f'); | 171 return (c >= '0' && c <= '9') || ((c | 0x20) >= 'a' && (c | 0x20) <= 'f'); |
201 } | 172 } |
202 #endif | 173 #endif |
203 | 174 |
204 size_t LengthWithoutTrailingSpaces(const char* str, size_t len) { | 175 size_t LengthWithoutTrailingSpaces(const char* str, size_t len) { |
205 while (len > 0 && str[len - 1] == ' ') { | 176 while (len > 0 && str[len - 1] == ' ') { |
206 len--; | 177 len--; |
207 } | 178 } |
(...skipping 1327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1535 writer.AddBoundary(); | 1506 writer.AddBoundary(); |
1536 writer.AddFileContents(g_log_msg, log_data, log_size); | 1507 writer.AddFileContents(g_log_msg, log_data, log_size); |
1537 #endif | 1508 #endif |
1538 writer.AddEnd(); | 1509 writer.AddEnd(); |
1539 writer.Flush(); | 1510 writer.Flush(); |
1540 | 1511 |
1541 IGNORE_RET(sys_close(temp_file_fd)); | 1512 IGNORE_RET(sys_close(temp_file_fd)); |
1542 | 1513 |
1543 #if defined(OS_ANDROID) | 1514 #if defined(OS_ANDROID) |
1544 if (info.filename) { | 1515 if (info.filename) { |
1545 int filename_length = my_strlen(info.filename); | 1516 size_t filename_length = my_strlen(info.filename); |
1546 | 1517 |
1547 // If this was a file, we need to copy it to the right place and use the | 1518 // If this was a file, we need to copy it to the right place and use the |
1548 // right file name so it gets uploaded by the browser. | 1519 // right file name so it gets uploaded by the browser. |
1549 const char msg[] = "Output crash dump file:"; | 1520 const char msg[] = "Output crash dump file:"; |
1550 WriteLog(msg, sizeof(msg) - 1); | 1521 WriteLog(msg, sizeof(msg) - 1); |
1551 WriteLog(info.filename, filename_length - 1); | 1522 WriteLog(info.filename, filename_length); |
hashimoto
2015/06/05 07:02:43
WriteLog's Android implementation ignores the seco
| |
1552 | 1523 |
1553 char pid_buf[kUint64StringSize]; | 1524 char pid_buf[kUint64StringSize]; |
1554 uint64_t pid_str_length = my_uint64_len(info.pid); | 1525 size_t pid_str_length = my_uint64_len(info.pid); |
1555 my_uint64tos(pid_buf, info.pid, pid_str_length); | 1526 my_uint64tos(pid_buf, info.pid, pid_str_length); |
1527 pid_buf[pid_str_length] = 0; // my_uint64tos() doesn't null-terminate. | |
1556 | 1528 |
1557 // -1 because we won't need the null terminator on the original filename. | 1529 size_t done_filename_len = filename_length + pid_str_length + 1; |
1558 unsigned done_filename_len = filename_length - 1 + pid_str_length; | |
hashimoto
2015/06/05 07:02:43
IIUC the existing code writes more bytes than allo
Lei Zhang
2015/06/05 18:24:09
Yes, it's full of fail. :(
| |
1559 char* done_filename = reinterpret_cast<char*>( | 1530 char* done_filename = reinterpret_cast<char*>( |
1560 allocator.Alloc(done_filename_len)); | 1531 allocator.Alloc(done_filename_len)); |
1561 // Rename the file such that the pid is the suffix in order signal to other | 1532 // Rename the file such that the pid is the suffix in order signal to other |
1562 // processes that the minidump is complete. The advantage of using the pid | 1533 // processes that the minidump is complete. The advantage of using the pid |
1563 // as the suffix is that it is trivial to associate the minidump with the | 1534 // as the suffix is that it is trivial to associate the minidump with the |
1564 // crashed process. | 1535 // crashed process. |
1565 // Finally, note strncpy prevents null terminators from | 1536 my_strlcpy(done_filename, info.filename, done_filename_len); |
1566 // being copied. Pad the rest with 0's. | 1537 my_strlcat(done_filename, pid_buf, done_filename_len); |
1567 my_strncpy(done_filename, info.filename, done_filename_len); | |
1568 // Append the suffix a null terminator should be added. | |
1569 my_strncat(done_filename, pid_buf, pid_str_length); | |
1570 // Rename the minidump file to signal that it is complete. | 1538 // Rename the minidump file to signal that it is complete. |
1571 if (rename(info.filename, done_filename)) { | 1539 if (rename(info.filename, done_filename)) { |
1572 const char failed_msg[] = "Failed to rename:"; | 1540 const char failed_msg[] = "Failed to rename:"; |
1573 WriteLog(failed_msg, sizeof(failed_msg) - 1); | 1541 WriteLog(failed_msg, sizeof(failed_msg) - 1); |
1574 WriteLog(info.filename, filename_length - 1); | 1542 WriteLog(info.filename, filename_length); |
1575 const char to_msg[] = "to"; | 1543 const char to_msg[] = "to"; |
1576 WriteLog(to_msg, sizeof(to_msg) - 1); | 1544 WriteLog(to_msg, sizeof(to_msg) - 1); |
1577 WriteLog(done_filename, done_filename_len - 1); | 1545 WriteLog(done_filename, done_filename_len); |
Lei Zhang
2015/06/05 18:24:09
The -1 should remain here, right?
hashimoto
2015/06/06 02:11:05
Ugh, you're right.
Fixed.
| |
1578 } | 1546 } |
1579 } | 1547 } |
1580 #endif | 1548 #endif |
1581 | 1549 |
1582 if (!info.upload) | 1550 if (!info.upload) |
1583 return; | 1551 return; |
1584 | 1552 |
1585 const pid_t child = sys_fork(); | 1553 const pid_t child = sys_fork(); |
1586 if (!child) { | 1554 if (!child) { |
1587 // Spawned helper process. | 1555 // Spawned helper process. |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1739 } | 1707 } |
1740 } | 1708 } |
1741 } | 1709 } |
1742 #endif // OS_ANDROID | 1710 #endif // OS_ANDROID |
1743 | 1711 |
1744 bool IsCrashReporterEnabled() { | 1712 bool IsCrashReporterEnabled() { |
1745 return g_is_crash_reporter_enabled; | 1713 return g_is_crash_reporter_enabled; |
1746 } | 1714 } |
1747 | 1715 |
1748 } // namespace breakpad | 1716 } // namespace breakpad |
OLD | NEW |