[lvc-project] [PATCH v2 1/1] media: atomisp: Avoid memory leaks in ia_css_pipe_create_cas_scaler_desc_single_output()

Fedor Pchelkin pchelkin at ispras.ru
Fri Sep 26 20:45:27 MSK 2025


On Wed, 17. Sep 03:42, Ivan Abramov wrote:
> Fix this by freeing memory at the end of the function in case of an
> non-NULL err.

Судя по всему использование этой функции направлено на «внешнюю» очистку
ресурсов.  В местах вызова ia_css_pipe_create_cas_scaler_desc_single_output()
на дальнейших error-путях функция зачитски памяти не вызывается, хотя
тоже должна бы.  Лучше наверно снаружи в местах вызова функции организовать
обработку через goto.

К примеру, ниже на остальных error-путях функция зачистки также не
вызывается:

load_video_binaries() {
...

		struct ia_css_cas_binary_descr cas_scaler_descr = { };

		/* NV12 is the common format that is supported by both */
		/* yuv_scaler and the video_xx_isp2_min binaries. */
		video_bin_out_info.format = IA_CSS_FRAME_FORMAT_NV12;

		err = ia_css_pipe_create_cas_scaler_desc_single_output(
			  &video_bin_out_info,
			  pipe_out_info,
			  NULL,
			  &cas_scaler_descr);
		if (err)
			return err;
		mycs->num_yuv_scaler = cas_scaler_descr.num_stage;
		mycs->yuv_scaler_binary = kcalloc(cas_scaler_descr.num_stage,
						  sizeof(struct ia_css_binary),
						  GFP_KERNEL);
		if (!mycs->yuv_scaler_binary) {
			mycs->num_yuv_scaler = 0;
			err = -ENOMEM;
			return err;
		}
		mycs->is_output_stage = kcalloc(cas_scaler_descr.num_stage,
						sizeof(bool), GFP_KERNEL);
		if (!mycs->is_output_stage) {
			err = -ENOMEM;
			return err;
		}
		for (i = 0; i < cas_scaler_descr.num_stage; i++) {
			struct ia_css_binary_descr yuv_scaler_descr;

			mycs->is_output_stage[i] = cas_scaler_descr.is_output_stage[i];
			ia_css_pipe_get_yuvscaler_binarydesc(pipe,
							     &yuv_scaler_descr, &cas_scaler_descr.in_info[i],
							     &cas_scaler_descr.out_info[i],
							     &cas_scaler_descr.internal_out_info[i],
							     &cas_scaler_descr.vf_info[i]);
			err = ia_css_binary_find(&yuv_scaler_descr,
						 &mycs->yuv_scaler_binary[i]);
			if (err) {
				kfree(mycs->is_output_stage);
				mycs->is_output_stage = NULL;
				return err;
			}
		}
		ia_css_pipe_destroy_cas_scaler_desc(&cas_scaler_descr);
}




More information about the lvc-project mailing list