mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 22:04:26 +00:00
Merge "ExternalCameraHAL: Prevent memory leak when manipulating native_handle" into main
This commit is contained in:
committed by
Android (Google) Code Review
commit
b28ec8ac00
@@ -1391,12 +1391,14 @@ Status ExternalCameraDeviceSession::importRequestLockedImpl(
|
||||
|
||||
// All buffers are imported. Now validate output buffer acquire fences
|
||||
for (size_t i = 0; i < numOutputBufs; i++) {
|
||||
if (!sHandleImporter.importFence(
|
||||
::android::makeFromAidl(request.outputBuffers[i].acquireFence), allFences[i])) {
|
||||
native_handle_t* h = ::android::makeFromAidl(request.outputBuffers[i].acquireFence);
|
||||
if (!sHandleImporter.importFence(h, allFences[i])) {
|
||||
ALOGE("%s: output buffer %zu acquire fence is invalid", __FUNCTION__, i);
|
||||
cleanupInflightFences(allFences, i);
|
||||
native_handle_delete(h);
|
||||
return Status::INTERNAL_ERROR;
|
||||
}
|
||||
native_handle_delete(h);
|
||||
}
|
||||
return Status::OK;
|
||||
}
|
||||
@@ -2094,9 +2096,10 @@ bool ExternalCameraDeviceSession::BufferRequestThread::threadLoop() {
|
||||
// TODO: create a batch import API so we don't need to lock/unlock mCbsLock
|
||||
// repeatedly?
|
||||
lk.unlock();
|
||||
Status s =
|
||||
parent->importBuffer(streamId, hBuf.bufferId, makeFromAidl(hBuf.buffer),
|
||||
/*out*/ &mBufferReqs[i].bufPtr);
|
||||
native_handle_t* h = makeFromAidl(hBuf.buffer);
|
||||
Status s = parent->importBuffer(streamId, hBuf.bufferId, h,
|
||||
/*out*/ &mBufferReqs[i].bufPtr);
|
||||
native_handle_delete(h);
|
||||
lk.lock();
|
||||
|
||||
if (s != Status::OK) {
|
||||
@@ -2104,12 +2107,14 @@ bool ExternalCameraDeviceSession::BufferRequestThread::threadLoop() {
|
||||
cleanupInflightFences(importedFences, i - 1);
|
||||
return false;
|
||||
}
|
||||
if (!sHandleImporter.importFence(makeFromAidl(hBuf.acquireFence),
|
||||
mBufferReqs[i].acquireFence)) {
|
||||
h = makeFromAidl(hBuf.acquireFence);
|
||||
if (!sHandleImporter.importFence(h, mBufferReqs[i].acquireFence)) {
|
||||
ALOGE("%s: stream %d import fence failed!", __FUNCTION__, streamId);
|
||||
cleanupInflightFences(importedFences, i - 1);
|
||||
native_handle_delete(h);
|
||||
return false;
|
||||
}
|
||||
native_handle_delete(h);
|
||||
importedFences[i] = mBufferReqs[i].acquireFence;
|
||||
} break;
|
||||
default:
|
||||
|
||||
@@ -111,6 +111,7 @@ Status ExternalCameraOfflineSession::processCaptureResult(std::shared_ptr<HalReq
|
||||
native_handle_t* handle = native_handle_create(/*numFds*/ 1, /*numInts*/ 0);
|
||||
handle->data[0] = req->buffers[i].acquireFence;
|
||||
result.outputBuffers[i].releaseFence = android::dupToAidl(handle);
|
||||
native_handle_delete(handle);
|
||||
}
|
||||
notifyError(req->frameNumber, req->buffers[i].streamId, ErrorCode::ERROR_BUFFER);
|
||||
} else {
|
||||
@@ -120,6 +121,7 @@ Status ExternalCameraOfflineSession::processCaptureResult(std::shared_ptr<HalReq
|
||||
native_handle_t* handle = native_handle_create(/*numFds*/ 1, /*numInts*/ 0);
|
||||
handle->data[0] = req->buffers[i].acquireFence;
|
||||
outputBuffer.releaseFence = android::dupToAidl(handle);
|
||||
native_handle_delete(handle);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -248,6 +250,7 @@ Status ExternalCameraOfflineSession::processCaptureRequestError(
|
||||
native_handle_t* handle = native_handle_create(/*numFds*/ 1, /*numInts*/ 0);
|
||||
handle->data[0] = req->buffers[i].acquireFence;
|
||||
outputBuffer.releaseFence = dupToAidl(handle);
|
||||
native_handle_delete(handle);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user