diff options
author | Bretty White <geekman3454@protonmail.com> | 2018-02-14 15:36:35 -0500 |
---|---|---|
committer | Bretty White <geekman3454@protonmail.com> | 2018-02-14 15:36:35 -0500 |
commit | 8dd67cb669c02720c322daff396548fa16e51cd7 (patch) | |
tree | 9de65273d6fa25449fd914f62c0b1a62e65317b5 | |
parent | 41b0d7de8d749372d886fd908b36892e7997cb92 (diff) | |
download | sdl_android-8dd67cb669c02720c322daff396548fa16e51cd7.tar.gz |
catch UAI race condition
-rw-r--r-- | sdl_android/src/main/java/com/smartdevicelink/transport/SdlRouterService.java | 25 |
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(); |