Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 43887910 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Ignore invalid time stamp in SMS PDUs" am: a19cd20f

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1354342

Change-Id: Ib4debefeae8f672e451aef562251dab32af851a9
parents e12727ce a19cd20f
Loading
Loading
Loading
Loading
+19 −13
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.internal.telephony.uicc.IccUtils;


import java.lang.annotation.Retention;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.RetentionPolicy;
import java.time.DateTimeException;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.ZoneOffset;
import java.util.Arrays;
import java.util.Arrays;
@@ -173,7 +174,7 @@ public final class SmsCbEtwsInfo implements Parcelable {
    /**
    /**
     * Returns the Warning-Security-Information timestamp (GSM primary notifications only).
     * 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.
     * 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() {
    public long getPrimaryNotificationTimestamp() {
        if (mWarningSecurityInformation == null || mWarningSecurityInformation.length < 7) {
        if (mWarningSecurityInformation == null || mWarningSecurityInformation.length < 7) {
@@ -201,6 +202,7 @@ public final class SmsCbEtwsInfo implements Parcelable {
        // timezoneOffset is in quarter hours.
        // timezoneOffset is in quarter hours.
        int timeZoneOffsetSeconds = timezoneOffset * 15 * 60;
        int timeZoneOffsetSeconds = timezoneOffset * 15 * 60;


        try {
            LocalDateTime localDateTime = LocalDateTime.of(
            LocalDateTime localDateTime = LocalDateTime.of(
                    // We only need to support years above 2000.
                    // We only need to support years above 2000.
                    year + 2000,
                    year + 2000,
@@ -213,6 +215,10 @@ public final class SmsCbEtwsInfo implements Parcelable {
            long epochSeconds = localDateTime.toEpochSecond(ZoneOffset.UTC) - timeZoneOffsetSeconds;
            long epochSeconds = localDateTime.toEpochSecond(ZoneOffset.UTC) - timeZoneOffsetSeconds;
            // Convert to milliseconds, ignore overflow.
            // Convert to milliseconds, ignore overflow.
            return epochSeconds * 1000;
            return epochSeconds * 1000;
        } catch (DateTimeException ex) {
            // No-op
        }
        return 0;
    }
    }


    /**
    /**
+11 −4
Original line number Original line Diff line number Diff line
@@ -35,6 +35,7 @@ import com.android.internal.util.BitwiseOutputStream;
import com.android.telephony.Rlog;
import com.android.telephony.Rlog;


import java.io.ByteArrayOutputStream;
import java.io.ByteArrayOutputStream;
import java.time.DateTimeException;
import java.time.Instant;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneId;
@@ -315,10 +316,16 @@ public final class BearerData {
        }
        }


        public long toMillis() {
        public long toMillis() {
            try {
                LocalDateTime localDateTime =
                LocalDateTime localDateTime =
                        LocalDateTime.of(year, monthOrdinal, monthDay, hour, minute, second);
                        LocalDateTime.of(year, monthOrdinal, monthDay, hour, minute, second);
            Instant instant = localDateTime.toInstant(mZoneId.getRules().getOffset(localDateTime));
                Instant instant =
                        localDateTime.toInstant(mZoneId.getRules().getOffset(localDateTime));
                return instant.toEpochMilli();
                return instant.toEpochMilli();
            } catch (DateTimeException ex) {
                Rlog.e(LOG_TAG, "Invalid timestamp", ex);
            }
            return 0;
        }
        }




+21 −13
Original line number Original line Diff line number Diff line
@@ -43,6 +43,7 @@ import com.android.telephony.Rlog;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.ParseException;
import java.time.DateTimeException;
import java.time.Instant;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneId;
@@ -856,10 +857,9 @@ public class SmsMessage extends SmsMessageBase {
        }
        }


        /**
        /**
         * Parses an SC timestamp and returns a currentTimeMillis()-style
         * Parses an SC timestamp and returns a currentTimeMillis()-style timestamp, or 0 if
         * timestamp
         * invalid.
         */
         */

        long getSCTimestampMillis() {
        long getSCTimestampMillis() {
            // TP-Service-Centre-Time-Stamp
            // TP-Service-Centre-Time-Stamp
            int year = IccUtils.gsmBcdByteToInt(mPdu[mCur++]);
            int year = IccUtils.gsmBcdByteToInt(mPdu[mCur++]);
@@ -885,6 +885,7 @@ public class SmsMessage extends SmsMessageBase {


            // It's 2006.  Should I really support years < 2000?
            // It's 2006.  Should I really support years < 2000?
            int fullYear = year >= 90 ? year + 1900 : year + 2000;
            int fullYear = year >= 90 ? year + 1900 : year + 2000;
            try {
                LocalDateTime localDateTime = LocalDateTime.of(
                LocalDateTime localDateTime = LocalDateTime.of(
                        fullYear,
                        fullYear,
                        month /* 1-12 */,
                        month /* 1-12 */,
@@ -892,9 +893,14 @@ public class SmsMessage extends SmsMessageBase {
                        hour,
                        hour,
                        minute,
                        minute,
                        second);
                        second);
            long epochSeconds = localDateTime.toEpochSecond(ZoneOffset.UTC) - timeZoneOffsetSeconds;
                long epochSeconds =
                        localDateTime.toEpochSecond(ZoneOffset.UTC) - timeZoneOffsetSeconds;
                // Convert to milliseconds.
                // Convert to milliseconds.
                return epochSeconds * 1000;
                return epochSeconds * 1000;
            } catch (DateTimeException ex) {
                Rlog.e(LOG_TAG, "Invalid timestamp", ex);
            }
            return 0;
        }
        }


        /**
        /**
@@ -1245,6 +1251,7 @@ public class SmsMessage extends SmsMessageBase {
        mRecipientAddress = p.getAddress();
        mRecipientAddress = p.getAddress();
        // TP-Service-Centre-Time-Stamp
        // TP-Service-Centre-Time-Stamp
        mScTimeMillis = p.getSCTimestampMillis();
        mScTimeMillis = p.getSCTimestampMillis();
        // TP-Discharge-Time
        p.getSCTimestampMillis();
        p.getSCTimestampMillis();
        // TP-Status
        // TP-Status
        mStatus = p.getByte();
        mStatus = p.getByte();
@@ -1303,6 +1310,7 @@ public class SmsMessage extends SmsMessageBase {
                    + " data coding scheme: " + mDataCodingScheme);
                    + " data coding scheme: " + mDataCodingScheme);
        }
        }


        // TP-Service-Centre-Time-Stamp
        mScTimeMillis = p.getSCTimestampMillis();
        mScTimeMillis = p.getSCTimestampMillis();


        if (VDBG) Rlog.d(LOG_TAG, "SMS SC timestamp: " + mScTimeMillis);
        if (VDBG) Rlog.d(LOG_TAG, "SMS SC timestamp: " + mScTimeMillis);