Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d2f3c762 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Sasha Levin
Browse files

media: pvrusb2: fix pvr2_stream_callback casts



[ Upstream commit 30baa4a96b23add91a87305baaeba82c4e109e1f ]

clang-16 complains about a control flow integrity (KCFI) issue in pvrusb2,
which casts three different prototypes into pvr2_stream_callback:

drivers/media/usb/pvrusb2/pvrusb2-v4l2.c:1070:30: error: cast from 'void (*)(struct pvr2_v4l2_fh *)' to 'pvr2_stream_callback' (aka 'void (*)(void *)') converts to incompatible function type [-Werror,-Wcast-function-type-strict]
 1070 |         pvr2_stream_set_callback(sp,(pvr2_stream_callback)pvr2_v4l2_notify,fh);
      |                                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/media/usb/pvrusb2/pvrusb2-context.c:110:6: error: cast from 'void (*)(struct pvr2_context *)' to 'void (*)(void *)' converts to incompatible function type [-Werror,-Wcast-function-type-strict]
  110 |                                         (void (*)(void *))pvr2_context_notify,
      |                                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/media/usb/pvrusb2/pvrusb2-dvb.c:152:6: error: cast from 'void (*)(struct pvr2_dvb_adapter *)' to 'pvr2_stream_callback' (aka 'void (*)(void *)') converts to incompatible function type [-Werror,-Wcast-function-type-strict]
  152 |                                  (pvr2_stream_callback) pvr2_dvb_notify, adap);
      |                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Change the functions to actually take a void* argument so the cast is no longer
needed.

Fixes: bb8ce9d9 ("V4L/DVB (7682): pvrusb2-dvb: finish up stream & buffer handling")
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent e9d391cc
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -90,8 +90,10 @@ static void pvr2_context_destroy(struct pvr2_context *mp)
}


static void pvr2_context_notify(struct pvr2_context *mp)
static void pvr2_context_notify(void *ptr)
{
	struct pvr2_context *mp = ptr;

	pvr2_context_set_notify(mp,!0);
}

@@ -106,9 +108,7 @@ static void pvr2_context_check(struct pvr2_context *mp)
		pvr2_trace(PVR2_TRACE_CTXT,
			   "pvr2_context %p (initialize)", mp);
		/* Finish hardware initialization */
		if (pvr2_hdw_initialize(mp->hdw,
					(void (*)(void *))pvr2_context_notify,
					mp)) {
		if (pvr2_hdw_initialize(mp->hdw, pvr2_context_notify, mp)) {
			mp->video_stream.stream =
				pvr2_hdw_get_video_stream(mp->hdw);
			/* Trigger interface initialization.  By doing this
+4 −2
Original line number Diff line number Diff line
@@ -88,8 +88,10 @@ static int pvr2_dvb_feed_thread(void *data)
	return stat;
}

static void pvr2_dvb_notify(struct pvr2_dvb_adapter *adap)
static void pvr2_dvb_notify(void *ptr)
{
	struct pvr2_dvb_adapter *adap = ptr;

	wake_up(&adap->buffer_wait_data);
}

@@ -149,7 +151,7 @@ static int pvr2_dvb_stream_do_start(struct pvr2_dvb_adapter *adap)
	}

	pvr2_stream_set_callback(pvr->video_stream.stream,
				 (pvr2_stream_callback) pvr2_dvb_notify, adap);
				 pvr2_dvb_notify, adap);

	ret = pvr2_stream_set_buffer_count(stream, PVR2_DVB_BUFFER_COUNT);
	if (ret < 0) return ret;
+4 −2
Original line number Diff line number Diff line
@@ -1037,8 +1037,10 @@ static int pvr2_v4l2_open(struct file *file)
}


static void pvr2_v4l2_notify(struct pvr2_v4l2_fh *fhp)
static void pvr2_v4l2_notify(void *ptr)
{
	struct pvr2_v4l2_fh *fhp = ptr;

	wake_up(&fhp->wait_data);
}

@@ -1071,7 +1073,7 @@ static int pvr2_v4l2_iosetup(struct pvr2_v4l2_fh *fh)

	hdw = fh->channel.mc_head->hdw;
	sp = fh->pdi->stream->stream;
	pvr2_stream_set_callback(sp,(pvr2_stream_callback)pvr2_v4l2_notify,fh);
	pvr2_stream_set_callback(sp, pvr2_v4l2_notify, fh);
	pvr2_hdw_set_stream_type(hdw,fh->pdi->config);
	if ((ret = pvr2_hdw_set_streaming(hdw,!0)) < 0) return ret;
	return pvr2_ioread_set_enabled(fh->rhp,!0);