2010-05-17 10:12:46 +09:00
/*
* security / tomoyo / load_policy . c
*
2011-07-14 14:46:51 +09:00
* Copyright ( C ) 2005 - 2011 NTT DATA CORPORATION
2010-05-17 10:12:46 +09:00
*/
# include "common.h"
2011-06-26 23:22:59 +09:00
# ifndef CONFIG_SECURITY_TOMOYO_OMIT_USERSPACE_LOADER
/*
* Path to the policy loader . ( default = CONFIG_SECURITY_TOMOYO_POLICY_LOADER )
*/
static const char * tomoyo_loader ;
/**
* tomoyo_loader_setup - Set policy loader .
*
* @ str : Program to use as a policy loader ( e . g . / sbin / tomoyo - init ) .
*
* Returns 0.
*/
static int __init tomoyo_loader_setup ( char * str )
{
tomoyo_loader = str ;
return 0 ;
}
__setup ( " TOMOYO_loader= " , tomoyo_loader_setup ) ;
2010-05-17 10:12:46 +09:00
/**
* tomoyo_policy_loader_exists - Check whether / sbin / tomoyo - init exists .
*
* Returns true if / sbin / tomoyo - init exists , false otherwise .
*/
static bool tomoyo_policy_loader_exists ( void )
{
struct path path ;
2011-06-26 23:22:59 +09:00
if ( ! tomoyo_loader )
tomoyo_loader = CONFIG_SECURITY_TOMOYO_POLICY_LOADER ;
2010-05-17 10:12:46 +09:00
if ( kern_path ( tomoyo_loader , LOOKUP_FOLLOW , & path ) ) {
2011-06-26 23:22:59 +09:00
printk ( KERN_INFO " Not activating Mandatory Access Control "
" as %s does not exist. \n " , tomoyo_loader ) ;
2010-05-17 10:12:46 +09:00
return false ;
}
path_put ( & path ) ;
return true ;
}
2011-06-26 23:22:59 +09:00
/*
* Path to the trigger . ( default = CONFIG_SECURITY_TOMOYO_ACTIVATION_TRIGGER )
*/
static const char * tomoyo_trigger ;
/**
* tomoyo_trigger_setup - Set trigger for activation .
*
* @ str : Program to use as an activation trigger ( e . g . / sbin / init ) .
*
* Returns 0.
*/
static int __init tomoyo_trigger_setup ( char * str )
{
tomoyo_trigger = str ;
return 0 ;
}
__setup ( " TOMOYO_trigger= " , tomoyo_trigger_setup ) ;
2010-05-17 10:12:46 +09:00
/**
* tomoyo_load_policy - Run external policy loader to load policy .
*
* @ filename : The program about to start .
*
* This function checks whether @ filename is / sbin / init , and if so
* invoke / sbin / tomoyo - init and wait for the termination of / sbin / tomoyo - init
* and then continues invocation of / sbin / init .
* / sbin / tomoyo - init reads policy files in / etc / tomoyo / directory and
* writes to / sys / kernel / security / tomoyo / interfaces .
*
* Returns nothing .
*/
void tomoyo_load_policy ( const char * filename )
{
2011-06-26 23:22:59 +09:00
static bool done ;
2010-05-17 10:12:46 +09:00
char * argv [ 2 ] ;
char * envp [ 3 ] ;
2011-06-26 23:22:59 +09:00
if ( tomoyo_policy_loaded | | done )
2010-05-17 10:12:46 +09:00
return ;
2011-06-26 23:22:59 +09:00
if ( ! tomoyo_trigger )
tomoyo_trigger = CONFIG_SECURITY_TOMOYO_ACTIVATION_TRIGGER ;
if ( strcmp ( filename , tomoyo_trigger ) )
2010-05-17 10:12:46 +09:00
return ;
if ( ! tomoyo_policy_loader_exists ( ) )
return ;
2011-06-26 23:22:59 +09:00
done = true ;
2010-05-17 10:12:46 +09:00
printk ( KERN_INFO " Calling %s to load policy. Please wait. \n " ,
tomoyo_loader ) ;
argv [ 0 ] = ( char * ) tomoyo_loader ;
argv [ 1 ] = NULL ;
envp [ 0 ] = " HOME=/ " ;
envp [ 1 ] = " PATH=/sbin:/bin:/usr/sbin:/usr/bin " ;
envp [ 2 ] = NULL ;
2012-03-23 15:02:46 -07:00
call_usermodehelper ( argv [ 0 ] , argv , envp , UMH_WAIT_PROC ) ;
2010-05-17 10:12:46 +09:00
tomoyo_check_profile ( ) ;
}
2011-06-26 23:22:59 +09:00
# endif