Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 007a4dc7 authored by Josh Gao's avatar Josh Gao
Browse files

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
parent fdfb9a01
Loading
Loading
Loading
Loading
+2 −16
Original line number Original line Diff line number Diff line
@@ -270,29 +270,15 @@ struct UsbFfsConnection : public Connection {
            bool started = false;
            bool started = false;
            bool running = true;
            bool running = true;
            while (running) {
            while (running) {
                int timeout = -1;
                if (!bound || !started) {
                    timeout = 5000 /*ms*/;
                }

                adb_pollfd pfd[2] = {
                adb_pollfd pfd[2] = {
                  { .fd = control_fd_.get(), .events = POLLIN, .revents = 0 },
                  { .fd = control_fd_.get(), .events = POLLIN, .revents = 0 },
                  { .fd = monitor_event_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) {
                if (rc == -1) {
                    PLOG(FATAL) << "poll on USB control fd failed";
                    PLOG(FATAL) << "poll on USB control fd failed";
                } else if (rc == 0) {
                } else if (rc == 0) {
                    // Something in the kernel presumably went wrong.
                    LOG(FATAL) << "poll on USB control fd returned 0";
                    // 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;
                }
                }


                if (pfd[1].revents) {
                if (pfd[1].revents) {