diff --git a/adb/adb.cpp b/adb/adb.cpp index fdf720c5c..06e4c5085 100644 --- a/adb/adb.cpp +++ b/adb/adb.cpp @@ -359,6 +359,11 @@ void handle_packet(apacket *p, atransport *t) if (t->online && p->msg.arg0 != 0 && p->msg.arg1 == 0) { std::string_view address(p->payload.begin(), p->payload.size()); + // Historically, we received service names as a char*, and stopped at the first NUL + // byte. The client sent strings with null termination, which post-string_view, start + // being interpreted as part of the string, unless we explicitly strip them. + address = StripTrailingNulls(address); + asocket* s = create_local_service_socket(address, t); if (s == nullptr) { send_close(0, p->msg.arg0, t); diff --git a/adb/daemon/services.cpp b/adb/daemon/services.cpp index 84a76557c..36939975b 100644 --- a/adb/daemon/services.cpp +++ b/adb/daemon/services.cpp @@ -328,13 +328,6 @@ asocket* daemon_service_to_socket(std::string_view name) { } unique_fd daemon_service_to_fd(std::string_view name, atransport* transport) { - // Historically, we received service names as a char*, and stopped at the first NUL byte. - // The client unintentionally sent strings with embedded NULs, which post-string_view, start - // being interpreted as part of the string, unless we explicitly strip them. - // Notably, shell checks that the part after "shell:" is empty to determine whether the session - // is interactive, and {'\0'} is non-empty. - name = StripTrailingNulls(name); - if (name.starts_with("dev:")) { name.remove_prefix(strlen("dev:")); return unique_fd{unix_open(name, O_RDWR | O_CLOEXEC)};