| From stable-bounces@linux.kernel.org Sat Mar 3 06:37:14 2007 |
| From: Michael Krufky <mkrufky@linuxtv.org> |
| Date: Sat, 03 Mar 2007 09:35:48 -0500 |
| Subject: dvbdev: fix illegal re-usage of fileoperations struct |
| To: stable@kernel.org |
| Cc: v4l-dvb maintainer list <v4l-dvb-maintainer@linuxtv.org>, Linux Kernel Mailing List <linux-kernel@vger.kernel.org> |
| Message-ID: <45E987C4.8040302@linuxtv.org> |
| |
| From: Marcel Siegert <mws@linuxtv.org> |
| |
| Arjan van de Ven <arjan@infradead.org> 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. |
| |
| (backported from commit b61901024776b25ce7b8edc31bb1757c7382a88e) |
| |
| Signed-off-by: Marcel Siegert <mws@linuxtv.org> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org> |
| Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/media/dvb/dvb-core/dvbdev.c | 13 +++++++++++++ |
| 1 file changed, 13 insertions(+) |
| |
| --- linux-2.6.20.1.orig/drivers/media/dvb/dvb-core/dvbdev.c |
| +++ linux-2.6.20.1/drivers/media/dvb/dvb-core/dvbdev.c |
| @@ -200,6 +200,8 @@ int dvb_register_device(struct dvb_adapt |
| 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_adapt |
| 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_de |
| dvbdev->type, dvbdev->id))); |
| |
| list_del (&dvbdev->list_head); |
| + kfree (dvbdev->fops); |
| kfree (dvbdev); |
| } |
| EXPORT_SYMBOL(dvb_unregister_device); |