summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsheu@chromium.org <sheu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-09 01:39:24 +0000
committersheu@chromium.org <sheu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-09 01:39:24 +0000
commita980847978de714a9da4510d6b1b90265c92b56d (patch)
tree6f95adfc19702d8eebde362a1b27077c6a6dc16b
parent435fdb33392ec94cb823275ccce4f1d509501aab (diff)
downloadchromium_src-a980847978de714a9da4510d6b1b90265c92b56d.zip
chromium_src-a980847978de714a9da4510d6b1b90265c92b56d.tar.gz
chromium_src-a980847978de714a9da4510d6b1b90265c92b56d.tar.bz2
Parse /proc/<pid>/stats fields as int64
Some entries are 64 bits wide, and will overflow on occasion. In particular, VM_STARTTIME will overflow a 32-bit int on long-running systems. BUG=332491 TEST=local build, run on desktop Linux Review URL: https://codereview.chromium.org/129353002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@243733 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--base/process/internal_linux.cc13
-rw-r--r--base/process/internal_linux.h15
-rw-r--r--base/process/process_handle_linux.cc2
-rw-r--r--base/process/process_info_linux.cc4
-rw-r--r--base/process/process_iterator_linux.cc4
-rw-r--r--base/process/process_metrics_linux.cc8
6 files changed, 22 insertions, 24 deletions
diff --git a/base/process/internal_linux.cc b/base/process/internal_linux.cc
index b1d1b6f..57a3ab4 100644
--- a/base/process/internal_linux.cc
+++ b/base/process/internal_linux.cc
@@ -115,13 +115,13 @@ void ParseProcStat(const std::string& contents, ProcStatMap* output) {
}
}
-int GetProcStatsFieldAsInt(const std::vector<std::string>& proc_stats,
- ProcStatsFields field_num) {
+int64 GetProcStatsFieldAsInt64(const std::vector<std::string>& proc_stats,
+ ProcStatsFields field_num) {
DCHECK_GE(field_num, VM_PPID);
CHECK_LT(static_cast<size_t>(field_num), proc_stats.size());
- int value;
- return StringToInt(proc_stats[field_num], &value) ? value : 0;
+ int64 value;
+ return StringToInt64(proc_stats[field_num], &value) ? value : 0;
}
size_t GetProcStatsFieldAsSizeT(const std::vector<std::string>& proc_stats,
@@ -133,15 +133,14 @@ size_t GetProcStatsFieldAsSizeT(const std::vector<std::string>& proc_stats,
return StringToSizeT(proc_stats[field_num], &value) ? value : 0;
}
-int ReadProcStatsAndGetFieldAsInt(pid_t pid,
- ProcStatsFields field_num) {
+int64 ReadProcStatsAndGetFieldAsInt64(pid_t pid, ProcStatsFields field_num) {
std::string stats_data;
if (!ReadProcStats(pid, &stats_data))
return 0;
std::vector<std::string> proc_stats;
if (!ParseProcStats(stats_data, &proc_stats))
return 0;
- return GetProcStatsFieldAsInt(proc_stats, field_num);
+ return GetProcStatsFieldAsInt64(proc_stats, field_num);
}
size_t ReadProcStatsAndGetFieldAsSizeT(pid_t pid,
diff --git a/base/process/internal_linux.h b/base/process/internal_linux.h
index 0cacd3f..5fc3356 100644
--- a/base/process/internal_linux.h
+++ b/base/process/internal_linux.h
@@ -63,19 +63,18 @@ enum ProcStatsFields {
// Reads the |field_num|th field from |proc_stats|. Returns 0 on failure.
// This version does not handle the first 3 values, since the first value is
// simply |pid|, and the next two values are strings.
-int GetProcStatsFieldAsInt(const std::vector<std::string>& proc_stats,
- ProcStatsFields field_num);
+int64 GetProcStatsFieldAsInt64(const std::vector<std::string>& proc_stats,
+ ProcStatsFields field_num);
-// Same as GetProcStatsFieldAsInt(), but for size_t values.
+// Same as GetProcStatsFieldAsInt64(), but for size_t values.
size_t GetProcStatsFieldAsSizeT(const std::vector<std::string>& proc_stats,
ProcStatsFields field_num);
-// Convenience wrapper around GetProcStatsFieldAsInt(), ParseProcStats() and
-// ReadProcStats(). See GetProcStatsFieldAsInt() for details.
-int ReadProcStatsAndGetFieldAsInt(pid_t pid,
- ProcStatsFields field_num);
+// Convenience wrapper around GetProcStatsFieldAsInt64(), ParseProcStats() and
+// ReadProcStats(). See GetProcStatsFieldAsInt64() for details.
+int64 ReadProcStatsAndGetFieldAsInt64(pid_t pid, ProcStatsFields field_num);
-// Same as ReadProcStatsAndGetFieldAsInt() but for size_t values.
+// Same as ReadProcStatsAndGetFieldAsInt64() but for size_t values.
size_t ReadProcStatsAndGetFieldAsSizeT(pid_t pid,
ProcStatsFields field_num);
diff --git a/base/process/process_handle_linux.cc b/base/process/process_handle_linux.cc
index 0f7ccd3..6c5cd2f 100644
--- a/base/process/process_handle_linux.cc
+++ b/base/process/process_handle_linux.cc
@@ -11,7 +11,7 @@ namespace base {
ProcessId GetParentProcessId(ProcessHandle process) {
ProcessId pid =
- internal::ReadProcStatsAndGetFieldAsInt(process, internal::VM_PPID);
+ internal::ReadProcStatsAndGetFieldAsInt64(process, internal::VM_PPID);
if (pid)
return pid;
return -1;
diff --git a/base/process/process_info_linux.cc b/base/process/process_info_linux.cc
index da34c18..9ec2313 100644
--- a/base/process/process_info_linux.cc
+++ b/base/process/process_info_linux.cc
@@ -15,8 +15,8 @@ namespace base {
//static
const Time CurrentProcessInfo::CreationTime() {
ProcessHandle pid = GetCurrentProcessHandle();
- int start_ticks = internal::ReadProcStatsAndGetFieldAsInt(
- pid, internal::VM_STARTTIME);
+ int64 start_ticks =
+ internal::ReadProcStatsAndGetFieldAsInt64(pid, internal::VM_STARTTIME);
DCHECK(start_ticks);
TimeDelta start_offset = internal::ClockTicksToTimeDelta(start_ticks);
Time boot_time = internal::GetBootTime();
diff --git a/base/process/process_iterator_linux.cc b/base/process/process_iterator_linux.cc
index 0587d7b..8f746aa 100644
--- a/base/process/process_iterator_linux.cc
+++ b/base/process/process_iterator_linux.cc
@@ -121,8 +121,8 @@ bool ProcessIterator::CheckForNextProcess() {
}
entry_.pid_ = pid;
- entry_.ppid_ = GetProcStatsFieldAsInt(proc_stats, internal::VM_PPID);
- entry_.gid_ = GetProcStatsFieldAsInt(proc_stats, internal::VM_PGRP);
+ entry_.ppid_ = GetProcStatsFieldAsInt64(proc_stats, internal::VM_PPID);
+ entry_.gid_ = GetProcStatsFieldAsInt64(proc_stats, internal::VM_PGRP);
entry_.cmd_line_args_.assign(cmd_line_args.begin(), cmd_line_args.end());
entry_.exe_file_ = GetProcessExecutablePath(pid).BaseName().value();
return true;
diff --git a/base/process/process_metrics_linux.cc b/base/process/process_metrics_linux.cc
index afa8848..6474990 100644
--- a/base/process/process_metrics_linux.cc
+++ b/base/process/process_metrics_linux.cc
@@ -391,16 +391,16 @@ int ParseProcStatCPU(const std::string& input) {
if (proc_stats.size() <= internal::VM_STIME)
return -1;
- int utime = GetProcStatsFieldAsInt(proc_stats, internal::VM_UTIME);
- int stime = GetProcStatsFieldAsInt(proc_stats, internal::VM_STIME);
+ int utime = GetProcStatsFieldAsInt64(proc_stats, internal::VM_UTIME);
+ int stime = GetProcStatsFieldAsInt64(proc_stats, internal::VM_STIME);
return utime + stime;
}
const char kProcSelfExe[] = "/proc/self/exe";
int GetNumberOfThreads(ProcessHandle process) {
- return internal::ReadProcStatsAndGetFieldAsInt(process,
- internal::VM_NUMTHREADS);
+ return internal::ReadProcStatsAndGetFieldAsInt64(process,
+ internal::VM_NUMTHREADS);
}
namespace {