realtime_zsl: Avoid reading pending_request after erasure The entry erased by: pending_frame_number_to_requests_.erase(result->frame_number); is actually the `pending_request`. So after the erasure it must not be accessed again. This commit fixes a use-after-free bug introduced by commit 31fa05e. Fix: 279845929 Test: CTS Change-Id: I91197513377b5e3f7972c3f521cfbd94614ae36f
diff --git a/common/hal/google_camera_hal/realtime_zsl_result_request_processor.cc b/common/hal/google_camera_hal/realtime_zsl_result_request_processor.cc index d9a851a..93e5844 100644 --- a/common/hal/google_camera_hal/realtime_zsl_result_request_processor.cc +++ b/common/hal/google_camera_hal/realtime_zsl_result_request_processor.cc
@@ -407,13 +407,16 @@ // the callback directly. Otherwise wait until the missing pieces arrive. CombineErrorAndPendingEntriesToResult(error_entry, pending_request, result); + const bool has_returned_output_to_internal_stream_manager = + pending_request.has_returned_output_to_internal_stream_manager; + if (AllDataCollected(error_entry)) { pending_error_frames_.erase(result->frame_number); pending_frame_number_to_requests_.erase(result->frame_number); } // Don't send result to framework if only internal raw callback - if (pending_request.has_returned_output_to_internal_stream_manager && + if (has_returned_output_to_internal_stream_manager && result->result_metadata == nullptr && result->output_buffers.size() == 0) { return; }