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

Commit 309fc2d4 authored by Taesu Lee's avatar Taesu Lee
Browse files

Fix wrong userData length and excessive userData issues



Added checking size excess in encodeUCS2() and an exception cause in
EncodeException to distinguish between unencodable char and size excess.
It will prevent wrong userData length and excessive userData issues
during encoding userData. Please see below one issue scenario.

stringToGsm7BitPackedWithHeader() throws an EncodeException when
septeCount > 255. The EncodeException is caught and encoding again
through encodeUCS2(). However, the length of encoded userData as UCS-2
is converted as Byte without checking size excess. Thus first byte of
userData will be wrong and total userData will exceed maximum User Data.

Test: Manual

Change-Id: Ib6df5484072d77548e8adcbcbd15ad7a401c99f8
Signed-off-by: default avatarTaesu Lee <taesu82.lee@samsung.com>
parent 643e60b0
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -22,6 +22,12 @@ import android.annotation.UnsupportedAppUsage;
 * {@hide}
 */
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() {
        super();
    }
@@ -31,9 +37,18 @@ public class EncodeException extends Exception {
        super(s);
    }

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

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

    public int getError() {
        return mError;
    }
}
+3 −2
Original line number Diff line number Diff line
@@ -388,7 +388,7 @@ public class GsmAlphabet {
     *     GSM extension table
     * @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
    public static byte[] stringToGsm7BitPacked(String data, int startingSeptetOffset,
@@ -402,7 +402,8 @@ public class GsmAlphabet {
        }
        septetCount += startingSeptetOffset;
        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;
        byte[] ret = new byte[byteCount + 1];  // Include space for one byte length prefix.
+21 −10
Original line number Diff line number Diff line
@@ -384,18 +384,24 @@ public class SmsMessage extends SmsMessageBase {
                }
            }
        } 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
                // send it as a UCS-2 encoded message
                try {
                    userData = encodeUCS2(message, header);
                    encoding = ENCODING_16BIT;
                } catch (EncodeException ex1) {
                    Rlog.e(LOG_TAG, "Exceed size limitation EncodeException", ex1);
                    return null;
                } catch (UnsupportedEncodingException uex) {
                Rlog.e(LOG_TAG,
                        "Implausible UnsupportedEncodingException ",
                        uex);
                    Rlog.e(LOG_TAG, "Implausible UnsupportedEncodingException ", uex);
                    return null;
                }
            }
        }

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

@@ -455,6 +462,10 @@ public class SmsMessage extends SmsMessageBase {
        else {
            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];
        ret[0] = (byte) (userData.length & 0xff );
        System.arraycopy(userData, 0, ret, 1, userData.length);