Details
[Home]
Issue of the Implementation # L0036
Brief
gigaset: absence of call module_put before restart of if_open()
Detailed Description
if_open() calls try_module_get(), and after an attempt to lock a mutex the if_open() function may return -ERESTARTSYS without putting the module. Then, when if_open() is executed again, try_module_get() is called making the reference counter of THIS_MODULE greater than one at successful exit from if_open(). The if_close() function puts the module only once, and as a result it can't be unloaded.
Possible solutions
diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c index 59de638..e35058b 100644 --- a/drivers/isdn/gigaset/interface.c +++ b/drivers/isdn/gigaset/interface.c @@ -156,8 +156,10 @@ static int if_open(struct tty_struct *tty, struct file *filp) if (!cs || !try_module_get(cs->driver->owner)) return -ENODEV; - if (mutex_lock_interruptible(&cs->mutex)) + if (mutex_lock_interruptible(&cs->mutex)) { + module_put(cs->driver->owner); return -ERESTARTSYS; + } tty->driver_data = cs; ++cs->open_count;
Component
linux-kernel 2.6.39
References
https://lkml.org/lkml/2011/6/17/321
Accepted
https://lkml.org/lkml/2011/6/17/321 commit 2f9381e
Status
Fixed in kernel 3.0-rc4
[Home]
»