2006-10-11 12:20:50 +04:00
/*
2006-10-11 12:20:53 +04:00
* linux / fs / ext4 / xattr_security . c
2006-10-11 12:20:50 +04:00
* Handler for storing security labels as extended attributes .
*/
# include <linux/module.h>
# include <linux/string.h>
# include <linux/fs.h>
# include <linux/security.h>
2008-04-30 02:13:32 +04:00
# include "ext4_jbd2.h"
# include "ext4.h"
2006-10-11 12:20:50 +04:00
# include "xattr.h"
static size_t
2006-10-11 12:20:53 +04:00
ext4_xattr_security_list ( struct inode * inode , char * list , size_t list_size ,
2006-10-11 12:20:50 +04:00
const char * name , size_t name_len )
{
const size_t prefix_len = sizeof ( XATTR_SECURITY_PREFIX ) - 1 ;
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
2006-10-11 12:20:53 +04:00
ext4_xattr_security_get ( struct inode * inode , const char * name ,
2006-10-11 12:20:50 +04:00
void * buffer , size_t size )
{
if ( strcmp ( name , " " ) = = 0 )
return - EINVAL ;
2006-10-11 12:20:53 +04:00
return ext4_xattr_get ( inode , EXT4_XATTR_INDEX_SECURITY , name ,
2006-10-11 12:20:50 +04:00
buffer , size ) ;
}
static int
2006-10-11 12:20:53 +04:00
ext4_xattr_security_set ( struct inode * inode , const char * name ,
2006-10-11 12:20:50 +04:00
const void * value , size_t size , int flags )
{
if ( strcmp ( name , " " ) = = 0 )
return - EINVAL ;
2006-10-11 12:20:53 +04:00
return ext4_xattr_set ( inode , EXT4_XATTR_INDEX_SECURITY , name ,
2006-10-11 12:20:50 +04:00
value , size , flags ) ;
}
int
2006-10-11 12:20:53 +04:00
ext4_init_security ( handle_t * handle , struct inode * inode , struct inode * dir )
2006-10-11 12:20:50 +04:00
{
int err ;
size_t len ;
void * value ;
char * name ;
err = security_inode_init_security ( inode , dir , & name , & value , & len ) ;
if ( err ) {
if ( err = = - EOPNOTSUPP )
return 0 ;
return err ;
}
2006-10-11 12:20:53 +04:00
err = ext4_xattr_set_handle ( handle , inode , EXT4_XATTR_INDEX_SECURITY ,
2006-10-11 12:20:50 +04:00
name , value , len , 0 ) ;
kfree ( name ) ;
kfree ( value ) ;
return err ;
}
2006-10-11 12:20:53 +04:00
struct xattr_handler ext4_xattr_security_handler = {
2006-10-11 12:20:50 +04:00
. prefix = XATTR_SECURITY_PREFIX ,
2006-10-11 12:20:53 +04:00
. list = ext4_xattr_security_list ,
. get = ext4_xattr_security_get ,
. set = ext4_xattr_security_set ,
2006-10-11 12:20:50 +04:00
} ;