From 355b81f232bdb08fd4fdc2a66156fd9e16bd95d4 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 3 Jan 2019 17:06:37 +0000 Subject: [PATCH] If enumerating remote target controls on Android, distrust everything * On android sometimes if you connect successfully over a forwarded port you haven't actually connected! You need to wait a bit, try and use the socket, and then you might find that you've been disconnected. --- renderdoc/replay/entry_points.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/renderdoc/replay/entry_points.cpp b/renderdoc/replay/entry_points.cpp index 8d135fe41..5c5eb3b7a 100644 --- a/renderdoc/replay/entry_points.cpp +++ b/renderdoc/replay/entry_points.cpp @@ -379,6 +379,7 @@ extern "C" RENDERDOC_API uint32_t RENDERDOC_CC RENDERDOC_EnumerateRemoteTargets( else nextIdent++; + bool isAndroid = false; uint32_t lastIdent = RenderDoc_LastTargetControlPort; if(host != NULL && Android::IsHostADB(host)) { @@ -386,6 +387,8 @@ extern "C" RENDERDOC_API uint32_t RENDERDOC_CC RENDERDOC_EnumerateRemoteTargets( std::string deviceID; Android::ExtractDeviceIDAndIndex(host, index, deviceID); + isAndroid = true; + // each subsequent device gets a new range of ports. The deviceID isn't needed since we already // forwarded the ports to the right devices. if(nextIdent == RenderDoc_FirstTargetControlPort) @@ -401,6 +404,17 @@ extern "C" RENDERDOC_API uint32_t RENDERDOC_CC RENDERDOC_EnumerateRemoteTargets( if(sock) { + if(isAndroid) + { + Threading::Sleep(100); + (void)sock->IsRecvDataWaiting(); + if(!sock->Connected()) + { + SAFE_DELETE(sock); + return 0; + } + } + SAFE_DELETE(sock); return nextIdent; }