Commit 2ddd0330 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

media: cec: safely unhook lists in cec_data



smatch warns about data->list not being removed from list:

drivers/media/cec/core/cec-adap.c:926 cec_transmit_msg_fh() warn: '&data->list' not removed from list

It is a false warning, but it doesn't hurt to make the code more robust
and safely unhook data->list and data->xfer_list together with a WARN_ON
if this is actually ever needed (this really shouldn't happen).

Note that fixing the data->list warning just replaced it with a new similar
warning for data->xfer_list, so both needed to be addressed.

Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 1a59cd88
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -342,7 +342,7 @@ static void cec_data_completed(struct cec_data *data)
	 * Without that we would be referring to a closed filehandle.
	 */
	if (data->fh)
		list_del(&data->xfer_list);
		list_del_init(&data->xfer_list);

	if (data->blocking) {
		/*
@@ -898,6 +898,8 @@ int cec_transmit_msg_fh(struct cec_adapter *adap, struct cec_msg *msg,

	if (fh)
		list_add_tail(&data->xfer_list, &fh->xfer_list);
	else
		INIT_LIST_HEAD(&data->xfer_list);

	list_add_tail(&data->list, &adap->transmit_queue);
	adap->transmit_queue_sz++;
@@ -923,6 +925,10 @@ int cec_transmit_msg_fh(struct cec_adapter *adap, struct cec_msg *msg,

	/* The transmit completed (possibly with an error) */
	*msg = data->msg;
	if (WARN_ON(!list_empty(&data->list)))
		list_del(&data->list);
	if (WARN_ON(!list_empty(&data->xfer_list)))
		list_del(&data->xfer_list);
	kfree(data);
	return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -669,7 +669,7 @@ static int cec_release(struct inode *inode, struct file *filp)

		data->blocking = false;
		data->fh = NULL;
		list_del(&data->xfer_list);
		list_del_init(&data->xfer_list);
	}
	mutex_unlock(&adap->lock);
	while (!list_empty(&fh->msgs)) {