2005-04-17 02:20:36 +04:00
/*
* linux / fs / ext3 / xattr_security . c
* Handler for storing security labels as extended attributes .
*/
2005-09-10 00:01:41 +04:00
# include <linux/security.h>
2012-03-30 06:30:07 +04:00
# include "ext3.h"
2005-04-17 02:20:36 +04:00
# include "xattr.h"
static size_t
2009-11-13 12:52:56 +03:00
ext3_xattr_security_list ( struct dentry * dentry , char * list , size_t list_size ,
const char * name , size_t name_len , int type )
2005-04-17 02:20:36 +04:00
{
2008-07-25 12:46:23 +04:00
const size_t prefix_len = XATTR_SECURITY_PREFIX_LEN ;
2005-04-17 02:20:36 +04:00
const size_t total_len = prefix_len + name_len + 1 ;
if ( list & & total_len < = list_size ) {
memcpy ( list , XATTR_SECURITY_PREFIX , prefix_len ) ;
memcpy ( list + prefix_len , name , name_len ) ;
list [ prefix_len + name_len ] = ' \0 ' ;
}
return total_len ;
}
static int
2009-11-13 12:52:56 +03:00
ext3_xattr_security_get ( struct dentry * dentry , const char * name ,
void * buffer , size_t size , int type )
2005-04-17 02:20:36 +04:00
{
if ( strcmp ( name , " " ) = = 0 )
return - EINVAL ;
2009-11-13 12:52:56 +03:00
return ext3_xattr_get ( dentry - > d_inode , EXT3_XATTR_INDEX_SECURITY ,
name , buffer , size ) ;
2005-04-17 02:20:36 +04:00
}
static int
2009-11-13 12:52:56 +03:00
ext3_xattr_security_set ( struct dentry * dentry , const char * name ,
const void * value , size_t size , int flags , int type )
2005-04-17 02:20:36 +04:00
{
if ( strcmp ( name , " " ) = = 0 )
return - EINVAL ;
2009-11-13 12:52:56 +03:00
return ext3_xattr_set ( dentry - > d_inode , EXT3_XATTR_INDEX_SECURITY ,
name , value , size , flags ) ;
2005-04-17 02:20:36 +04:00
}
2011-06-06 23:29:25 +04:00
int ext3_initxattrs ( struct inode * inode , const struct xattr * xattr_array ,
void * fs_info )
2005-09-10 00:01:41 +04:00
{
2011-06-06 23:29:25 +04:00
const struct xattr * xattr ;
handle_t * handle = fs_info ;
int err = 0 ;
2005-09-10 00:01:41 +04:00
2011-06-06 23:29:25 +04:00
for ( xattr = xattr_array ; xattr - > name ! = NULL ; xattr + + ) {
err = ext3_xattr_set_handle ( handle , inode ,
EXT3_XATTR_INDEX_SECURITY ,
xattr - > name , xattr - > value ,
xattr - > value_len , 0 ) ;
if ( err < 0 )
break ;
2005-09-10 00:01:41 +04:00
}
return err ;
}
2011-06-06 23:29:25 +04:00
int
ext3_init_security ( handle_t * handle , struct inode * inode , struct inode * dir ,
const struct qstr * qstr )
{
return security_inode_init_security ( inode , dir , qstr ,
& ext3_initxattrs , handle ) ;
}
2010-05-14 04:53:17 +04:00
const struct xattr_handler ext3_xattr_security_handler = {
2005-04-17 02:20:36 +04:00
. prefix = XATTR_SECURITY_PREFIX ,
. list = ext3_xattr_security_list ,
. get = ext3_xattr_security_get ,
. set = ext3_xattr_security_set ,
} ;