lkml.org 
[lkml]   [2008]   [Oct]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 48/80] tty: the vhangup syscall is racy
    Date
    From: Alan Cox <alan@redhat.com>

    We now have the infrastructure to sort this out but rather than teaching
    the syscall tty lock rules we move the hard work into a tty helper

    Signed-off-by: Alan Cox <alan@redhat.com>
    ---

    drivers/char/tty_io.c | 19 +++++++++++++++++++
    fs/open.c | 3 +--
    include/linux/tty.h | 1 +
    3 files changed, 21 insertions(+), 2 deletions(-)


    diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
    index 913b502..b5f57d0 100644
    --- a/drivers/char/tty_io.c
    +++ b/drivers/char/tty_io.c
    @@ -730,6 +730,25 @@ void tty_vhangup(struct tty_struct *tty)
    EXPORT_SYMBOL(tty_vhangup);

    /**
    + * tty_vhangup_self - process vhangup for own ctty
    + *
    + * Perform a vhangup on the current controlling tty
    + */
    +
    +void tty_vhangup_self(void)
    +{
    + struct tty_struct *tty;
    +
    + mutex_lock(&tty_mutex);
    + tty = get_current_tty();
    + if (tty) {
    + tty_vhangup(tty);
    + tty_kref_put(tty);
    + }
    + mutex_unlock(&tty_mutex);
    +}
    +
    +/**
    * tty_hung_up_p - was tty hung up
    * @filp: file pointer of tty
    *
    diff --git a/fs/open.c b/fs/open.c
    index 07da935..5596049 100644
    --- a/fs/open.c
    +++ b/fs/open.c
    @@ -1141,8 +1141,7 @@ EXPORT_SYMBOL(sys_close);
    asmlinkage long sys_vhangup(void)
    {
    if (capable(CAP_SYS_TTY_CONFIG)) {
    - /* XXX: this needs locking */
    - tty_vhangup(current->signal->tty);
    + tty_vhangup_self();
    return 0;
    }
    return -EPERM;
    diff --git a/include/linux/tty.h b/include/linux/tty.h
    index c30ed8d..e00393a 100644
    --- a/include/linux/tty.h
    +++ b/include/linux/tty.h
    @@ -361,6 +361,7 @@ extern int is_ignored(int sig);
    extern int tty_signal(int sig, struct tty_struct *tty);
    extern void tty_hangup(struct tty_struct *tty);
    extern void tty_vhangup(struct tty_struct *tty);
    +extern void tty_vhangup_self(void);
    extern void tty_unhangup(struct file *filp);
    extern int tty_hung_up_p(struct file *filp);
    extern void do_SAK(struct tty_struct *tty);


    \
     
     \ /
      Last update: 2008-10-13 11:55    [W:4.085 / U:0.236 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site