diff options
| -rw-r--r-- | core/jni/android_util_Process.cpp | 16 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/os/ProcessTest.java | 31 |
2 files changed, 38 insertions, 9 deletions
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index 2d7069c50255..f929dde4dcd1 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -644,6 +644,12 @@ static jlong android_os_Process_getTotalMemory(JNIEnv* env, jobject clazz) return si.totalram; } +/* + * The outFields array is initialized to -1 to allow the caller to identify + * when the status file (and therefore the process) they specified is invalid. + * This array should not be overwritten or cleared before we know that the + * status file can be read. + */ void android_os_Process_readProcLines(JNIEnv* env, jobject clazz, jstring fileStr, jobjectArray reqFields, jlongArray outFields) { @@ -692,14 +698,14 @@ void android_os_Process_readProcLines(JNIEnv* env, jobject clazz, jstring fileSt return; } - //ALOGI("Clearing %" PRId32 " sizes", count); - for (i=0; i<count; i++) { - sizesArray[i] = 0; - } - int fd = open(file.string(), O_RDONLY | O_CLOEXEC); if (fd >= 0) { + //ALOGI("Clearing %" PRId32 " sizes", count); + for (i=0; i<count; i++) { + sizesArray[i] = 0; + } + const size_t BUFFER_SIZE = 4096; char* buffer = (char*)malloc(BUFFER_SIZE); int len = read(fd, buffer, BUFFER_SIZE-1); diff --git a/core/tests/coretests/src/android/os/ProcessTest.java b/core/tests/coretests/src/android/os/ProcessTest.java index b749e715316a..6b02764b7f28 100644 --- a/core/tests/coretests/src/android/os/ProcessTest.java +++ b/core/tests/coretests/src/android/os/ProcessTest.java @@ -17,13 +17,12 @@ package android.os; -import androidx.test.filters.MediumTest; - import junit.framework.TestCase; public class ProcessTest extends TestCase { - @MediumTest + private static final int BAD_PID = 0; + public void testProcessGetUidFromName() throws Exception { assertEquals(android.os.Process.SYSTEM_UID, Process.getUidForName("system")); assertEquals(Process.BLUETOOTH_UID, Process.getUidForName("bluetooth")); @@ -35,7 +34,6 @@ public class ProcessTest extends TestCase { Process.getUidForName("u3_a100")); } - @MediumTest public void testProcessGetUidFromNameFailure() throws Exception { // Failure cases assertEquals(-1, Process.getUidForName("u2a_foo")); @@ -47,4 +45,29 @@ public class ProcessTest extends TestCase { assertEquals(-1, Process.getUidForName("u2jhsajhfkjhsafkhskafhkashfkjashfkjhaskjfdhakj3")); } + /** + * Tests getUidForPid() by ensuring that it returns the correct value when the process queried + * doesn't exist. + */ + public void testGetUidForPidInvalidPid() { + assertEquals(-1, Process.getUidForPid(BAD_PID)); + } + + /** + * Tests getParentPid() by ensuring that it returns the correct value when the process queried + * doesn't exist. + */ + public void testGetParentPidInvalidPid() { + assertEquals(-1, Process.getParentPid(BAD_PID)); + } + + /** + * Tests getThreadGroupLeader() by ensuring that it returns the correct value when the + * thread queried doesn't exist. + */ + public void testGetThreadGroupLeaderInvalidTid() { + // This function takes a TID instead of a PID but BAD_PID should also be a bad TID. + assertEquals(-1, Process.getThreadGroupLeader(BAD_PID)); + } + } |