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

Commit 3b37fa25 authored by Josh Gao's avatar Josh Gao
Browse files

adb: convert fdevent over to unique_fd.

This adds fdsan deallocation sanitization to all fds monitored by
fdevent, which is most of the ones in adb.

Bug: http://b/79786774
Test: python test_device.py
Change-Id: I465804fdb0fd0ac019445900a30ba3403f5bf711
parent ae9c1dc4
Loading
Loading
Loading
Loading
+9 −10
Original line number Original line Diff line number Diff line
@@ -57,7 +57,7 @@ struct PollNode {


  explicit PollNode(fdevent* fde) : fde(fde) {
  explicit PollNode(fdevent* fde) : fde(fde) {
      memset(&pollfd, 0, sizeof(pollfd));
      memset(&pollfd, 0, sizeof(pollfd));
      pollfd.fd = fde->fd;
      pollfd.fd = fde->fd.get();


#if defined(__linux__)
#if defined(__linux__)
      // Always enable POLLRDHUP, so the host server can take action when some clients disconnect.
      // Always enable POLLRDHUP, so the host server can take action when some clients disconnect.
@@ -111,7 +111,7 @@ static std::string dump_fde(const fdevent* fde) {
    if (fde->state & FDE_ERROR) {
    if (fde->state & FDE_ERROR) {
        state += "E";
        state += "E";
    }
    }
    return android::base::StringPrintf("(fdevent %d %s)", fde->fd, state.c_str());
    return android::base::StringPrintf("(fdevent %d %s)", fde->fd.get(), state.c_str());
}
}


void fdevent_install(fdevent* fde, int fd, fd_func func, void* arg) {
void fdevent_install(fdevent* fde, int fd, fd_func func, void* arg) {
@@ -126,7 +126,7 @@ fdevent* fdevent_create(int fd, fd_func func, void* arg) {


    fdevent* fde = new fdevent();
    fdevent* fde = new fdevent();
    fde->state = FDE_ACTIVE;
    fde->state = FDE_ACTIVE;
    fde->fd = fd;
    fde->fd.reset(fd);
    fde->func = func;
    fde->func = func;
    fde->arg = arg;
    fde->arg = arg;
    if (!set_file_block_mode(fd, false)) {
    if (!set_file_block_mode(fd, false)) {
@@ -135,7 +135,7 @@ fdevent* fdevent_create(int fd, fd_func func, void* arg) {
        // to handle it.
        // to handle it.
        LOG(ERROR) << "failed to set non-blocking mode for fd " << fd;
        LOG(ERROR) << "failed to set non-blocking mode for fd " << fd;
    }
    }
    auto pair = g_poll_node_map.emplace(fde->fd, PollNode(fde));
    auto pair = g_poll_node_map.emplace(fde->fd.get(), PollNode(fde));
    CHECK(pair.second) << "install existing fd " << fd;
    CHECK(pair.second) << "install existing fd " << fd;


    fde->state |= FDE_CREATED;
    fde->state |= FDE_CREATED;
@@ -150,12 +150,11 @@ void fdevent_destroy(fdevent* fde) {
    }
    }


    if (fde->state & FDE_ACTIVE) {
    if (fde->state & FDE_ACTIVE) {
        g_poll_node_map.erase(fde->fd);
        g_poll_node_map.erase(fde->fd.get());
        if (fde->state & FDE_PENDING) {
        if (fde->state & FDE_PENDING) {
            g_pending_list.remove(fde);
            g_pending_list.remove(fde);
        }
        }
        adb_close(fde->fd);
        fde->fd.reset();
        fde->fd = -1;
        fde->state = 0;
        fde->state = 0;
        fde->events = 0;
        fde->events = 0;
    }
    }
@@ -164,7 +163,7 @@ void fdevent_destroy(fdevent* fde) {
}
}


static void fdevent_update(fdevent* fde, unsigned events) {
static void fdevent_update(fdevent* fde, unsigned events) {
    auto it = g_poll_node_map.find(fde->fd);
    auto it = g_poll_node_map.find(fde->fd.get());
    CHECK(it != g_poll_node_map.end());
    CHECK(it != g_poll_node_map.end());
    PollNode& node = it->second;
    PollNode& node = it->second;
    if (events & FDE_READ) {
    if (events & FDE_READ) {
@@ -263,7 +262,7 @@ static void fdevent_process() {
            auto it = g_poll_node_map.find(pollfd.fd);
            auto it = g_poll_node_map.find(pollfd.fd);
            CHECK(it != g_poll_node_map.end());
            CHECK(it != g_poll_node_map.end());
            fdevent* fde = it->second.fde;
            fdevent* fde = it->second.fde;
            CHECK_EQ(fde->fd, pollfd.fd);
            CHECK_EQ(fde->fd.get(), pollfd.fd);
            fde->events |= events;
            fde->events |= events;
            D("%s got events %x", dump_fde(fde).c_str(), events);
            D("%s got events %x", dump_fde(fde).c_str(), events);
            fde->state |= FDE_PENDING;
            fde->state |= FDE_PENDING;
@@ -278,7 +277,7 @@ static void fdevent_call_fdfunc(fdevent* fde) {
    CHECK(fde->state & FDE_PENDING);
    CHECK(fde->state & FDE_PENDING);
    fde->state &= (~FDE_PENDING);
    fde->state &= (~FDE_PENDING);
    D("fdevent_call_fdfunc %s", dump_fde(fde).c_str());
    D("fdevent_call_fdfunc %s", dump_fde(fde).c_str());
    fde->func(fde->fd, events, fde->arg);
    fde->func(fde->fd.get(), events, fde->arg);
}
}


static void fdevent_run_flush() EXCLUDES(run_queue_mutex) {
static void fdevent_run_flush() EXCLUDES(run_queue_mutex) {
+3 −1
Original line number Original line Diff line number Diff line
@@ -22,6 +22,8 @@


#include <functional>
#include <functional>


#include "adb_unique_fd.h"

/* events that may be observed */
/* events that may be observed */
#define FDE_READ              0x0001
#define FDE_READ              0x0001
#define FDE_WRITE             0x0002
#define FDE_WRITE             0x0002
@@ -33,7 +35,7 @@ struct fdevent {
    fdevent* next = nullptr;
    fdevent* next = nullptr;
    fdevent* prev = nullptr;
    fdevent* prev = nullptr;


    int fd = -1;
    unique_fd fd;
    int force_eof = 0;
    int force_eof = 0;


    uint16_t state = 0;
    uint16_t state = 0;