Loading services/core/java/com/android/server/logcat/LogcatManagerService.java +18 −9 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.logcat; import static android.os.Process.getParentPid; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; Loading Loading @@ -45,6 +47,7 @@ import com.android.server.SystemService; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; Loading Loading @@ -340,13 +343,6 @@ public final class LogcatManagerService extends SystemService { * access */ private String getPackageName(LogAccessRequest request) { if (mActivityManagerInternal != null) { String packageName = mActivityManagerInternal.getPackageNameByPid(request.mPid); if (packageName != null) { return packageName; } } PackageManager pm = mContext.getPackageManager(); if (pm == null) { // Decline the logd access if PackageManager is null Loading @@ -355,15 +351,28 @@ public final class LogcatManagerService extends SystemService { } String[] packageNames = pm.getPackagesForUid(request.mUid); if (ArrayUtils.isEmpty(packageNames)) { // Decline the logd access if the app name is unknown Slog.e(TAG, "Unknown calling package name, declining the logd access"); return null; } String firstPackageName = packageNames[0]; if (mActivityManagerInternal != null) { int pid = request.mPid; String packageName = mActivityManagerInternal.getPackageNameByPid(pid); while ((packageName == null || !ArrayUtils.contains(packageNames, packageName)) && pid != -1) { pid = getParentPid(pid); packageName = mActivityManagerInternal.getPackageNameByPid(pid); } if (packageName != null && ArrayUtils.contains(packageNames, packageName)) { return packageName; } } Arrays.sort(packageNames); String firstPackageName = packageNames[0]; if (firstPackageName == null || firstPackageName.isEmpty()) { // Decline the logd access if the package name from uid is unknown Slog.e(TAG, "Unknown calling package name, declining the logd access"); Loading services/tests/servicestests/src/com/android/server/logcat/LogcatManagerServiceTest.java +27 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.logcat; import static android.os.Process.INVALID_UID; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; Loading @@ -28,6 +30,7 @@ import static org.mockito.Mockito.when; import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.content.ContextWrapper; import android.content.pm.PackageManager; import android.os.ILogd; import android.os.Looper; import android.os.UserHandle; Loading Loading @@ -69,6 +72,8 @@ public class LogcatManagerServiceTest { @Mock private ActivityManagerInternal mActivityManagerInternalMock; @Mock private PackageManager mPackageManagerMock; @Mock private ILogd mLogdMock; private LogcatManagerService mService; Loading @@ -81,10 +86,17 @@ public class LogcatManagerServiceTest { public void setUp() throws Exception { MockitoAnnotations.initMocks(this); addLocalServiceMock(ActivityManagerInternal.class, mActivityManagerInternalMock); when(mActivityManagerInternalMock.getInstrumentationSourceUid(anyInt())) .thenReturn(INVALID_UID); mContextSpy = spy(new ContextWrapper(ApplicationProvider.getApplicationContext())); mClock = new OffsettableClock.Stopped(); mTestLooper = new TestLooper(mClock::now); when(mContextSpy.getPackageManager()).thenReturn(mPackageManagerMock); when(mPackageManagerMock.getPackagesForUid(APP1_UID)).thenReturn( new String[]{APP1_PACKAGE_NAME}); when(mPackageManagerMock.getPackagesForUid(APP2_UID)).thenReturn( new String[]{APP2_PACKAGE_NAME}); when(mActivityManagerInternalMock.getPackageNameByPid(APP1_PID)).thenReturn( APP1_PACKAGE_NAME); when(mActivityManagerInternalMock.getPackageNameByPid(APP2_PID)).thenReturn( Loading Loading @@ -135,6 +147,20 @@ public class LogcatManagerServiceTest { verify(mContextSpy, never()).startActivityAsUser(any(), any()); } @Test public void test_RequestFromBackground_ApprovedIfInstrumented() throws Exception { when(mActivityManagerInternalMock.getInstrumentationSourceUid(APP1_UID)) .thenReturn(APP1_UID); when(mActivityManagerInternalMock.getUidProcessState(APP1_UID)).thenReturn( ActivityManager.PROCESS_STATE_RECEIVER); mService.getBinderService().startThread(APP1_UID, APP1_GID, APP1_PID, FD1); mTestLooper.dispatchAll(); verify(mLogdMock).approve(APP1_UID, APP1_GID, APP1_PID, FD1); verify(mLogdMock, never()).decline(APP1_UID, APP1_GID, APP1_PID, FD1); verify(mContextSpy, never()).startActivityAsUser(any(), any()); } @Test public void test_RequestFromForegroundService_DeclinedWithoutPrompt() throws Exception { when(mActivityManagerInternalMock.getUidProcessState(APP1_UID)).thenReturn( Loading Loading
services/core/java/com/android/server/logcat/LogcatManagerService.java +18 −9 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.logcat; import static android.os.Process.getParentPid; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; Loading Loading @@ -45,6 +47,7 @@ import com.android.server.SystemService; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; Loading Loading @@ -340,13 +343,6 @@ public final class LogcatManagerService extends SystemService { * access */ private String getPackageName(LogAccessRequest request) { if (mActivityManagerInternal != null) { String packageName = mActivityManagerInternal.getPackageNameByPid(request.mPid); if (packageName != null) { return packageName; } } PackageManager pm = mContext.getPackageManager(); if (pm == null) { // Decline the logd access if PackageManager is null Loading @@ -355,15 +351,28 @@ public final class LogcatManagerService extends SystemService { } String[] packageNames = pm.getPackagesForUid(request.mUid); if (ArrayUtils.isEmpty(packageNames)) { // Decline the logd access if the app name is unknown Slog.e(TAG, "Unknown calling package name, declining the logd access"); return null; } String firstPackageName = packageNames[0]; if (mActivityManagerInternal != null) { int pid = request.mPid; String packageName = mActivityManagerInternal.getPackageNameByPid(pid); while ((packageName == null || !ArrayUtils.contains(packageNames, packageName)) && pid != -1) { pid = getParentPid(pid); packageName = mActivityManagerInternal.getPackageNameByPid(pid); } if (packageName != null && ArrayUtils.contains(packageNames, packageName)) { return packageName; } } Arrays.sort(packageNames); String firstPackageName = packageNames[0]; if (firstPackageName == null || firstPackageName.isEmpty()) { // Decline the logd access if the package name from uid is unknown Slog.e(TAG, "Unknown calling package name, declining the logd access"); Loading
services/tests/servicestests/src/com/android/server/logcat/LogcatManagerServiceTest.java +27 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.logcat; import static android.os.Process.INVALID_UID; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; Loading @@ -28,6 +30,7 @@ import static org.mockito.Mockito.when; import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.content.ContextWrapper; import android.content.pm.PackageManager; import android.os.ILogd; import android.os.Looper; import android.os.UserHandle; Loading Loading @@ -69,6 +72,8 @@ public class LogcatManagerServiceTest { @Mock private ActivityManagerInternal mActivityManagerInternalMock; @Mock private PackageManager mPackageManagerMock; @Mock private ILogd mLogdMock; private LogcatManagerService mService; Loading @@ -81,10 +86,17 @@ public class LogcatManagerServiceTest { public void setUp() throws Exception { MockitoAnnotations.initMocks(this); addLocalServiceMock(ActivityManagerInternal.class, mActivityManagerInternalMock); when(mActivityManagerInternalMock.getInstrumentationSourceUid(anyInt())) .thenReturn(INVALID_UID); mContextSpy = spy(new ContextWrapper(ApplicationProvider.getApplicationContext())); mClock = new OffsettableClock.Stopped(); mTestLooper = new TestLooper(mClock::now); when(mContextSpy.getPackageManager()).thenReturn(mPackageManagerMock); when(mPackageManagerMock.getPackagesForUid(APP1_UID)).thenReturn( new String[]{APP1_PACKAGE_NAME}); when(mPackageManagerMock.getPackagesForUid(APP2_UID)).thenReturn( new String[]{APP2_PACKAGE_NAME}); when(mActivityManagerInternalMock.getPackageNameByPid(APP1_PID)).thenReturn( APP1_PACKAGE_NAME); when(mActivityManagerInternalMock.getPackageNameByPid(APP2_PID)).thenReturn( Loading Loading @@ -135,6 +147,20 @@ public class LogcatManagerServiceTest { verify(mContextSpy, never()).startActivityAsUser(any(), any()); } @Test public void test_RequestFromBackground_ApprovedIfInstrumented() throws Exception { when(mActivityManagerInternalMock.getInstrumentationSourceUid(APP1_UID)) .thenReturn(APP1_UID); when(mActivityManagerInternalMock.getUidProcessState(APP1_UID)).thenReturn( ActivityManager.PROCESS_STATE_RECEIVER); mService.getBinderService().startThread(APP1_UID, APP1_GID, APP1_PID, FD1); mTestLooper.dispatchAll(); verify(mLogdMock).approve(APP1_UID, APP1_GID, APP1_PID, FD1); verify(mLogdMock, never()).decline(APP1_UID, APP1_GID, APP1_PID, FD1); verify(mContextSpy, never()).startActivityAsUser(any(), any()); } @Test public void test_RequestFromForegroundService_DeclinedWithoutPrompt() throws Exception { when(mActivityManagerInternalMock.getUidProcessState(APP1_UID)).thenReturn( Loading