diff options
author | Mike Lockwood <lockwood@android.com> | 2010-01-29 09:20:06 -0500 |
---|---|---|
committer | Mike Lockwood <lockwood@android.com> | 2010-01-29 09:20:06 -0500 |
commit | f1218be2d8f68f3f445f3bc90e0eca01946a0ddf (patch) | |
tree | c1da99490fa5d347bf6068173556bc4d78d1f533 /location/java | |
parent | 196ec566b39340942f146ce4a9af775f4c648d2d (diff) | |
download | frameworks_base-f1218be2d8f68f3f445f3bc90e0eca01946a0ddf.zip frameworks_base-f1218be2d8f68f3f445f3bc90e0eca01946a0ddf.tar.gz frameworks_base-f1218be2d8f68f3f445f3bc90e0eca01946a0ddf.tar.bz2 |
Ignore NTP time fixes that differ from system time by more than 5 minutes.
Change-Id: I603195f6925e25baccd18190016cf8611bb9dc1b
BUG: 2402380
Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'location/java')
-rwxr-xr-x | location/java/com/android/internal/location/GpsLocationProvider.java | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java index 134756e..add2404 100755 --- a/location/java/com/android/internal/location/GpsLocationProvider.java +++ b/location/java/com/android/internal/location/GpsLocationProvider.java @@ -57,6 +57,7 @@ import java.io.StringBufferInputStream; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Date; import java.util.Properties; import java.util.Map.Entry; @@ -240,10 +241,14 @@ public class GpsLocationProvider extends ILocationProvider.Stub { // how often to request NTP time, in milliseconds // current setting 4 hours - private static final long NTP_INTERVAL = 4*60*60*1000; + private static final long NTP_INTERVAL = 4*60*60*1000; // how long to wait if we have a network error in NTP or XTRA downloading // current setting - 5 minutes - private static final long RETRY_INTERVAL = 5*60*1000; + private static final long RETRY_INTERVAL = 5*60*1000; + + // to avoid injecting bad NTP time, we reject any time fixes that differ from system time + // by more than 5 minutes. + private static final long MAX_NTP_SYSTEM_TIME_OFFSET = 5*60*1000; private final IGpsStatusProvider mGpsStatusProvider = new IGpsStatusProvider.Stub() { public void addGpsStatusListener(IGpsStatusListener listener) throws RemoteException { @@ -1253,13 +1258,26 @@ public class GpsLocationProvider extends ILocationProvider.Stub { long time = client.getNtpTime(); long timeReference = client.getNtpTimeReference(); int certainty = (int)(client.getRoundTripTime()/2); + long now = System.currentTimeMillis(); + long systemTimeOffset = time - now; - if (Config.LOGD) Log.d(TAG, "calling native_inject_time: " + - time + " reference: " + timeReference - + " certainty: " + certainty); - - native_inject_time(time, timeReference, certainty); - mNextNtpTime = System.currentTimeMillis() + NTP_INTERVAL; + Log.d(TAG, "NTP server returned: " + + time + " (" + new Date(time) + + ") reference: " + timeReference + + " certainty: " + certainty + + " system time offset: " + systemTimeOffset); + + // sanity check NTP time and do not use if it is too far from system time + if (systemTimeOffset < 0) { + systemTimeOffset = -systemTimeOffset; + } + if (systemTimeOffset < MAX_NTP_SYSTEM_TIME_OFFSET) { + native_inject_time(time, timeReference, certainty); + } else { + Log.e(TAG, "NTP time differs from system time by " + systemTimeOffset + + "ms. Ignoring."); + } + mNextNtpTime = now + NTP_INTERVAL; } else { if (Config.LOGD) Log.d(TAG, "requestTime failed"); mNextNtpTime = System.currentTimeMillis() + RETRY_INTERVAL; |