Merge "Fix wrong userData length and excessive userData issues"

This commit is contained in:
Amit Mahajan
2019-02-01 22:25:37 +00:00
committed by Gerrit Code Review
3 changed files with 39 additions and 12 deletions

View File

@@ -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;
}
}

View File

@@ -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.

View File

@@ -384,16 +384,22 @@ public class SmsMessage extends SmsMessageBase {
}
}
} catch (EncodeException ex) {
// 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(UnsupportedEncodingException uex) {
Rlog.e(LOG_TAG,
"Implausible UnsupportedEncodingException ",
uex);
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);
return null;
}
}
}
@@ -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);