summaryrefslogtreecommitdiff
path: root/libs/binder/RpcSession.cpp
diff options
context:
space:
mode:
author Steven Moreland <smoreland@google.com> 2021-05-24 17:52:25 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2021-05-24 17:52:25 +0000
commit3caff151fed6d44f83aa616e95b26fb3e9f70005 (patch)
treed48a4a3bd3fc118bbbfe9cc92faa0eab76b965e8 /libs/binder/RpcSession.cpp
parenta0b682cc2d0dc7764279af70465ab3c49e2081c6 (diff)
parent2b4f380c6548b8c146962eab8bc070e6c3647dc4 (diff)
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
Diffstat (limited to 'libs/binder/RpcSession.cpp')
-rw-r--r--libs/binder/RpcSession.cpp26
1 files changed, 14 insertions, 12 deletions
diff --git a/libs/binder/RpcSession.cpp b/libs/binder/RpcSession.cpp
index 771d738579..9f26a33335 100644
--- a/libs/binder/RpcSession.cpp
+++ b/libs/binder/RpcSession.cpp
@@ -125,39 +125,41 @@ void RpcSession::FdTrigger::trigger() {
mWrite.reset();
}
-bool RpcSession::FdTrigger::triggerablePollRead(base::borrowed_fd fd) {
+status_t 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) {
- ALOGE("Could not poll: %s", strerror(errno));
- continue;
+ return -errno;
}
if (ret == 0) {
continue;
}
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* 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));
+ if (readSize == 0) return DEAD_OBJECT; // EOF
+
if (readSize < 0) {
- ALOGE("Failed to read %s", strerror(errno));
- return false;
+ return -errno;
}
buffer += readSize;
- if (buffer == end) return true;
+ if (buffer == end) return OK;
}
- return false;
+ return status;
}
status_t RpcSession::readId() {