From 007a4dc7a6b8ad6ec206f2c70be7f66d59287ecb Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Mon, 11 Mar 2019 13:03:08 -0700 Subject: [PATCH] adbd: properly handle FUNCTIONFS_BIND without ENABLE. If a device is unplugged, a BIND will happen without an ENABLE until the device is plugged in, which would previously result in adbd crashing every 5 seconds due to an attempt to join a thread that hadn't been started. Bug: http://b/128255355 Test: manually observed adbd via serial cable while unplugged Change-Id: I90d6384e7e829df1ffaf73a95f2418a2ff97fb03 --- adb/daemon/usb.cpp | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/adb/daemon/usb.cpp b/adb/daemon/usb.cpp index a44ff43b6..f4458a2c8 100644 --- a/adb/daemon/usb.cpp +++ b/adb/daemon/usb.cpp @@ -270,29 +270,15 @@ struct UsbFfsConnection : public Connection { bool started = false; bool running = true; while (running) { - int timeout = -1; - if (!bound || !started) { - timeout = 5000 /*ms*/; - } - adb_pollfd pfd[2] = { { .fd = control_fd_.get(), .events = POLLIN, .revents = 0 }, { .fd = monitor_event_fd_.get(), .events = POLLIN, .revents = 0 }, }; - int rc = TEMP_FAILURE_RETRY(adb_poll(pfd, 2, timeout)); + int rc = TEMP_FAILURE_RETRY(adb_poll(pfd, 2, -1)); if (rc == -1) { PLOG(FATAL) << "poll on USB control fd failed"; } else if (rc == 0) { - // Something in the kernel presumably went wrong. - // Close our endpoints, wait for a bit, and then try again. - StopWorker(); - aio_context_.reset(); - read_fd_.reset(); - write_fd_.reset(); - control_fd_.reset(); - std::this_thread::sleep_for(5s); - HandleError("didn't receive FUNCTIONFS_ENABLE, retrying"); - return; + LOG(FATAL) << "poll on USB control fd returned 0"; } if (pfd[1].revents) {