getProcessAgeMs: better error messages am: d9ebe7cef5

Original change: https://android-review.googlesource.com/c/platform/system/libhidl/+/1459346

Change-Id: I92b3b7d9b735a68d71095aa81d8de7dc0898fee2
diff --git a/transport/ServiceManagement.cpp b/transport/ServiceManagement.cpp
index cbe7ac6..8122324 100644
--- a/transport/ServiceManagement.cpp
+++ b/transport/ServiceManagement.cpp
@@ -190,22 +190,50 @@
 __attribute__((noinline)) static long getProcessAgeMs() {
     constexpr const int PROCFS_STAT_STARTTIME_INDEX = 21;
     std::string content;
-    android::base::ReadFileToString("/proc/self/stat", &content, false);
-    auto stats = android::base::Split(content, " ");
-    if (stats.size() <= PROCFS_STAT_STARTTIME_INDEX) {
-        LOG(INFO) << "Could not read starttime from /proc/self/stat";
+    if (!android::base::ReadFileToString("/proc/self/stat", &content, false)) {
+        LOG(ERROR) << "Process age: Could not read /proc/self/stat";
         return -1;
     }
-    const std::string& startTimeString = stats[PROCFS_STAT_STARTTIME_INDEX];
-    static const int64_t ticksPerSecond = sysconf(_SC_CLK_TCK);
-    const int64_t uptime = android::uptimeMillis();
 
-    unsigned long long startTimeInClockTicks = 0;
-    if (android::base::ParseUint(startTimeString, &startTimeInClockTicks)) {
-        long startTimeMs = 1000ULL * startTimeInClockTicks / ticksPerSecond;
-        return uptime - startTimeMs;
+    std::vector<std::string> stats = android::base::Split(content, " ");
+    if (PROCFS_STAT_STARTTIME_INDEX >= stats.size()) {
+        LOG(ERROR) << "Process age: Could not read starttime from /proc/self/stat";
+        return -1;
     }
-    return -1;
+
+    const std::string& startTimeString = stats.at(PROCFS_STAT_STARTTIME_INDEX);
+    unsigned long long startTimeInClockTicks = 0;
+    if (!android::base::ParseUint(startTimeString, &startTimeInClockTicks)) {
+        LOG(ERROR) << "Process age: Could not parse start time: " << startTimeString;
+        return -1;
+    }
+
+    const int64_t ticksPerSecond = sysconf(_SC_CLK_TCK);
+    if (ticksPerSecond <= 0) {
+        LOG(ERROR) << "Process age: Invalid _SC_CLK_TCK: " << ticksPerSecond;
+        return -1;
+    }
+
+    const int64_t uptime = android::uptimeMillis();
+    if (uptime < 0) {
+        LOG(ERROR) << "Process age: Invalid uptime: " << uptime;
+        return -1;
+    }
+
+    unsigned long long startTimeTicks;
+    if (__builtin_umulll_overflow(1000ULL, startTimeInClockTicks, &startTimeTicks)) {
+        LOG(ERROR) << "Process age: Too many ticks, overflow: " << startTimeInClockTicks;
+        return -1;
+    }
+
+    long startTimeMs = startTimeTicks / ticksPerSecond;
+    if (startTimeMs >= uptime) {
+        LOG(ERROR) << "Process age: process started in future: " << startTimeMs << " after "
+                   << uptime;
+        return -1;
+    }
+
+    return uptime - startTimeMs;
 }
 
 static void onRegistrationImpl(const std::string& descriptor, const std::string& instanceName) {