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

Commit 1d665bc4 authored by Ruben Brunk's avatar Ruben Brunk
Browse files

Fix double fd close in SharedMemoryParcelable.

Bug: 64311216

Test: Checked that close() does not return EBADF.
Change-Id: Ia98c37d749dd3a6f22708657e8c7c346a9c0c5a4
parent ddef08e7
Loading
Loading
Loading
Loading
+8 −9
Original line number Diff line number Diff line
@@ -64,9 +64,9 @@ status_t SharedMemoryParcelable::readFromParcel(const Parcel* parcel) {
    if (mSizeInBytes > 0) {
        // Keep the original FD until you are done with the mFd.
        // If you close it in here then it will prevent mFd from working.
        mOriginalFd = parcel->readFileDescriptor();
        ALOGV("SharedMemoryParcelable::readFromParcel() LEAK? mOriginalFd = %d\n", mOriginalFd);
        mFd = fcntl(mOriginalFd, F_DUPFD_CLOEXEC, 0);
        int originalFd = parcel->readFileDescriptor();
        ALOGV("SharedMemoryParcelable::readFromParcel() LEAK? originalFd = %d\n", originalFd);
        mFd = fcntl(originalFd, F_DUPFD_CLOEXEC, 0);
        ALOGV("SharedMemoryParcelable::readFromParcel() LEAK? mFd = %d\n", mFd);
        if (mFd == -1) {
            status = -errno;
@@ -87,13 +87,12 @@ aaudio_result_t SharedMemoryParcelable::close() {
    }
    if (mFd != -1) {
        ALOGV("SharedMemoryParcelable::close() LEAK? mFd = %d\n", mFd);
        ::close(mFd);
        mFd = -1;
        if(::close(mFd) < 0) {
            int err = errno;
            ALOGE("SharedMemoryParcelable close failed for fd = %d, errno = %d (%s)",
                  mFd, err, strerror(err));
        }
    if (mOriginalFd != -1) {
        ALOGV("SharedMemoryParcelable::close() LEAK? mOriginalFd = %d\n", mOriginalFd);
        ::close(mOriginalFd);
        mOriginalFd = -1;
        mFd = -1;
    }
    return AAUDIO_OK;
}
+0 −1
Original line number Diff line number Diff line
@@ -68,7 +68,6 @@ protected:
#define MMAP_UNRESOLVED_ADDRESS    reinterpret_cast<uint8_t*>(MAP_FAILED)

    int      mFd = -1;
    int      mOriginalFd = -1;
    int32_t  mSizeInBytes = 0;
    uint8_t *mResolvedAddress = MMAP_UNRESOLVED_ADDRESS;
};