Quoting Dwight Engen (dwight.en...@oracle.com):
> On Mon, 25 Feb 2013 20:26:21 -0800
> ebied...@xmission.com (Eric W. Biederman) wrote:
...
> > For pty's since they only have the single device node.  We can
> > probably do kuid_has_mapping and kgid_has_mapping to see if we should
> > have super user privileges over the pty.  But that is specific to
> > ptys on /dev/pts. Normal devices potentially can have device nodes
> > with different permissions in different places so we can't figure out
> > an owner for the device.
> > 
> > Eric
> > 
> 
> Yeah, I agree we don't want something pty specific. The following patch
> assumes we define a tty as belonging to the user ns of its session
> leader (and if it doesn't have one then to init_user_ns) as you first
> suggested. I added locking which avoids the race with
> disassociate_tty() and ensures the user ns doesn't get unrefed by way of
> put_pid(tty->session).
> 
> Note that I think TIOCVHANGUP should be checking for CAP_SYS_TTY_CONFIG
> instead of CAP_SYS_ADMIN to be consistent with vhangup(2), but I did
> not change that in the refactoring here.
> 
> --
> 
> From 697f842ffc709312e5775e3d1d0782079c3070dc Mon Sep 17 00:00:00 2001
> From: Dwight Engen <dwight.en...@oracle.com>
> Date: Fri, 1 Mar 2013 13:49:58 -0500
> Subject: [PATCH] make vhangup and TIOCVHANGUP namespace aware
> 
> Signed-off-by: Dwight Engen <dwight.en...@oracle.com>

It looks good to me.  Eric?

Acked-by: Serge E. Hallyn <serge.hal...@ubuntu.com>

> ---
>  drivers/tty/tty_io.c | 36 ++++++++++++++++++++++++++++++------
>  fs/open.c            |  6 +-----
>  include/linux/tty.h  |  2 +-
>  3 files changed, 32 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
> index a057db8..764d4e7 100644
> --- a/drivers/tty/tty_io.c
> +++ b/drivers/tty/tty_io.c
> @@ -104,6 +104,7 @@
>  
>  #include <linux/kmod.h>
>  #include <linux/nsproxy.h>
> +#include <linux/pid_namespace.h>
>  
>  #undef TTY_DEBUG_HANGUP
>  
> @@ -722,6 +723,29 @@ void tty_vhangup(struct tty_struct *tty)
>  
>  EXPORT_SYMBOL(tty_vhangup);
>  
> +/**
> + *   tty_vhangup_check_cap   -       process vhangup checking for capablity
> + *
> + *   Perform a vhangup on the given tty
> + */
> +
> +static int tty_vhangup_check_cap(struct tty_struct *tty, int cap)
> +{
> +     unsigned long flags;
> +     int retval = 0;
> +     struct user_namespace *ns = &init_user_ns;
> +
> +     spin_lock_irqsave(&tty->ctrl_lock, flags);
> +     if (tty->session)
> +             ns = ns_of_pid(tty->session)->user_ns;
> +     if (!ns_capable(ns, cap))
> +             retval = -EPERM;
> +     spin_unlock_irqrestore(&tty->ctrl_lock, flags);
> +
> +     if (!retval)
> +             tty_vhangup(tty);
> +     return retval;
> +}
>  
>  /**
>   *   tty_vhangup_self        -       process vhangup for own ctty
> @@ -729,15 +753,18 @@ EXPORT_SYMBOL(tty_vhangup);
>   *   Perform a vhangup on the current controlling tty
>   */
>  
> -void tty_vhangup_self(void)
> +int tty_vhangup_self(void)
>  {
>       struct tty_struct *tty;
> +     int retval = 0;
>  
>       tty = get_current_tty();
>       if (tty) {
> -             tty_vhangup(tty);
> +             retval = tty_vhangup_check_cap(tty, CAP_SYS_TTY_CONFIG);
>               tty_kref_put(tty);
>       }
> +
> +     return retval;
>  }
>  
>  /**
> @@ -2710,10 +2737,7 @@ long tty_ioctl(struct file *file, unsigned int cmd, 
> unsigned long arg)
>       case TIOCSETD:
>               return tiocsetd(tty, p);
>       case TIOCVHANGUP:
> -             if (!capable(CAP_SYS_ADMIN))
> -                     return -EPERM;
> -             tty_vhangup(tty);
> -             return 0;
> +             return tty_vhangup_check_cap(tty, CAP_SYS_ADMIN);
>       case TIOCGDEV:
>       {
>               unsigned int ret = new_encode_dev(tty_devnum(real_tty));
> diff --git a/fs/open.c b/fs/open.c
> index 9b33c0c..19ac16e 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -1059,11 +1059,7 @@ EXPORT_SYMBOL(sys_close);
>   */
>  SYSCALL_DEFINE0(vhangup)
>  {
> -     if (capable(CAP_SYS_TTY_CONFIG)) {
> -             tty_vhangup_self();
> -             return 0;
> -     }
> -     return -EPERM;
> +     return tty_vhangup_self();
>  }
>  
>  /*
> diff --git a/include/linux/tty.h b/include/linux/tty.h
> index 8db1b56..c9d0e9c 100644
> --- a/include/linux/tty.h
> +++ b/include/linux/tty.h
> @@ -379,7 +379,7 @@ 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_locked(struct tty_struct *tty);
> -extern void tty_vhangup_self(void);
> +extern int 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);
> -- 
> 1.7.12.3
> 

------------------------------------------------------------------------------
Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester  
Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the  
endpoint security space. For insight on selecting the right partner to 
tackle endpoint security challenges, access the full report. 
http://p.sf.net/sfu/symantec-dev2dev
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to