summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBretty White <geekman3454@protonmail.com>2018-02-14 15:36:35 -0500
committerBretty White <geekman3454@protonmail.com>2018-02-14 15:36:35 -0500
commit8dd67cb669c02720c322daff396548fa16e51cd7 (patch)
tree9de65273d6fa25449fd914f62c0b1a62e65317b5
parent41b0d7de8d749372d886fd908b36892e7997cb92 (diff)
downloadsdl_android-8dd67cb669c02720c322daff396548fa16e51cd7.tar.gz
catch UAI race condition
-rw-r--r--sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java25
1 files changed, 25 insertions, 0 deletions
diff --git a/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java b/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java
index 6500d71da..76a0b79a8 100644
--- a/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java
+++ b/sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java
@@ -139,6 +139,7 @@ public class SdlRouterService extends Service{
public static HashMap<String,RegisteredApp> registeredApps;
private SparseArray<String> sessionMap;
private SparseIntArray sessionHashIdMap;
+ private SparseIntArray cleanedSessionMap;
private final Object SESSION_LOCK = new Object(), REGISTERED_APPS_LOCK = new Object(), PING_COUNT_LOCK = new Object();
private static Messenger altTransportService = null;
@@ -852,6 +853,7 @@ public class SdlRouterService extends Service{
synchronized(SESSION_LOCK){
this.sessionMap = new SparseArray<String>();
this.sessionHashIdMap = new SparseIntArray();
+ this.cleanedSessionMap = new SparseIntArray();
}
packetExecutor = Executors.newSingleThreadExecutor();
}
@@ -1480,6 +1482,28 @@ public class SdlRouterService extends Service{
}
}
+ if(packet.getFrameType() == FrameType.Single && packet.getServiceType() == SdlPacket.SERVICE_TYPE_RPC){
+ BinaryFrameHeader binFrameHeader = BinaryFrameHeader.parseBinaryHeader(packet.getPayload());
+ if(binFrameHeader!=null && FunctionID.UNREGISTER_APP_INTERFACE.getId() == binFrameHeader.getFunctionID()){
+ Log.d(TAG, "Received an unregister app interface. Checking session hash before sending");
+ // make sure that we don't try and unregister recently added app that might have a
+ // session ID of a removed app whose UAI was delayed
+ int hashOfRemoved = this.cleanedSessionMap.get(session, -1);
+ int currentHash = this.sessionHashIdMap.get(session, -1);
+ if (hashOfRemoved != -1 && currentHash != -1) {
+ // Current session contains key that was held before
+ if (hashOfRemoved != currentHash){
+ // App assigned same session id but is different app. keep this from being killed
+ Log.i(TAG, "same session id for different apps found, dropping packet");
+ this.cleanedSessionMap.clear();
+ return false;
+ }
+ // clean up
+ this.cleanedSessionMap.clear();
+ }
+ }
+ }
+
int packetSize = (int) (packet.getDataSize() + SdlPacket.HEADER_SIZE);
//Log.i(TAG, "Checking packet size: " + packetSize);
Message message = Message.obtain();
@@ -1563,6 +1587,7 @@ public class SdlRouterService extends Service{
if(this.sessionHashIdMap.indexOfKey(session)>=0){
hashId = this.sessionHashIdMap.get(session);
this.sessionHashIdMap.delete(session);
+ this.cleanedSessionMap.put(session,hashId);
}
}
byte[] stopService = (SdlPacketFactory.createEndSession(SessionType.RPC, (byte)session, 0, (byte)version,BitConverter.intToByteArray(hashId))).constructPacket();