| From 4b70dd57a15d2f4685ac6e38056bad93e81e982f Mon Sep 17 00:00:00 2001 |
| From: Jiri Slaby <jslaby@suse.cz> |
| Date: Fri, 28 Feb 2020 12:54:05 +0100 |
| Subject: vt: selection, push console lock down |
| |
| From: Jiri Slaby <jslaby@suse.cz> |
| |
| commit 4b70dd57a15d2f4685ac6e38056bad93e81e982f upstream. |
| |
| We need to nest the console lock in sel_lock, so we have to push it down |
| a bit. Fortunately, the callers of set_selection_* just lock the console |
| lock around the function call. So moving it down is easy. |
| |
| In the next patch, we switch the order. |
| |
| Signed-off-by: Jiri Slaby <jslaby@suse.cz> |
| Fixes: 07e6124a1a46 ("vt: selection, close sel_buffer race") |
| Cc: stable <stable@vger.kernel.org> |
| Link: https://lore.kernel.org/r/20200228115406.5735-1-jslaby@suse.cz |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/staging/speakup/selection.c | 2 -- |
| drivers/tty/vt/selection.c | 13 ++++++++++++- |
| drivers/tty/vt/vt.c | 2 -- |
| 3 files changed, 12 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/staging/speakup/selection.c |
| +++ b/drivers/staging/speakup/selection.c |
| @@ -51,9 +51,7 @@ static void __speakup_set_selection(stru |
| goto unref; |
| } |
| |
| - console_lock(); |
| set_selection_kernel(&sel, tty); |
| - console_unlock(); |
| |
| unref: |
| tty_kref_put(tty); |
| --- a/drivers/tty/vt/selection.c |
| +++ b/drivers/tty/vt/selection.c |
| @@ -181,7 +181,7 @@ int set_selection_user(const struct tioc |
| return set_selection_kernel(&v, tty); |
| } |
| |
| -int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty) |
| +static int __set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty) |
| { |
| struct vc_data *vc = vc_cons[fg_console].d; |
| int new_sel_start, new_sel_end, spc; |
| @@ -343,6 +343,17 @@ unlock: |
| mutex_unlock(&sel_lock); |
| return ret; |
| } |
| + |
| +int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty) |
| +{ |
| + int ret; |
| + |
| + console_lock(); |
| + ret = __set_selection_kernel(v, tty); |
| + console_unlock(); |
| + |
| + return ret; |
| +} |
| EXPORT_SYMBOL_GPL(set_selection_kernel); |
| |
| /* Insert the contents of the selection buffer into the |
| --- a/drivers/tty/vt/vt.c |
| +++ b/drivers/tty/vt/vt.c |
| @@ -3046,10 +3046,8 @@ int tioclinux(struct tty_struct *tty, un |
| switch (type) |
| { |
| case TIOCL_SETSEL: |
| - console_lock(); |
| ret = set_selection_user((struct tiocl_selection |
| __user *)(p+1), tty); |
| - console_unlock(); |
| break; |
| case TIOCL_PASTESEL: |
| ret = paste_selection(tty); |