Merge "Don't crash system_server due to bad event time stamps." into udc-dev

This commit is contained in:
Michael Wright
2023-05-02 18:37:39 +00:00
committed by Android (Google) Code Review
2 changed files with 25 additions and 2 deletions

View File

@@ -5690,8 +5690,14 @@ public final class PowerManagerService extends SystemService
}
if (eventTime > now) {
Slog.e(TAG, "Event time " + eventTime + " cannot be newer than " + now);
throw new IllegalArgumentException("event time must not be in the future");
Slog.wtf(TAG, "Event cannot be newer than the current time ("
+ "now=" + now
+ ", eventTime=" + eventTime
+ ", displayId=" + displayId
+ ", event=" + PowerManager.userActivityEventToString(event)
+ ", flags=" + flags
+ ")");
return;
}
final int uid = Binder.getCallingUid();

View File

@@ -20,6 +20,7 @@ import static android.app.ActivityManager.PROCESS_STATE_BOUND_TOP;
import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.MODE_ERRORED;
import static android.os.PowerManager.USER_ACTIVITY_EVENT_BUTTON;
import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP;
import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE;
import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING;
@@ -41,6 +42,7 @@ import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -112,6 +114,7 @@ import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.stubbing.Answer;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executor;
@@ -2468,4 +2471,18 @@ public class PowerManagerServiceTest {
verify(mNotifierMock).onWakeLockReleased(anyInt(), eq(tag), eq(packageName), anyInt(),
anyInt(), any(), any(), same(callback2));
}
@Test
public void testUserActivity_futureEventsAreIgnored() {
createService();
startSystem();
// Starting the system triggers a user activity event, so clear that before calling
// userActivity() directly.
clearInvocations(mNotifierMock);
final long eventTime = mClock.now() + Duration.ofHours(10).toMillis();
mService.getBinderServiceInstance().userActivity(Display.DEFAULT_DISPLAY, eventTime,
USER_ACTIVITY_EVENT_BUTTON, /* flags= */ 0);
verify(mNotifierMock, never()).onUserActivity(anyInt(), anyInt(), anyInt());
}
}