Camera: Fix FD leak
- To prevent leaking of duplicated FD, use original
FD in syncTimestampToDisplayLocked and duplicate when
used
Test: CTS test
Bug: 290155485
Change-Id: I8d4f4b623aec9e731862f9789f940e339edd10dc
diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
index 7185895..f98636b 100644
--- a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
+++ b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
@@ -487,7 +487,7 @@
bufferDeferred = true;
} else {
nsecs_t presentTime = mSyncToDisplay ?
- syncTimestampToDisplayLocked(captureTime, releaseFence->dup()) : captureTime;
+ syncTimestampToDisplayLocked(captureTime, releaseFence) : captureTime;
setTransform(transform, true/*mayChangeMirror*/);
res = native_window_set_buffers_timestamp(mConsumer.get(), presentTime);
@@ -1412,7 +1412,7 @@
}
}
-nsecs_t Camera3OutputStream::syncTimestampToDisplayLocked(nsecs_t t, int releaseFence) {
+nsecs_t Camera3OutputStream::syncTimestampToDisplayLocked(nsecs_t t, sp<Fence> releaseFence) {
nsecs_t currentTime = systemTime();
if (!mFixedFps) {
mLastCaptureTime = t;
@@ -1460,8 +1460,8 @@
mRefVsyncData = vsyncEventData;
mReferenceCaptureTime = t;
mReferenceArrivalTime = currentTime;
- if (releaseFence != -1) {
- mReferenceFrameFence = new Fence(releaseFence);
+ if (releaseFence->isValid()) {
+ mReferenceFrameFence = new Fence(releaseFence->dup());
} else {
mFenceSignalOffset = 0;
}
diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.h b/services/camera/libcameraservice/device3/Camera3OutputStream.h
index 0b456c0..65791a9 100644
--- a/services/camera/libcameraservice/device3/Camera3OutputStream.h
+++ b/services/camera/libcameraservice/device3/Camera3OutputStream.h
@@ -446,7 +446,7 @@
static constexpr nsecs_t kTimelineThresholdNs = 1000000LL; // 1 millisecond
static constexpr float kMaxIntervalRatioDeviation = 0.05f;
static constexpr int kMaxTimelines = 2;
- nsecs_t syncTimestampToDisplayLocked(nsecs_t t, int releaseFence);
+ nsecs_t syncTimestampToDisplayLocked(nsecs_t t, sp<Fence> releaseFence);
// In case of fence being used
sp<Fence> mReferenceFrameFence;