procinfo: do null check before setting error string.
Bug: 188573814
Test: run libprocinfo_test.
Change-Id: Iac98eba492410ea636e2167e888ceda32094fc51
diff --git a/process_test.cpp b/process_test.cpp
index be00a17..58a1546 100644
--- a/process_test.cpp
+++ b/process_test.cpp
@@ -28,8 +28,10 @@
#include <gtest/gtest.h>
+#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/stringprintf.h>
+#include <android-base/unique_fd.h>
using namespace std::chrono_literals;
@@ -158,3 +160,39 @@
ASSERT_EQ(0, kill(forkpid, SIGKILL));
ASSERT_EQ(forkpid, waitpid(forkpid, nullptr, 0));
}
+
+TEST(process_info, GetProcessInfoFromProcPidFd_set_error) {
+ TemporaryDir tmp_dir;
+
+ android::base::unique_fd dirfd(open(tmp_dir.path, O_DIRECTORY | O_RDONLY));
+ android::procinfo::ProcessInfo procinfo;
+ std::string error;
+
+ // failed to open status file error
+ // No segfault if not given error string.
+ ASSERT_FALSE(android::procinfo::GetProcessInfoFromProcPidFd(dirfd.get(), &procinfo));
+ // Set error when given error string.
+ ASSERT_FALSE(android::procinfo::GetProcessInfoFromProcPidFd(dirfd.get(), &procinfo, &error));
+ ASSERT_EQ(error, "failed to open status fd in GetProcessInfoFromProcPidFd");
+
+ // failed to parse status file error
+ std::string status_file = std::string(tmp_dir.path) + "/status";
+ ASSERT_TRUE(android::base::WriteStringToFile("invalid data", status_file));
+ ASSERT_FALSE(android::procinfo::GetProcessInfoFromProcPidFd(dirfd.get(), &procinfo));
+ ASSERT_FALSE(android::procinfo::GetProcessInfoFromProcPidFd(dirfd.get(), &procinfo, &error));
+ ASSERT_EQ(error, "failed to parse /proc/<pid>/status");
+
+ // failed to read stat file error
+ ASSERT_TRUE(android::base::WriteStringToFile(
+ "Name:\tsh\nTgid:\t0\nPid:\t0\nTracerPid:\t0\nUid:\t0\nGid:\t0\n", status_file));
+ ASSERT_FALSE(android::procinfo::GetProcessInfoFromProcPidFd(dirfd.get(), &procinfo));
+ ASSERT_FALSE(android::procinfo::GetProcessInfoFromProcPidFd(dirfd.get(), &procinfo, &error));
+ ASSERT_EQ(error, "failed to read /proc/<pid>/stat");
+
+ // failed to parse stat file error
+ std::string stat_file = std::string(tmp_dir.path) + "/stat";
+ ASSERT_TRUE(android::base::WriteStringToFile("2027 (sh) invalid data", stat_file));
+ ASSERT_FALSE(android::procinfo::GetProcessInfoFromProcPidFd(dirfd.get(), &procinfo));
+ ASSERT_FALSE(android::procinfo::GetProcessInfoFromProcPidFd(dirfd.get(), &procinfo, &error));
+ ASSERT_EQ(error, "failed to parse /proc/<pid>/stat");
+}