[lvc-project] [PATCH] media: ipu6: isys: fix csi2 NULL deref in stream enable/disable

Fedor Pchelkin pchelkin at ispras.ru
Sun Dec 14 21:35:58 MSK 2025


On Fri, 12. Dec 01:10, Mikhail Lobanov wrote:
> media_pad_remote_pad_first() may return NULL when there is no enabled
> media link on the CSI-2 sink pad. ipu6_isys_csi2_enable_streams() and
> ipu6_isys_csi2_disable_streams() dereference remote_pad->entity
> unconditionally, which can lead to a NULL pointer dereference when no
> remote pad is present.
> 
> Check the remote pad before dereferencing it, return -ENOTCONN from the
> enable path when no remote pad is found, and always stop the local CSI-2
> stream in the disable path even if the remote entity is already gone.
> Rely on this check to also cover the remote sub-device, as
> media_entity_to_v4l2_subdev() only returns NULL when called with a NULL
> entity.
> 
> Found by Linux Verification Center (linuxtesting.org) with SVACE.
> 
> Fixes: 3a5c59ad926b ("media: ipu6: Rework CSI-2 sub-device streaming control")
> Signed-off-by: Mikhail Lobanov <m.lobanov at rosa.ru>
> ---

Пу-пу-пумм..  То есть в N-ый раз была выслана некоторая версия одних и тех
же патчей, каких либо отсылок к ранее отправленному сделано не было.
Сообщал об этом Алексею.  За мэйнтейнеров драйвера сказать не могу, но вот
я уже запутался ещё в прошлые разы с тем, что здесь происходит, по каким
причинам отправляются новые патчи, что было изменено по сравнению с
предыдущим и т.д.  Если имеете за раз несколько (тем более схожих друг с
другом) патчей в один и тот же драйвер, их можно объединить в серию для
удобства.

Ответа, _почему_ предлагается возвращать 0 при ошибке получения remote_pad
в disable-функции, так и не предоставлено.  Как минимум в подобных
функциях других драйверов — dcmipp_inp_disable_streams() — такого не
происходит.  Значит там ошибка?

Просил провести дополнительный анализ этих предупреждений на предмет того,
может ли действительно media_pad_remote_pad_first() вернуть NULL в
условиях данного драйвера в интересующих местах.  Например, можно
поизучать вызовы media_create_pad_link() в drivers/media/pci/intel/ipu6/ и
прийти к какому-то тому или иному выводу.

>  drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> index 43a2a16a3c2a..29791b66d479 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> @@ -356,6 +356,9 @@ static int ipu6_isys_csi2_enable_streams(struct v4l2_subdev *sd,
>  	int ret;
>  
>  	remote_pad = media_pad_remote_pad_first(&sd->entity.pads[CSI2_PAD_SINK]);
> +	if (!remote_pad)
> +		return -ENOTCONN;
> +
>  	remote_sd = media_entity_to_v4l2_subdev(remote_pad->entity);

Подразумевается, что указатель remote_pad->entity является ненулевым?
Почему? 

>  
>  	sink_streams =
> @@ -393,6 +396,11 @@ static int ipu6_isys_csi2_disable_streams(struct v4l2_subdev *sd,
>  						&streams_mask);
>  
>  	remote_pad = media_pad_remote_pad_first(&sd->entity.pads[CSI2_PAD_SINK]);
> +	if (!remote_pad) {
> +		ipu6_isys_csi2_set_stream(sd, NULL, 0, false);
> +		return 0;
> +	}
> +
>  	remote_sd = media_entity_to_v4l2_subdev(remote_pad->entity);
>  
>  	ipu6_isys_csi2_set_stream(sd, NULL, 0, false);
> -- 
> 2.47.2



More information about the lvc-project mailing list