Loading adb/adb.cpp +14 −8 Original line number Original line Diff line number Diff line Loading @@ -1071,20 +1071,26 @@ static int SendOkay(int fd, const std::string& s) { return 0; return 0; } } static bool g_reject_kill_server = false; void adb_set_reject_kill_server(bool value) { g_reject_kill_server = value; } HostRequestResult handle_host_request(std::string_view service, TransportType type, HostRequestResult handle_host_request(std::string_view service, TransportType type, const char* serial, TransportId transport_id, int reply_fd, const char* serial, TransportId transport_id, int reply_fd, asocket* s) { asocket* s) { if (service == "kill") { if (service == "kill") { if (g_reject_kill_server) { LOG(WARNING) << "adb server ignoring kill-server"; SendFail(reply_fd, "kill-server rejected by remote server"); } else { fprintf(stderr, "adb server killed by remote request\n"); fprintf(stderr, "adb server killed by remote request\n"); fflush(stdout); // Send a reply even though we don't read it anymore, so that old versions // of adb that do read it don't spew error messages. SendOkay(reply_fd); SendOkay(reply_fd); // Rely on process exit to close the socket for us. // Rely on process exit to close the socket for us. exit(0); exit(0); } } } LOG(DEBUG) << "handle_host_request(" << service << ")"; LOG(DEBUG) << "handle_host_request(" << service << ")"; Loading adb/adb.h +9 −3 Original line number Original line Diff line number Diff line Loading @@ -14,8 +14,7 @@ * limitations under the License. * limitations under the License. */ */ #ifndef __ADB_H #pragma once #define __ADB_H #include <limits.h> #include <limits.h> #include <stdint.h> #include <stdint.h> Loading Loading @@ -237,6 +236,7 @@ void send_tls_request(atransport* t); void parse_banner(const std::string&, atransport* t); void parse_banner(const std::string&, atransport* t); #if ADB_HOST // On startup, the adb server needs to wait until all of the connected devices are ready. // On startup, the adb server needs to wait until all of the connected devices are ready. // To do this, we need to know when the scan has identified all of the potential new transports, and // To do this, we need to know when the scan has identified all of the potential new transports, and // when each transport becomes ready. // when each transport becomes ready. Loading @@ -250,6 +250,12 @@ void update_transport_status(); // Wait until device scan has completed and every transport is ready, or a timeout elapses. // Wait until device scan has completed and every transport is ready, or a timeout elapses. void adb_wait_for_device_initialization(); void adb_wait_for_device_initialization(); #endif // ADB_HOST void usb_init(); #if ADB_HOST // When ssh-forwarding to a remote adb server, kill-server is almost never what you actually want, // and unfortunately, many other tools issue it. This adds a knob to reject kill-servers. void adb_set_reject_kill_server(bool reject); #endif #endif void usb_init(); adb/client/adb_client.cpp +18 −2 Original line number Original line Diff line number Diff line Loading @@ -204,9 +204,25 @@ bool adb_kill_server() { return false; return false; } } // The server might send OKAY, so consume that. char buf[4]; char buf[4]; ReadFdExactly(fd.get(), buf, 4); if (!ReadFdExactly(fd.get(), buf, 4)) { fprintf(stderr, "error: failed to read response from server\n"); return false; } if (memcmp(buf, "OKAY", 4) == 0) { // Nothing to do. } else if (memcmp(buf, "FAIL", 4) == 0) { std::string output, error; if (!ReadProtocolString(fd.get(), &output, &error)) { fprintf(stderr, "error: %s\n", error.c_str()); return false; } fprintf(stderr, "error: %s\n", output.c_str()); return false; } // Now that no more data is expected, wait for socket orderly shutdown or error, indicating // Now that no more data is expected, wait for socket orderly shutdown or error, indicating // server death. // server death. ReadOrderlyShutdown(fd.get()); ReadOrderlyShutdown(fd.get()); Loading adb/client/main.cpp +6 −1 Original line number Original line Diff line number Diff line Loading @@ -105,7 +105,12 @@ int adb_server_main(int is_daemon, const std::string& socket_spec, int ack_reply fdevent_run_on_main_thread([]() { exit(0); }); fdevent_run_on_main_thread([]() { exit(0); }); }); }); char* leak = getenv("ADB_LEAK"); const char* reject_kill_server = getenv("ADB_REJECT_KILL_SERVER"); if (reject_kill_server && strcmp(reject_kill_server, "1") == 0) { adb_set_reject_kill_server(true); } const char* leak = getenv("ADB_LEAK"); if (leak && strcmp(leak, "1") == 0) { if (leak && strcmp(leak, "1") == 0) { intentionally_leak(); intentionally_leak(); } } Loading Loading
adb/adb.cpp +14 −8 Original line number Original line Diff line number Diff line Loading @@ -1071,20 +1071,26 @@ static int SendOkay(int fd, const std::string& s) { return 0; return 0; } } static bool g_reject_kill_server = false; void adb_set_reject_kill_server(bool value) { g_reject_kill_server = value; } HostRequestResult handle_host_request(std::string_view service, TransportType type, HostRequestResult handle_host_request(std::string_view service, TransportType type, const char* serial, TransportId transport_id, int reply_fd, const char* serial, TransportId transport_id, int reply_fd, asocket* s) { asocket* s) { if (service == "kill") { if (service == "kill") { if (g_reject_kill_server) { LOG(WARNING) << "adb server ignoring kill-server"; SendFail(reply_fd, "kill-server rejected by remote server"); } else { fprintf(stderr, "adb server killed by remote request\n"); fprintf(stderr, "adb server killed by remote request\n"); fflush(stdout); // Send a reply even though we don't read it anymore, so that old versions // of adb that do read it don't spew error messages. SendOkay(reply_fd); SendOkay(reply_fd); // Rely on process exit to close the socket for us. // Rely on process exit to close the socket for us. exit(0); exit(0); } } } LOG(DEBUG) << "handle_host_request(" << service << ")"; LOG(DEBUG) << "handle_host_request(" << service << ")"; Loading
adb/adb.h +9 −3 Original line number Original line Diff line number Diff line Loading @@ -14,8 +14,7 @@ * limitations under the License. * limitations under the License. */ */ #ifndef __ADB_H #pragma once #define __ADB_H #include <limits.h> #include <limits.h> #include <stdint.h> #include <stdint.h> Loading Loading @@ -237,6 +236,7 @@ void send_tls_request(atransport* t); void parse_banner(const std::string&, atransport* t); void parse_banner(const std::string&, atransport* t); #if ADB_HOST // On startup, the adb server needs to wait until all of the connected devices are ready. // On startup, the adb server needs to wait until all of the connected devices are ready. // To do this, we need to know when the scan has identified all of the potential new transports, and // To do this, we need to know when the scan has identified all of the potential new transports, and // when each transport becomes ready. // when each transport becomes ready. Loading @@ -250,6 +250,12 @@ void update_transport_status(); // Wait until device scan has completed and every transport is ready, or a timeout elapses. // Wait until device scan has completed and every transport is ready, or a timeout elapses. void adb_wait_for_device_initialization(); void adb_wait_for_device_initialization(); #endif // ADB_HOST void usb_init(); #if ADB_HOST // When ssh-forwarding to a remote adb server, kill-server is almost never what you actually want, // and unfortunately, many other tools issue it. This adds a knob to reject kill-servers. void adb_set_reject_kill_server(bool reject); #endif #endif void usb_init();
adb/client/adb_client.cpp +18 −2 Original line number Original line Diff line number Diff line Loading @@ -204,9 +204,25 @@ bool adb_kill_server() { return false; return false; } } // The server might send OKAY, so consume that. char buf[4]; char buf[4]; ReadFdExactly(fd.get(), buf, 4); if (!ReadFdExactly(fd.get(), buf, 4)) { fprintf(stderr, "error: failed to read response from server\n"); return false; } if (memcmp(buf, "OKAY", 4) == 0) { // Nothing to do. } else if (memcmp(buf, "FAIL", 4) == 0) { std::string output, error; if (!ReadProtocolString(fd.get(), &output, &error)) { fprintf(stderr, "error: %s\n", error.c_str()); return false; } fprintf(stderr, "error: %s\n", output.c_str()); return false; } // Now that no more data is expected, wait for socket orderly shutdown or error, indicating // Now that no more data is expected, wait for socket orderly shutdown or error, indicating // server death. // server death. ReadOrderlyShutdown(fd.get()); ReadOrderlyShutdown(fd.get()); Loading
adb/client/main.cpp +6 −1 Original line number Original line Diff line number Diff line Loading @@ -105,7 +105,12 @@ int adb_server_main(int is_daemon, const std::string& socket_spec, int ack_reply fdevent_run_on_main_thread([]() { exit(0); }); fdevent_run_on_main_thread([]() { exit(0); }); }); }); char* leak = getenv("ADB_LEAK"); const char* reject_kill_server = getenv("ADB_REJECT_KILL_SERVER"); if (reject_kill_server && strcmp(reject_kill_server, "1") == 0) { adb_set_reject_kill_server(true); } const char* leak = getenv("ADB_LEAK"); if (leak && strcmp(leak, "1") == 0) { if (leak && strcmp(leak, "1") == 0) { intentionally_leak(); intentionally_leak(); } } Loading