crash-reporter: Replace scoped_ptr<char[]> with vector<char>.
BUG=None
TEST=`FEATURES=test emerge-$BOARD platform2`
Change-Id: I78d7766b49151f40f42ef00b8204fd2569b45991
Reviewed-on: https://chromium-review.googlesource.com/214780
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Tested-by: Ben Chan <benchan@chromium.org>
Commit-Queue: Ben Chan <benchan@chromium.org>
diff --git a/crash_reporter/crash_collector.cc b/crash_reporter/crash_collector.cc
index 966970b..b5a7072 100644
--- a/crash_reporter/crash_collector.cc
+++ b/crash_reporter/crash_collector.cc
@@ -8,6 +8,7 @@
#include <fcntl.h> // For file creation modes.
#define __STDC_FORMAT_MACROS // PRId64
#include <inttypes.h>
+#include <linux/limits.h> // PATH_MAX
#include <pwd.h> // For struct passwd.
#include <sys/types.h> // for mode_t.
#include <sys/wait.h> // For waitpid.
@@ -320,31 +321,31 @@
bool CrashCollector::GetSymlinkTarget(const FilePath &symlink,
FilePath *target) {
- int max_size = 32;
- scoped_ptr<char[]> buffer;
+ ssize_t max_size = 64;
+ std::vector<char> buffer;
+
while (true) {
- buffer.reset(new char[max_size + 1]);
- ssize_t size = readlink(symlink.value().c_str(), buffer.get(), max_size);
+ buffer.resize(max_size + 1);
+ ssize_t size = readlink(symlink.value().c_str(), buffer.data(), max_size);
if (size < 0) {
int saved_errno = errno;
LOG(ERROR) << "Readlink failed on " << symlink.value() << " with "
<< saved_errno;
return false;
}
+
buffer[size] = 0;
if (size == max_size) {
- // Avoid overflow when doubling.
- if (max_size * 2 > max_size) {
- max_size *= 2;
- continue;
- } else {
+ max_size *= 2;
+ if (max_size > PATH_MAX) {
return false;
}
+ continue;
}
break;
}
- *target = FilePath(buffer.get());
+ *target = FilePath(buffer.data());
return true;
}