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

Commit d6a3556d authored by Amit Mahajan's avatar Amit Mahajan Committed by android-build-merger
Browse files

Merge "Fix wrong userData length and excessive userData issues" am: 13d5d5a1

am: 487b123d

Change-Id: Iff63e14e601d32e6991ad651b4dc0917be6c11e7
parents 8c6a0682 487b123d
Loading
Loading
Loading
Loading
+15 −0
Original line number Original line Diff line number Diff line
@@ -22,6 +22,12 @@ import android.annotation.UnsupportedAppUsage;
 * {@hide}
 * {@hide}
 */
 */
public class EncodeException extends Exception {
public class EncodeException extends Exception {

    private int mError = ERROR_UNENCODABLE;

    public static final int ERROR_UNENCODABLE = 0;
    public static final int ERROR_EXCEED_SIZE = 1;

    public EncodeException() {
    public EncodeException() {
        super();
        super();
    }
    }
@@ -31,9 +37,18 @@ public class EncodeException extends Exception {
        super(s);
        super(s);
    }
    }


    public EncodeException(String s, int error) {
        super(s);
        mError = error;
    }

    @UnsupportedAppUsage
    @UnsupportedAppUsage
    public EncodeException(char c) {
    public EncodeException(char c) {
        super("Unencodable char: '" + c + "'");
        super("Unencodable char: '" + c + "'");
    }
    }

    public int getError() {
        return mError;
    }
}
}
+3 −2
Original line number Original line Diff line number Diff line
@@ -388,7 +388,7 @@ public class GsmAlphabet {
     *     GSM extension table
     *     GSM extension table
     * @return the encoded message
     * @return the encoded message
     *
     *
     * @throws EncodeException if String is too large to encode
     * @throws EncodeException if String is too large to encode or any characters are unencodable
     */
     */
    @UnsupportedAppUsage
    @UnsupportedAppUsage
    public static byte[] stringToGsm7BitPacked(String data, int startingSeptetOffset,
    public static byte[] stringToGsm7BitPacked(String data, int startingSeptetOffset,
@@ -402,7 +402,8 @@ public class GsmAlphabet {
        }
        }
        septetCount += startingSeptetOffset;
        septetCount += startingSeptetOffset;
        if (septetCount > 255) {
        if (septetCount > 255) {
            throw new EncodeException("Payload cannot exceed 255 septets");
            throw new EncodeException(
                    "Payload cannot exceed 255 septets", EncodeException.ERROR_EXCEED_SIZE);
        }
        }
        int byteCount = ((septetCount * 7) + 7) / 8;
        int byteCount = ((septetCount * 7) + 7) / 8;
        byte[] ret = new byte[byteCount + 1];  // Include space for one byte length prefix.
        byte[] ret = new byte[byteCount + 1];  // Include space for one byte length prefix.
+21 −10
Original line number Original line Diff line number Diff line
@@ -384,18 +384,24 @@ public class SmsMessage extends SmsMessageBase {
                }
                }
            }
            }
        } catch (EncodeException ex) {
        } catch (EncodeException ex) {
            if (ex.getError() == EncodeException.ERROR_EXCEED_SIZE) {
                Rlog.e(LOG_TAG, "Exceed size limitation EncodeException", ex);
                return null;
            } else {
                // Encoding to the 7-bit alphabet failed. Let's see if we can
                // Encoding to the 7-bit alphabet failed. Let's see if we can
                // send it as a UCS-2 encoded message
                // send it as a UCS-2 encoded message
                try {
                try {
                    userData = encodeUCS2(message, header);
                    userData = encodeUCS2(message, header);
                    encoding = ENCODING_16BIT;
                    encoding = ENCODING_16BIT;
                } catch (EncodeException ex1) {
                    Rlog.e(LOG_TAG, "Exceed size limitation EncodeException", ex1);
                    return null;
                } catch (UnsupportedEncodingException uex) {
                } catch (UnsupportedEncodingException uex) {
                Rlog.e(LOG_TAG,
                    Rlog.e(LOG_TAG, "Implausible UnsupportedEncodingException ", uex);
                        "Implausible UnsupportedEncodingException ",
                        uex);
                    return null;
                    return null;
                }
                }
            }
            }
        }


        if (encoding == ENCODING_7BIT) {
        if (encoding == ENCODING_7BIT) {
            if ((0xff & userData[0]) > MAX_USER_DATA_SEPTETS) {
            if ((0xff & userData[0]) > MAX_USER_DATA_SEPTETS) {
@@ -438,9 +444,10 @@ public class SmsMessage extends SmsMessageBase {
     *
     *
     * @return encoded message as UCS2
     * @return encoded message as UCS2
     * @throws UnsupportedEncodingException
     * @throws UnsupportedEncodingException
     * @throws EncodeException if String is too large to encode
     */
     */
    private static byte[] encodeUCS2(String message, byte[] header)
    private static byte[] encodeUCS2(String message, byte[] header)
        throws UnsupportedEncodingException {
            throws UnsupportedEncodingException, EncodeException {
        byte[] userData, textPart;
        byte[] userData, textPart;
        textPart = message.getBytes("utf-16be");
        textPart = message.getBytes("utf-16be");


@@ -455,6 +462,10 @@ public class SmsMessage extends SmsMessageBase {
        else {
        else {
            userData = textPart;
            userData = textPart;
        }
        }
        if (userData.length > 255) {
            throw new EncodeException(
                    "Payload cannot exceed 255 bytes", EncodeException.ERROR_EXCEED_SIZE);
        }
        byte[] ret = new byte[userData.length+1];
        byte[] ret = new byte[userData.length+1];
        ret[0] = (byte) (userData.length & 0xff );
        ret[0] = (byte) (userData.length & 0xff );
        System.arraycopy(userData, 0, ret, 1, userData.length);
        System.arraycopy(userData, 0, ret, 1, userData.length);