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

Commit 297d9bf8 authored by Josh Gao's avatar Josh Gao
Browse files

adb: actually enable fdsan.

adb was using a custom unique_fd closer that didn't have an
implementation for fdsan, which meant that none of our FDs were
actually tracked. Guard this behind ifdefs so that we only use this
on Windows, and delete our implementation of Pipe in favor of the one
in libbase while we're at it. libbase's implementation always sets
O_CLOEXEC, so fix up the instance of Pipe that doesn't expect that.

Test: mma
Test: adb start-server
Test: debuggerd `pidof adbd`
Change-Id: Ic29d641a2f93fb42384b00c51775048c8bcbe152
parent 9d100f10
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -891,6 +891,10 @@ int launch_server(const std::string& socket_spec) {
        // child side of the fork
        pipe_read.reset();

        // android::base::Pipe unconditionally opens the pipe with O_CLOEXEC.
        // Undo this manually.
        fcntl(pipe_write.get(), F_SETFD, 0);

        char reply_fd[30];
        snprintf(reply_fd, sizeof(reply_fd), "%d", pipe_write.get());
        // child process
+1 −42
Original line number Diff line number Diff line
@@ -21,49 +21,8 @@

#include "sysdeps.h"

#if defined(_WIN32)
void AdbCloser::Close(int fd) {
    adb_close(fd);
}

#if !defined(_WIN32)
bool Pipe(unique_fd* read, unique_fd* write, int flags) {
    int pipefd[2];
#if !defined(__APPLE__)
    if (pipe2(pipefd, flags) != 0) {
        return false;
    }
#else
    // Darwin doesn't have pipe2. Implement it ourselves.
    if (flags != 0 && (flags & ~(O_CLOEXEC | O_NONBLOCK)) != 0) {
        errno = EINVAL;
        return false;
    }

    if (pipe(pipefd) != 0) {
        return false;
    }

    if (flags & O_CLOEXEC) {
        if (fcntl(pipefd[0], F_SETFD, FD_CLOEXEC) != 0 ||
            fcntl(pipefd[1], F_SETFD, FD_CLOEXEC) != 0) {
            adb_close(pipefd[0]);
            adb_close(pipefd[1]);
            return false;
        }
    }

    if (flags & O_NONBLOCK) {
        if (fcntl(pipefd[0], F_SETFL, O_NONBLOCK) != 0 ||
            fcntl(pipefd[1], F_SETFL, O_NONBLOCK) != 0) {
            adb_close(pipefd[0]);
            adb_close(pipefd[1]);
            return false;
        }
    }
#endif

    read->reset(pipefd[0]);
    write->reset(pipefd[1]);
    return true;
}
#endif
+3 −3
Original line number Diff line number Diff line
@@ -21,15 +21,15 @@

#include <android-base/unique_fd.h>

#if defined(_WIN32)
// Helper to automatically close an FD when it goes out of scope.
struct AdbCloser {
    static void Close(int fd);
};

using unique_fd = android::base::unique_fd_impl<AdbCloser>;

#if !defined(_WIN32)
bool Pipe(unique_fd* read, unique_fd* write, int flags = 0);
#else
using unique_fd = android::base::unique_fd;
#endif

template <typename T>