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

Commit 3caff151 authored by Steven Moreland's avatar Steven Moreland Committed by Gerrit Code Review
Browse files

Merge changes I097784a4,I6a5dcbb1,Ic52adef0,I5cc00deb

* changes:
  libbinder: FdTrigger methods use status_t
  libbinder: harder failure on poll failure
  libbinder:interruptableRecv>interruptableReadFully
  libbinder: FdTrigger detect read POLLHUP/EOF
parents a0b682cc 2b4f380c
Loading
Loading
Loading
Loading
+9 −3
Original line number Original line Diff line number Diff line
@@ -151,9 +151,11 @@ void RpcServer::join() {
        LOG_ALWAYS_FATAL_IF(mShutdownTrigger == nullptr, "Cannot create join signaler");
        LOG_ALWAYS_FATAL_IF(mShutdownTrigger == nullptr, "Cannot create join signaler");
    }
    }


    while (mShutdownTrigger->triggerablePollRead(mServer)) {
    status_t status;
    while ((status = mShutdownTrigger->triggerablePollRead(mServer)) == OK) {
        (void)acceptOne();
        (void)acceptOne();
    }
    }
    LOG_RPC_DETAIL("RpcServer::join exiting with %s", statusToString(status).c_str());


    {
    {
        std::lock_guard<std::mutex> _l(mLock);
        std::lock_guard<std::mutex> _l(mLock);
@@ -236,9 +238,13 @@ void RpcServer::establishConnection(sp<RpcServer>&& server, base::unique_fd clie
    LOG_ALWAYS_FATAL_IF(server->mShutdownTrigger == nullptr);
    LOG_ALWAYS_FATAL_IF(server->mShutdownTrigger == nullptr);


    int32_t id;
    int32_t id;
    bool idValid = server->mShutdownTrigger->interruptableRecv(clientFd.get(), &id, sizeof(id));
    status_t status =
            server->mShutdownTrigger->interruptableReadFully(clientFd.get(), &id, sizeof(id));
    bool idValid = status == OK;
    if (!idValid) {
    if (!idValid) {
        ALOGE("Failed to read ID for client connecting to RPC server.");
        ALOGE("Failed to read ID for client connecting to RPC server: %s",
              statusToString(status).c_str());
        // still need to cleanup before we can return
    }
    }


    std::thread thisThread;
    std::thread thisThread;
+14 −12
Original line number Original line Diff line number Diff line
@@ -125,39 +125,41 @@ void RpcSession::FdTrigger::trigger() {
    mWrite.reset();
    mWrite.reset();
}
}


bool RpcSession::FdTrigger::triggerablePollRead(base::borrowed_fd fd) {
status_t RpcSession::FdTrigger::triggerablePollRead(base::borrowed_fd fd) {
    while (true) {
    while (true) {
        pollfd pfd[]{{.fd = fd.get(), .events = POLLIN, .revents = 0},
        pollfd pfd[]{{.fd = fd.get(), .events = POLLIN | POLLHUP, .revents = 0},
                     {.fd = mRead.get(), .events = POLLHUP, .revents = 0}};
                     {.fd = mRead.get(), .events = POLLHUP, .revents = 0}};
        int ret = TEMP_FAILURE_RETRY(poll(pfd, arraysize(pfd), -1));
        int ret = TEMP_FAILURE_RETRY(poll(pfd, arraysize(pfd), -1));
        if (ret < 0) {
        if (ret < 0) {
            ALOGE("Could not poll: %s", strerror(errno));
            return -errno;
            continue;
        }
        }
        if (ret == 0) {
        if (ret == 0) {
            continue;
            continue;
        }
        }
        if (pfd[1].revents & POLLHUP) {
        if (pfd[1].revents & POLLHUP) {
            return false;
            return -ECANCELED;
        }
        }
        return true;
        return pfd[0].revents & POLLIN ? OK : DEAD_OBJECT;
    }
    }
}
}


bool RpcSession::FdTrigger::interruptableRecv(base::borrowed_fd fd, void* data, size_t size) {
status_t RpcSession::FdTrigger::interruptableReadFully(base::borrowed_fd fd, void* data,
                                                       size_t size) {
    uint8_t* buffer = reinterpret_cast<uint8_t*>(data);
    uint8_t* buffer = reinterpret_cast<uint8_t*>(data);
    uint8_t* end = buffer + size;
    uint8_t* end = buffer + size;


    while (triggerablePollRead(fd)) {
    status_t status;
    while ((status = triggerablePollRead(fd)) == OK) {
        ssize_t readSize = TEMP_FAILURE_RETRY(recv(fd.get(), buffer, end - buffer, MSG_NOSIGNAL));
        ssize_t readSize = TEMP_FAILURE_RETRY(recv(fd.get(), buffer, end - buffer, MSG_NOSIGNAL));
        if (readSize == 0) return DEAD_OBJECT; // EOF

        if (readSize < 0) {
        if (readSize < 0) {
            ALOGE("Failed to read %s", strerror(errno));
            return -errno;
            return false;
        }
        }
        buffer += readSize;
        buffer += readSize;
        if (buffer == end) return true;
        if (buffer == end) return OK;
    }
    }
    return false;
    return status;
}
}


status_t RpcSession::readId() {
status_t RpcSession::readId() {
+2 −2
Original line number Original line Diff line number Diff line
@@ -132,7 +132,7 @@ private:
         *   true - time to read!
         *   true - time to read!
         *   false - trigger happened
         *   false - trigger happened
         */
         */
        bool triggerablePollRead(base::borrowed_fd fd);
        status_t triggerablePollRead(base::borrowed_fd fd);


        /**
        /**
         * Read, but allow the read to be interrupted by this trigger.
         * Read, but allow the read to be interrupted by this trigger.
@@ -141,7 +141,7 @@ private:
         *   true - read succeeded at 'size'
         *   true - read succeeded at 'size'
         *   false - interrupted (failure or trigger)
         *   false - interrupted (failure or trigger)
         */
         */
        bool interruptableRecv(base::borrowed_fd fd, void* data, size_t size);
        status_t interruptableReadFully(base::borrowed_fd fd, void* data, size_t size);


    private:
    private:
        base::unique_fd mWrite;
        base::unique_fd mWrite;