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

Commit dfe3be98 authored by Steven Moreland's avatar Steven Moreland
Browse files

libbinder: FdTrigger detect read POLLHUP/EOF

> Did you just hang up on me?

>> I don't know, did it sound like this?

*click*

When talking to a service, and it hangs up, don't just stand there, do
something!

Bug: 185167543
Test: binderRpcTest

Change-Id: I5cc00debffad2eb2cca6fabdcf3f55bb69514cb9
parent 6b566967
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -127,7 +127,7 @@ void RpcSession::FdTrigger::trigger() {

bool RpcSession::FdTrigger::triggerablePollRead(base::borrowed_fd fd) {
    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}};
        int ret = TEMP_FAILURE_RETRY(poll(pfd, arraysize(pfd), -1));
        if (ret < 0) {
@@ -140,7 +140,7 @@ bool RpcSession::FdTrigger::triggerablePollRead(base::borrowed_fd fd) {
        if (pfd[1].revents & POLLHUP) {
            return false;
        }
        return true;
        return pfd[0].revents & POLLIN;
    }
}

@@ -150,6 +150,8 @@ bool RpcSession::FdTrigger::interruptableRecv(base::borrowed_fd fd, void* data,

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

        if (readSize < 0) {
            ALOGE("Failed to read %s", strerror(errno));
            return false;