diff options
author | Joey Grover <joeygrover@gmail.com> | 2021-03-23 15:19:21 -0400 |
---|---|---|
committer | Joey Grover <joeygrover@gmail.com> | 2021-03-23 15:19:21 -0400 |
commit | fa9301e8a1680fbcf9ce4d8dfccf63b10366263c (patch) | |
tree | 6ff6c9971b3571fab547de4e3a1d32c632a6d0e8 | |
parent | e21d19897f12fcdec71455c6c507b03003fbdff2 (diff) | |
download | sdl_android-fa9301e8a1680fbcf9ce4d8dfccf63b10366263c.tar.gz |
Add PSM fix for already released Core versions
This is added to deal with the case where Core would incorrectly encrypt the first frame which would make the payload length greater than 8 which is a protocol spec violation.
-rw-r--r-- | base/src/main/java/com/smartdevicelink/transport/SdlPsm.java | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/base/src/main/java/com/smartdevicelink/transport/SdlPsm.java b/base/src/main/java/com/smartdevicelink/transport/SdlPsm.java index a142cebad..99510b061 100644 --- a/base/src/main/java/com/smartdevicelink/transport/SdlPsm.java +++ b/base/src/main/java/com/smartdevicelink/transport/SdlPsm.java @@ -61,14 +61,14 @@ public class SdlPsm { private static final byte FIRST_FRAME_DATA_SIZE = 0x08; private static final int VERSION_MASK = 0xF0; //4 highest bits - private static final int COMPRESSION_MASK = 0x08; //4th lowest bit + private static final int ENCRYPTION_MASK = 0x08; //4th lowest bit private static final int FRAME_TYPE_MASK = 0x07; //3 lowest bits int state; int version; - boolean compression; + boolean encrypted; int frameType; int serviceType; int controlFrameInfo; @@ -97,7 +97,7 @@ public class SdlPsm { if (version == 0) { //It should never be 0 return ERROR_STATE; } - compression = (1 == ((rawByte & (byte) COMPRESSION_MASK) >> 3)); + encrypted = (1 == ((rawByte & (byte) ENCRYPTION_MASK) >> 3)); frameType = rawByte & (byte) FRAME_TYPE_MASK; @@ -194,7 +194,10 @@ public class SdlPsm { break; case SdlPacket.FRAME_TYPE_FIRST: - if (dataLength == FIRST_FRAME_DATA_SIZE) { + if (dataLength == FIRST_FRAME_DATA_SIZE || this.encrypted) { + //In a few production releases of core the first frame could be + //encrypted. Therefore it is not an error state if the first frame data + //length is greater than 8 in that case alone. break; } default: @@ -263,7 +266,7 @@ public class SdlPsm { public SdlPacket getFormedPacket() { if (state == FINISHED_STATE) { //Log.trace(TAG, "Finished packet."); - return new SdlPacket(version, compression, frameType, + return new SdlPacket(version, encrypted, frameType, serviceType, controlFrameInfo, sessionId, dataLength, messageId, payload); } else { |