From 4d0cd3f5241df28d8259c5ee7df33649c5c10f2d Mon Sep 17 00:00:00 2001 From: Taiju Tsuiki Date: Thu, 30 Apr 2015 22:15:33 +0900 Subject: [PATCH] Close Fence FDs in error cases of Surface and GraphicBufferMapper Surface::{cancel,queue}Buffer and GraphicBufferMapper::lockAsyncYCbCr take the ownership of |fenceFd|s. Though they don't close it on error cases. Change-Id: I49a7ce8837d5c510c4ac4ad4649f310d18610e80 (cherry picked from commit c7263fb43297744eb04b11025424c0c526d5584c) --- libs/gui/Surface.cpp | 6 ++++++ libs/ui/GraphicBufferMapper.cpp | 3 +++ 2 files changed, 9 insertions(+) diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index 5d81f10a4..35aa7c76b 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -267,6 +267,9 @@ int Surface::cancelBuffer(android_native_buffer_t* buffer, Mutex::Autolock lock(mMutex); int i = getSlotFromBufferLocked(buffer); if (i < 0) { + if (fenceFd >= 0) { + close(fenceFd); + } return i; } sp fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); @@ -308,6 +311,9 @@ int Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) { } int i = getSlotFromBufferLocked(buffer); if (i < 0) { + if (fenceFd >= 0) { + close(fenceFd); + } return i; } diff --git a/libs/ui/GraphicBufferMapper.cpp b/libs/ui/GraphicBufferMapper.cpp index b03e8d6bd..90a1c1110 100644 --- a/libs/ui/GraphicBufferMapper.cpp +++ b/libs/ui/GraphicBufferMapper.cpp @@ -164,6 +164,9 @@ status_t GraphicBufferMapper::lockAsyncYCbCr(buffer_handle_t handle, bounds.left, bounds.top, bounds.width(), bounds.height(), ycbcr); } else { + if (fenceFd >= 0) { + close(fenceFd); + } return -EINVAL; // do not log failure }