提交 2f9381e9 编写于 作者: P Pavel Shved 提交者: David S. Miller

gigaset: call module_put before restart of if_open()

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.

This patch adds module_put call before the return from if_open().

Found by Linux Driver Verification project (linuxtesting.org).
Signed-off-by: NPavel Shved <shved@ispras.ru>
Signed-off-by: NDavid S. Miller <davem@conan.davemloft.net>
上级 d0fd64c1
...@@ -156,8 +156,10 @@ static int if_open(struct tty_struct *tty, struct file *filp) ...@@ -156,8 +156,10 @@ static int if_open(struct tty_struct *tty, struct file *filp)
if (!cs || !try_module_get(cs->driver->owner)) if (!cs || !try_module_get(cs->driver->owner))
return -ENODEV; return -ENODEV;
if (mutex_lock_interruptible(&cs->mutex)) if (mutex_lock_interruptible(&cs->mutex)) {
module_put(cs->driver->owner);
return -ERESTARTSYS; return -ERESTARTSYS;
}
tty->driver_data = cs; tty->driver_data = cs;
++cs->open_count; ++cs->open_count;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册