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

Commit b463da8e authored by Leena Winterrowd's avatar Leena Winterrowd Committed by Glenn Kasten
Browse files

libmedia: Preserve futex return status in client obtainBuffer



clock_gettime() can change errno if something goes wrong (most
commonly setting EBADF). This failure should not cause a failure
in ClientProxy::obtainBuffer() if the futex returned successfully
or with a known status. Preserve errno before calling clock_gettime
to prevent propagation of an invalid, unexpected error.

authored-by: default avatarLeena Winterrowd <lenhardw@codeaurora.org>

Change-Id: Ib69201031a81395ece47dd8ad7c4dcddd2b00153
parent 4472c761
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -240,6 +240,7 @@ status_t ClientProxy::obtainBuffer(Buffer* buffer, const struct timespec *reques
            errno = 0;
            (void) syscall(__NR_futex, &cblk->mFutex,
                    mClientInServer ? FUTEX_WAIT_PRIVATE : FUTEX_WAIT, old & ~CBLK_FUTEX_WAKE, ts);
            status_t error = errno; // clock_gettime can affect errno
            // update total elapsed time spent waiting
            if (measure) {
                struct timespec after;
@@ -257,7 +258,7 @@ status_t ClientProxy::obtainBuffer(Buffer* buffer, const struct timespec *reques
                before = after;
                beforeIsValid = true;
            }
            switch (errno) {
            switch (error) {
            case 0:            // normal wakeup by server, or by binderDied()
            case EWOULDBLOCK:  // benign race condition with server
            case EINTR:        // wait was interrupted by signal or other spurious wakeup
@@ -265,7 +266,7 @@ status_t ClientProxy::obtainBuffer(Buffer* buffer, const struct timespec *reques
                // FIXME these error/non-0 status are being dropped
                break;
            default:
                status = errno;
                status = error;
                ALOGE("%s unexpected error %s", __func__, strerror(status));
                goto end;
            }