am 04eb368d: Merge "Prevent some alarm pathologies" into lmp-mr1-dev

* commit '04eb368d0381b0f94365b4e270afb610fe3564c2':
  Prevent some alarm pathologies
This commit is contained in:
Christopher Tate
2014-11-19 00:09:50 +00:00
committed by Android Git Automerger

View File

@@ -75,6 +75,12 @@ class AlarmManagerService extends SystemService {
// warning message. The time duration is in milliseconds. // warning message. The time duration is in milliseconds.
private static final long LATE_ALARM_THRESHOLD = 10 * 1000; private static final long LATE_ALARM_THRESHOLD = 10 * 1000;
// Minimum futurity of a new alarm
private static final long MIN_FUTURITY = 5 * 1000; // 5 seconds, in millis
// Minimum alarm recurrence interval
private static final long MIN_INTERVAL = 60 * 1000; // one minute, in millis
private static final int RTC_WAKEUP_MASK = 1 << RTC_WAKEUP; private static final int RTC_WAKEUP_MASK = 1 << RTC_WAKEUP;
private static final int RTC_MASK = 1 << RTC; private static final int RTC_MASK = 1 << RTC;
private static final int ELAPSED_REALTIME_WAKEUP_MASK = 1 << ELAPSED_REALTIME_WAKEUP; private static final int ELAPSED_REALTIME_WAKEUP_MASK = 1 << ELAPSED_REALTIME_WAKEUP;
@@ -696,6 +702,15 @@ class AlarmManagerService extends SystemService {
windowLength = AlarmManager.INTERVAL_HOUR; windowLength = AlarmManager.INTERVAL_HOUR;
} }
// Sanity check the recurrence interval. This will catch people who supply
// seconds when the API expects milliseconds.
if (interval > 0 && interval < MIN_INTERVAL) {
Slog.w(TAG, "Suspiciously short interval " + interval
+ " millis; expanding to " + (int)(MIN_INTERVAL/1000)
+ " seconds");
interval = MIN_INTERVAL;
}
if (type < RTC_WAKEUP || type > ELAPSED_REALTIME) { if (type < RTC_WAKEUP || type > ELAPSED_REALTIME) {
throw new IllegalArgumentException("Invalid alarm type " + type); throw new IllegalArgumentException("Invalid alarm type " + type);
} }
@@ -709,7 +724,11 @@ class AlarmManagerService extends SystemService {
} }
final long nowElapsed = SystemClock.elapsedRealtime(); final long nowElapsed = SystemClock.elapsedRealtime();
final long triggerElapsed = convertToElapsed(triggerAtTime, type); final long nominalTrigger = convertToElapsed(triggerAtTime, type);
// Try to prevent spamming by making sure we aren't firing alarms in the immediate future
final long minTrigger = nowElapsed + MIN_FUTURITY;
final long triggerElapsed = (nominalTrigger > minTrigger) ? nominalTrigger : minTrigger;
final long maxElapsed; final long maxElapsed;
if (windowLength == AlarmManager.WINDOW_EXACT) { if (windowLength == AlarmManager.WINDOW_EXACT) {
maxElapsed = triggerElapsed; maxElapsed = triggerElapsed;