A few call_usermodehelper() callers use the hardcoded constant instead of the proper UMH_WAIT_PROC, fix them. Reported-by: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp> Signed-off-by: Oleg Nesterov <oleg@redhat.com> Cc: Lars Ellenberg <drbd-dev@lists.linbit.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Michal Januszewski <spock@gentoo.org> Cc: Florian Tobias Schandinat <FlorianSchandinat@gmx.de> Cc: Kentaro Takeda <takedakn@nttdata.co.jp> Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Cc: James Morris <jmorris@namei.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			109 lines
		
	
	
	
		
			2.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
	
		
			2.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * security/tomoyo/load_policy.c
 | 
						|
 *
 | 
						|
 * Copyright (C) 2005-2011  NTT DATA CORPORATION
 | 
						|
 */
 | 
						|
 | 
						|
#include "common.h"
 | 
						|
 | 
						|
#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);
 | 
						|
 | 
						|
/**
 | 
						|
 * 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;
 | 
						|
	if (!tomoyo_loader)
 | 
						|
		tomoyo_loader = CONFIG_SECURITY_TOMOYO_POLICY_LOADER;
 | 
						|
	if (kern_path(tomoyo_loader, LOOKUP_FOLLOW, &path)) {
 | 
						|
		printk(KERN_INFO "Not activating Mandatory Access Control "
 | 
						|
		       "as %s does not exist.\n", tomoyo_loader);
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
	path_put(&path);
 | 
						|
	return true;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * 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);
 | 
						|
 | 
						|
/**
 | 
						|
 * 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)
 | 
						|
{
 | 
						|
	static bool done;
 | 
						|
	char *argv[2];
 | 
						|
	char *envp[3];
 | 
						|
 | 
						|
	if (tomoyo_policy_loaded || done)
 | 
						|
		return;
 | 
						|
	if (!tomoyo_trigger)
 | 
						|
		tomoyo_trigger = CONFIG_SECURITY_TOMOYO_ACTIVATION_TRIGGER;
 | 
						|
	if (strcmp(filename, tomoyo_trigger))
 | 
						|
		return;
 | 
						|
	if (!tomoyo_policy_loader_exists())
 | 
						|
		return;
 | 
						|
	done = true;
 | 
						|
	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;
 | 
						|
	call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
 | 
						|
	tomoyo_check_profile();
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |