OSDN Git Service

Fix double fd close in SharedMemoryParcelable.
authorRuben Brunk <rubenbrunk@google.com>
Tue, 8 Aug 2017 02:19:42 +0000 (19:19 -0700)
committerRuben Brunk <rubenbrunk@google.com>
Tue, 8 Aug 2017 17:03:00 +0000 (10:03 -0700)
Bug: 64311216

Test: Checked that close() does not return EBADF.
Change-Id: Ia98c37d749dd3a6f22708657e8c7c346a9c0c5a4

media/libaaudio/src/binding/SharedMemoryParcelable.cpp
media/libaaudio/src/binding/SharedMemoryParcelable.h

index 899eb04..b582b99 100644 (file)
@@ -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,14 +87,13 @@ aaudio_result_t SharedMemoryParcelable::close() {
     }
     if (mFd != -1) {
         ALOGV("SharedMemoryParcelable::close() LEAK? mFd = %d\n", mFd);
-        ::close(mFd);
+        if(::close(mFd) < 0) {
+            int err = errno;
+            ALOGE("SharedMemoryParcelable close failed for fd = %d, errno = %d (%s)",
+                  mFd, err, strerror(err));
+        }
         mFd = -1;
     }
-    if (mOriginalFd != -1) {
-        ALOGV("SharedMemoryParcelable::close() LEAK? mOriginalFd = %d\n", mOriginalFd);
-        ::close(mOriginalFd);
-        mOriginalFd = -1;
-    }
     return AAUDIO_OK;
 }
 
index 4b94b46..c5107d3 100644 (file)
@@ -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;
 };