Merge tag 'block-5.11-2021-01-16' of git://git.kernel.dk/linux-block
[linux/fpc-iii.git] / security / tomoyo / load_policy.c
blob3445ae6fd4794eaf430384ec63622004bc93f8fb
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * security/tomoyo/load_policy.c
5 * Copyright (C) 2005-2011 NTT DATA CORPORATION
6 */
8 #include "common.h"
10 #ifndef CONFIG_SECURITY_TOMOYO_OMIT_USERSPACE_LOADER
13 * Path to the policy loader. (default = CONFIG_SECURITY_TOMOYO_POLICY_LOADER)
15 static const char *tomoyo_loader;
17 /**
18 * tomoyo_loader_setup - Set policy loader.
20 * @str: Program to use as a policy loader (e.g. /sbin/tomoyo-init ).
22 * Returns 0.
24 static int __init tomoyo_loader_setup(char *str)
26 tomoyo_loader = str;
27 return 0;
30 __setup("TOMOYO_loader=", tomoyo_loader_setup);
32 /**
33 * tomoyo_policy_loader_exists - Check whether /sbin/tomoyo-init exists.
35 * Returns true if /sbin/tomoyo-init exists, false otherwise.
37 static bool tomoyo_policy_loader_exists(void)
39 struct path path;
41 if (!tomoyo_loader)
42 tomoyo_loader = CONFIG_SECURITY_TOMOYO_POLICY_LOADER;
43 if (kern_path(tomoyo_loader, LOOKUP_FOLLOW, &path)) {
44 pr_info("Not activating Mandatory Access Control as %s does not exist.\n",
45 tomoyo_loader);
46 return false;
48 path_put(&path);
49 return true;
53 * Path to the trigger. (default = CONFIG_SECURITY_TOMOYO_ACTIVATION_TRIGGER)
55 static const char *tomoyo_trigger;
57 /**
58 * tomoyo_trigger_setup - Set trigger for activation.
60 * @str: Program to use as an activation trigger (e.g. /sbin/init ).
62 * Returns 0.
64 static int __init tomoyo_trigger_setup(char *str)
66 tomoyo_trigger = str;
67 return 0;
70 __setup("TOMOYO_trigger=", tomoyo_trigger_setup);
72 /**
73 * tomoyo_load_policy - Run external policy loader to load policy.
75 * @filename: The program about to start.
77 * This function checks whether @filename is /sbin/init , and if so
78 * invoke /sbin/tomoyo-init and wait for the termination of /sbin/tomoyo-init
79 * and then continues invocation of /sbin/init.
80 * /sbin/tomoyo-init reads policy files in /etc/tomoyo/ directory and
81 * writes to /sys/kernel/security/tomoyo/ interfaces.
83 * Returns nothing.
85 void tomoyo_load_policy(const char *filename)
87 static bool done;
88 char *argv[2];
89 char *envp[3];
91 if (tomoyo_policy_loaded || done)
92 return;
93 if (!tomoyo_trigger)
94 tomoyo_trigger = CONFIG_SECURITY_TOMOYO_ACTIVATION_TRIGGER;
95 if (strcmp(filename, tomoyo_trigger))
96 return;
97 if (!tomoyo_policy_loader_exists())
98 return;
99 done = true;
100 pr_info("Calling %s to load policy. Please wait.\n", tomoyo_loader);
101 argv[0] = (char *) tomoyo_loader;
102 argv[1] = NULL;
103 envp[0] = "HOME=/";
104 envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
105 envp[2] = NULL;
106 call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
107 tomoyo_check_profile();
110 #endif