Blob Blame History Raw
From: Takashi Iwai <tiwai@suse.de>
Subject: media: dvb_net: kABI workaround
Patch-mainline: Never, kABI workaround
References: CVE-2022-45886 bsc#1205760

For keeping the kABI workaround, the newly introduced remove_mutex
of dvb_net to be a global one.  It's not urgent for performance,
so we can live with that.

Signed-off-by: Takashi Iwai <tiwai@suse.de>

---
 drivers/media/dvb-core/dvb_net.c |   19 ++++++++++---------
 include/media/dvb_net.h          |    4 ----
 2 files changed, 10 insertions(+), 13 deletions(-)

--- a/drivers/media/dvb-core/dvb_net.c
+++ b/drivers/media/dvb-core/dvb_net.c
@@ -57,6 +57,8 @@
 #include <media/dvb_demux.h>
 #include <media/dvb_net.h>
 
+static DEFINE_MUTEX(remove_mutex);
+
 static inline __u32 iov_crc32( __u32 c, struct kvec *iov, unsigned int cnt )
 {
 	unsigned int j;
@@ -1570,17 +1572,17 @@ static int locked_dvb_net_open(struct in
 	struct dvb_net *dvbnet = dvbdev->priv;
 	int ret;
 
-	if (mutex_lock_interruptible(&dvbnet->remove_mutex))
+	if (mutex_lock_interruptible(&remove_mutex))
 		return -ERESTARTSYS;
 
 	if (dvbnet->exit) {
-		mutex_unlock(&dvbnet->remove_mutex);
+		mutex_unlock(&remove_mutex);
 		return -ENODEV;
 	}
 
 	ret = dvb_generic_open(inode, file);
 
-	mutex_unlock(&dvbnet->remove_mutex);
+	mutex_unlock(&remove_mutex);
 
 	return ret;
 }
@@ -1590,15 +1592,15 @@ static int dvb_net_close(struct inode *i
 	struct dvb_device *dvbdev = file->private_data;
 	struct dvb_net *dvbnet = dvbdev->priv;
 
-	mutex_lock(&dvbnet->remove_mutex);
+	mutex_lock(&remove_mutex);
 
 	dvb_generic_release(inode, file);
 
 	if (dvbdev->users == 1 && dvbnet->exit == 1) {
-		mutex_unlock(&dvbnet->remove_mutex);
+		mutex_unlock(&remove_mutex);
 		wake_up(&dvbdev->wait_queue);
 	} else {
-		mutex_unlock(&dvbnet->remove_mutex);
+		mutex_unlock(&remove_mutex);
 	}
 
 	return 0;
@@ -1627,9 +1629,9 @@ void dvb_net_release (struct dvb_net *dv
 {
 	int i;
 
-	mutex_lock(&dvbnet->remove_mutex);
+	mutex_lock(&remove_mutex);
 	dvbnet->exit = 1;
-	mutex_unlock(&dvbnet->remove_mutex);
+	mutex_unlock(&remove_mutex);
 
 	if (dvbnet->dvbdev->users < 1)
 		wait_event(dvbnet->dvbdev->wait_queue,
@@ -1652,7 +1654,6 @@ int dvb_net_init (struct dvb_adapter *ad
 	int i;
 
 	mutex_init(&dvbnet->ioctl_mutex);
-	mutex_init(&dvbnet->remove_mutex);
 	dvbnet->demux = dmx;
 
 	for (i=0; i<DVB_NET_DEVICES_MAX; i++)
--- a/include/media/dvb_net.h
+++ b/include/media/dvb_net.h
@@ -41,9 +41,6 @@
  * @exit:		flag to indicate when the device is being removed.
  * @demux:		pointer to &struct dmx_demux.
  * @ioctl_mutex:	protect access to this struct.
- * @remove_mutex:	mutex that avoids a race condition between a callback
- *			called when the hardware is disconnected and the
- *			file_operations of dvb_net.
  *
  * Currently, the core supports up to %DVB_NET_DEVICES_MAX (10) network
  * devices.
@@ -56,7 +53,6 @@ struct dvb_net {
 	unsigned int exit:1;
 	struct dmx_demux *demux;
 	struct mutex ioctl_mutex;
-	struct mutex remove_mutex;
 };
 
 /**