Re: [patch] selinux: simplify ioctl checking

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 5 Jun 2008, Stephen Smalley wrote:

> Simplify and improve the robustness of the SELinux ioctl checking by 
> using the "access mode" bits of the ioctl command to determine the 
> permission check rather than dealing with individual command values.
> This removes any knowledge of specific ioctl commands from SELinux
> and follows the same guidance we gave to Smack earlier.
> 
> Signed-off-by:  Stephen Smalley <sds@xxxxxxxxxxxxx>

Applied.


> 
> ---
> 
>  security/selinux/hooks.c |   48 +++++++----------------------------------------
>  1 file changed, 8 insertions(+), 40 deletions(-)
> 
> diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
> index 91b666a..f530008 100644
> --- a/security/selinux/hooks.c
> +++ b/security/selinux/hooks.c
> @@ -42,9 +42,7 @@
>  #include <linux/fdtable.h>
>  #include <linux/namei.h>
>  #include <linux/mount.h>
> -#include <linux/ext2_fs.h>
>  #include <linux/proc_fs.h>
> -#include <linux/kd.h>
>  #include <linux/netfilter_ipv4.h>
>  #include <linux/netfilter_ipv6.h>
>  #include <linux/tty.h>
> @@ -2903,46 +2901,16 @@ static void selinux_file_free_security(struct file *file)
>  static int selinux_file_ioctl(struct file *file, unsigned int cmd,
>  			      unsigned long arg)
>  {
> -	int error = 0;
> -
> -	switch (cmd) {
> -	case FIONREAD:
> -	/* fall through */
> -	case FIBMAP:
> -	/* fall through */
> -	case FIGETBSZ:
> -	/* fall through */
> -	case EXT2_IOC_GETFLAGS:
> -	/* fall through */
> -	case EXT2_IOC_GETVERSION:
> -		error = file_has_perm(current, file, FILE__GETATTR);
> -		break;
> -
> -	case EXT2_IOC_SETFLAGS:
> -	/* fall through */
> -	case EXT2_IOC_SETVERSION:
> -		error = file_has_perm(current, file, FILE__SETATTR);
> -		break;
> -
> -	/* sys_ioctl() checks */
> -	case FIONBIO:
> -	/* fall through */
> -	case FIOASYNC:
> -		error = file_has_perm(current, file, 0);
> -		break;
> +	u32 av = 0;
>  
> -	case KDSKBENT:
> -	case KDSKBSENT:
> -		error = task_has_capability(current, CAP_SYS_TTY_CONFIG);
> -		break;
> +	if (_IOC_DIR(cmd) & _IOC_WRITE)
> +		av |= FILE__WRITE;
> +	if (_IOC_DIR(cmd) & _IOC_READ)
> +		av |= FILE__READ;
> +	if (!av)
> +		av = FILE__IOCTL;
>  
> -	/* default case assumes that the command will go
> -	 * to the file's ioctl() function.
> -	 */
> -	default:
> -		error = file_has_perm(current, file, FILE__IOCTL);
> -	}
> -	return error;
> +	return file_has_perm(current, file, av);
>  }
>  
>  static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
> 
> 

-- 
James Morris
<jmorris@xxxxxxxxx>

--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
the words "unsubscribe selinux" without quotes as the message.

[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux