Merge "Ignore invalid time stamp in SMS PDUs" am: a19cd20f01 am: 43887910a2 am: 2d017866f1
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1354342 Change-Id: I46aedac870daecb3c7dedb1bf8eaa1ae051cb84b
This commit is contained in:
@@ -27,6 +27,7 @@ import com.android.internal.telephony.uicc.IccUtils;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.time.DateTimeException;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneOffset;
|
||||
import java.util.Arrays;
|
||||
@@ -173,7 +174,7 @@ public final class SmsCbEtwsInfo implements Parcelable {
|
||||
/**
|
||||
* Returns the Warning-Security-Information timestamp (GSM primary notifications only).
|
||||
* As of Release 10, 3GPP TS 23.041 states that the UE shall ignore this value if received.
|
||||
* @return a UTC timestamp in System.currentTimeMillis() format, or 0 if not present
|
||||
* @return a UTC timestamp in System.currentTimeMillis() format, or 0 if not present or invalid.
|
||||
*/
|
||||
public long getPrimaryNotificationTimestamp() {
|
||||
if (mWarningSecurityInformation == null || mWarningSecurityInformation.length < 7) {
|
||||
@@ -201,18 +202,23 @@ public final class SmsCbEtwsInfo implements Parcelable {
|
||||
// timezoneOffset is in quarter hours.
|
||||
int timeZoneOffsetSeconds = timezoneOffset * 15 * 60;
|
||||
|
||||
LocalDateTime localDateTime = LocalDateTime.of(
|
||||
// We only need to support years above 2000.
|
||||
year + 2000,
|
||||
month /* 1-12 */,
|
||||
day,
|
||||
hour,
|
||||
minute,
|
||||
second);
|
||||
try {
|
||||
LocalDateTime localDateTime = LocalDateTime.of(
|
||||
// We only need to support years above 2000.
|
||||
year + 2000,
|
||||
month /* 1-12 */,
|
||||
day,
|
||||
hour,
|
||||
minute,
|
||||
second);
|
||||
|
||||
long epochSeconds = localDateTime.toEpochSecond(ZoneOffset.UTC) - timeZoneOffsetSeconds;
|
||||
// Convert to milliseconds, ignore overflow.
|
||||
return epochSeconds * 1000;
|
||||
long epochSeconds = localDateTime.toEpochSecond(ZoneOffset.UTC) - timeZoneOffsetSeconds;
|
||||
// Convert to milliseconds, ignore overflow.
|
||||
return epochSeconds * 1000;
|
||||
} catch (DateTimeException ex) {
|
||||
// No-op
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -35,6 +35,7 @@ import com.android.internal.util.BitwiseOutputStream;
|
||||
import com.android.telephony.Rlog;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.time.DateTimeException;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
@@ -315,10 +316,16 @@ public final class BearerData {
|
||||
}
|
||||
|
||||
public long toMillis() {
|
||||
LocalDateTime localDateTime =
|
||||
LocalDateTime.of(year, monthOrdinal, monthDay, hour, minute, second);
|
||||
Instant instant = localDateTime.toInstant(mZoneId.getRules().getOffset(localDateTime));
|
||||
return instant.toEpochMilli();
|
||||
try {
|
||||
LocalDateTime localDateTime =
|
||||
LocalDateTime.of(year, monthOrdinal, monthDay, hour, minute, second);
|
||||
Instant instant =
|
||||
localDateTime.toInstant(mZoneId.getRules().getOffset(localDateTime));
|
||||
return instant.toEpochMilli();
|
||||
} catch (DateTimeException ex) {
|
||||
Rlog.e(LOG_TAG, "Invalid timestamp", ex);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@ import com.android.telephony.Rlog;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.text.ParseException;
|
||||
import java.time.DateTimeException;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
@@ -855,10 +856,9 @@ public class SmsMessage extends SmsMessageBase {
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses an SC timestamp and returns a currentTimeMillis()-style
|
||||
* timestamp
|
||||
* Parses an SC timestamp and returns a currentTimeMillis()-style timestamp, or 0 if
|
||||
* invalid.
|
||||
*/
|
||||
|
||||
long getSCTimestampMillis() {
|
||||
// TP-Service-Centre-Time-Stamp
|
||||
int year = IccUtils.gsmBcdByteToInt(mPdu[mCur++]);
|
||||
@@ -884,16 +884,22 @@ public class SmsMessage extends SmsMessageBase {
|
||||
|
||||
// It's 2006. Should I really support years < 2000?
|
||||
int fullYear = year >= 90 ? year + 1900 : year + 2000;
|
||||
LocalDateTime localDateTime = LocalDateTime.of(
|
||||
fullYear,
|
||||
month /* 1-12 */,
|
||||
day,
|
||||
hour,
|
||||
minute,
|
||||
second);
|
||||
long epochSeconds = localDateTime.toEpochSecond(ZoneOffset.UTC) - timeZoneOffsetSeconds;
|
||||
// Convert to milliseconds.
|
||||
return epochSeconds * 1000;
|
||||
try {
|
||||
LocalDateTime localDateTime = LocalDateTime.of(
|
||||
fullYear,
|
||||
month /* 1-12 */,
|
||||
day,
|
||||
hour,
|
||||
minute,
|
||||
second);
|
||||
long epochSeconds =
|
||||
localDateTime.toEpochSecond(ZoneOffset.UTC) - timeZoneOffsetSeconds;
|
||||
// Convert to milliseconds.
|
||||
return epochSeconds * 1000;
|
||||
} catch (DateTimeException ex) {
|
||||
Rlog.e(LOG_TAG, "Invalid timestamp", ex);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1244,6 +1250,7 @@ public class SmsMessage extends SmsMessageBase {
|
||||
mRecipientAddress = p.getAddress();
|
||||
// TP-Service-Centre-Time-Stamp
|
||||
mScTimeMillis = p.getSCTimestampMillis();
|
||||
// TP-Discharge-Time
|
||||
p.getSCTimestampMillis();
|
||||
// TP-Status
|
||||
mStatus = p.getByte();
|
||||
@@ -1302,6 +1309,7 @@ public class SmsMessage extends SmsMessageBase {
|
||||
+ " data coding scheme: " + mDataCodingScheme);
|
||||
}
|
||||
|
||||
// TP-Service-Centre-Time-Stamp
|
||||
mScTimeMillis = p.getSCTimestampMillis();
|
||||
|
||||
if (VDBG) Rlog.d(LOG_TAG, "SMS SC timestamp: " + mScTimeMillis);
|
||||
|
||||
Reference in New Issue
Block a user