diff options
-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 c8809a2..2b4dab9 100755 --- a/location/java/com/android/internal/location/GpsLocationProvider.java +++ b/location/java/com/android/internal/location/GpsLocationProvider.java @@ -56,6 +56,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; @@ -239,10 +240,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 { @@ -1246,13 +1251,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 (DEBUG) 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 (DEBUG) Log.d(TAG, "requestTime failed"); mNextNtpTime = System.currentTimeMillis() + RETRY_INTERVAL; |