dvbdev: fix illegal re-usage of fileoperations struct
PATCH 1/7 dvbdev: fix illegal re-usage of fileoperations struct
From: Marcel Siegert <[email protected]>
Date: Tue, 27 Feb 2007 13:09:49 -0500
Subject: [PATCH] dvbdev: fix illegal re-usage of fileoperations struct
Arjan van de Ven <[email protected]> reported an illegal re-usage of the fileoperations struct if more than one dvb device (e.g. frontend) is present.
This patch fixes this issue.
It allocates a new fileoperations struct each time a device is registered and copies the default template fileops.
Signed-off-by Marcel Siegert <[email protected]>
Signed-off-by Mauro Carvalho Chehab <[email protected]>
Signed-off-by Michael Krufky <[email protected]>
(backported from commit b61901024776b25ce7b8edc31bb1757c7382a88e)
--- drivers/media/dvb/dvb-core/dvbdev.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-)
drivers/media/dvb/dvb-core/dvbdev.c +13 -0
@@ -200,6 +200,8 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, const struct dvb_device *template, void *priv, int type) { struct dvb_device *dvbdev; +struct file_operations *dvbdevfops; +int id;if (mutex_lock_interruptible (&dvbdev_register_lock))
@@ -219,12 +221,22 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,return -ENOMEM ; } + dvbdevfops =kzalloc (sizeof (struct file_operations ),GFP_KERNEL ); + +if (!dvbdevfops) { +kfree (dvbdev); +mutex_unlock (&dvbdev_register_lock); +return -ENOMEM ; + } +memcpy (dvbdev, template,sizeof (struct dvb_device )); dvbdev->type = type; dvbdev->id = id; dvbdev->adapter = adap; dvbdev->priv = priv; + dvbdev->fops = dvbdevfops; +memcpy (dvbdev->fops, template->fops,sizeof (struct file_operations )); dvbdev->fops->owner = adap->module;list_add_tail (&dvbdev->list_head, &adap->device_list);
@@ -252,6 +264,7 @@ void dvb_unregister_device(struct dvb_device *dvbdev) dvbdev->type, dvbdev->id)));list_del (&dvbdev->list_head); +kfree (dvbdev->fops);kfree (dvbdev); }EXPORT_SYMBOL (dvb_unregister_device);