Currently vt_bind and vt_unbind access at least the con_driver object
and registered_con_driver array without holding the console lock. Fix
this by locking around the whole function in each case.

Signed-off-by: Imre Deak <imre.d...@intel.com>
Reviewed-by: Peter Hurley <pe...@hurleysoftware.com>
---
 drivers/tty/vt/vt.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 9c046fb..5d36c23 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -3318,11 +3318,8 @@ static int vt_bind(struct con_driver *con)
                if (first == 0 && last == MAX_NR_CONSOLES -1)
                        deflt = 1;
 
-               if (first != -1) {
-                       console_lock();
+               if (first != -1)
                        do_bind_con_driver(csw, first, last, deflt);
-                       console_unlock();
-               }
 
                first = -1;
                last = -1;
@@ -3362,9 +3359,7 @@ static int vt_unbind(struct con_driver *con)
                        deflt = 1;
 
                if (first != -1) {
-                       console_lock();
                        ret = do_unbind_con_driver(csw, first, last, deflt);
-                       console_unlock();
                        if (ret != 0)
                                return ret;
                }
@@ -3394,11 +3389,15 @@ static ssize_t store_bind(struct device *dev, struct 
device_attribute *attr,
        struct con_driver *con = dev_get_drvdata(dev);
        int bind = simple_strtoul(buf, NULL, 0);
 
+       console_lock();
+
        if (bind)
                vt_bind(con);
        else
                vt_unbind(con);
 
+       console_unlock();
+
        return count;
 }
 
-- 
1.8.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to