lkml.org 
[lkml]   [2007]   [Mar]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 046/101] dvbdev: fix illegal re-usage of fileoperations struct
    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);
    --
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-03-07 18:47    [W:4.051 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site