aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJanne Karhunen <janne.karhunen@gmail.com>2019-06-14 08:20:14 -0400
committerMimi Zohar <zohar@linux.ibm.com>2019-06-14 09:02:42 -0400
commit42df744c4166af6959eda2df1ee5cde744d4a1c3 (patch)
tree0596cb76c814d03ee71a967fe3bd48b50ca42eb1
parent9e1e5d4372d641d3cd6d6cb8dc0b488a7850d222 (diff)
LSM: switch to blocking policy update notifiers
Atomic policy updaters are not very useful as they cannot usually perform the policy updates on their own. Since it seems that there is no strict need for the atomicity, switch to the blocking variant. While doing so, rename the functions accordingly. Signed-off-by: Janne Karhunen <janne.karhunen@gmail.com> Acked-by: Paul Moore <paul@paul-moore.com> Acked-by: James Morris <jamorris@linux.microsoft.com> Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
-rw-r--r--drivers/infiniband/core/device.c6
-rw-r--r--include/linux/security.h12
-rw-r--r--security/security.c23
-rw-r--r--security/selinux/hooks.c2
-rw-r--r--security/selinux/selinuxfs.c2
5 files changed, 24 insertions, 21 deletions
diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c
index 78dc07c6ac4b..61c0c93a2e73 100644
--- a/drivers/infiniband/core/device.c
+++ b/drivers/infiniband/core/device.c
@@ -2499,7 +2499,7 @@ static int __init ib_core_init(void)
2499 goto err_mad; 2499 goto err_mad;
2500 } 2500 }
2501 2501
2502 ret = register_lsm_notifier(&ibdev_lsm_nb); 2502 ret = register_blocking_lsm_notifier(&ibdev_lsm_nb);
2503 if (ret) { 2503 if (ret) {
2504 pr_warn("Couldn't register LSM notifier. ret %d\n", ret); 2504 pr_warn("Couldn't register LSM notifier. ret %d\n", ret);
2505 goto err_sa; 2505 goto err_sa;
@@ -2518,7 +2518,7 @@ static int __init ib_core_init(void)
2518 return 0; 2518 return 0;
2519 2519
2520err_compat: 2520err_compat:
2521 unregister_lsm_notifier(&ibdev_lsm_nb); 2521 unregister_blocking_lsm_notifier(&ibdev_lsm_nb);
2522err_sa: 2522err_sa:
2523 ib_sa_cleanup(); 2523 ib_sa_cleanup();
2524err_mad: 2524err_mad:
@@ -2544,7 +2544,7 @@ static void __exit ib_core_cleanup(void)
2544 nldev_exit(); 2544 nldev_exit();
2545 rdma_nl_unregister(RDMA_NL_LS); 2545 rdma_nl_unregister(RDMA_NL_LS);
2546 unregister_pernet_device(&rdma_dev_net_ops); 2546 unregister_pernet_device(&rdma_dev_net_ops);
2547 unregister_lsm_notifier(&ibdev_lsm_nb); 2547 unregister_blocking_lsm_notifier(&ibdev_lsm_nb);
2548 ib_sa_cleanup(); 2548 ib_sa_cleanup();
2549 ib_mad_cleanup(); 2549 ib_mad_cleanup();
2550 addr_cleanup(); 2550 addr_cleanup();
diff --git a/include/linux/security.h b/include/linux/security.h
index 659071c2e57c..5f7441abbf42 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -189,9 +189,9 @@ static inline const char *kernel_load_data_id_str(enum kernel_load_data_id id)
189 189
190#ifdef CONFIG_SECURITY 190#ifdef CONFIG_SECURITY
191 191
192int call_lsm_notifier(enum lsm_event event, void *data); 192int call_blocking_lsm_notifier(enum lsm_event event, void *data);
193int register_lsm_notifier(struct notifier_block *nb); 193int register_blocking_lsm_notifier(struct notifier_block *nb);
194int unregister_lsm_notifier(struct notifier_block *nb); 194int unregister_blocking_lsm_notifier(struct notifier_block *nb);
195 195
196/* prototypes */ 196/* prototypes */
197extern int security_init(void); 197extern int security_init(void);
@@ -394,17 +394,17 @@ int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen);
394int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen); 394int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen);
395#else /* CONFIG_SECURITY */ 395#else /* CONFIG_SECURITY */
396 396
397static inline int call_lsm_notifier(enum lsm_event event, void *data) 397static inline int call_blocking_lsm_notifier(enum lsm_event event, void *data)
398{ 398{
399 return 0; 399 return 0;
400} 400}
401 401
402static inline int register_lsm_notifier(struct notifier_block *nb) 402static inline int register_blocking_lsm_notifier(struct notifier_block *nb)
403{ 403{
404 return 0; 404 return 0;
405} 405}
406 406
407static inline int unregister_lsm_notifier(struct notifier_block *nb) 407static inline int unregister_blocking_lsm_notifier(struct notifier_block *nb)
408{ 408{
409 return 0; 409 return 0;
410} 410}
diff --git a/security/security.c b/security/security.c
index 613a5c00e602..47e5849d7557 100644
--- a/security/security.c
+++ b/security/security.c
@@ -39,7 +39,7 @@
39#define LSM_COUNT (__end_lsm_info - __start_lsm_info) 39#define LSM_COUNT (__end_lsm_info - __start_lsm_info)
40 40
41struct security_hook_heads security_hook_heads __lsm_ro_after_init; 41struct security_hook_heads security_hook_heads __lsm_ro_after_init;
42static ATOMIC_NOTIFIER_HEAD(lsm_notifier_chain); 42static BLOCKING_NOTIFIER_HEAD(blocking_lsm_notifier_chain);
43 43
44static struct kmem_cache *lsm_file_cache; 44static struct kmem_cache *lsm_file_cache;
45static struct kmem_cache *lsm_inode_cache; 45static struct kmem_cache *lsm_inode_cache;
@@ -430,23 +430,26 @@ void __init security_add_hooks(struct security_hook_list *hooks, int count,
430 panic("%s - Cannot get early memory.\n", __func__); 430 panic("%s - Cannot get early memory.\n", __func__);
431} 431}
432 432
433int call_lsm_notifier(enum lsm_event event, void *data) 433int call_blocking_lsm_notifier(enum lsm_event event, void *data)
434{ 434{
435 return atomic_notifier_call_chain(&lsm_notifier_chain, event, data); 435 return blocking_notifier_call_chain(&blocking_lsm_notifier_chain,
436 event, data);
436} 437}
437EXPORT_SYMBOL(call_lsm_notifier); 438EXPORT_SYMBOL(call_blocking_lsm_notifier);
438 439
439int register_lsm_notifier(struct notifier_block *nb) 440int register_blocking_lsm_notifier(struct notifier_block *nb)
440{ 441{
441 return atomic_notifier_chain_register(&lsm_notifier_chain, nb); 442 return blocking_notifier_chain_register(&blocking_lsm_notifier_chain,
443 nb);
442} 444}
443EXPORT_SYMBOL(register_lsm_notifier); 445EXPORT_SYMBOL(register_blocking_lsm_notifier);
444 446
445int unregister_lsm_notifier(struct notifier_block *nb) 447int unregister_blocking_lsm_notifier(struct notifier_block *nb)
446{ 448{
447 return atomic_notifier_chain_unregister(&lsm_notifier_chain, nb); 449 return blocking_notifier_chain_unregister(&blocking_lsm_notifier_chain,
450 nb);
448} 451}
449EXPORT_SYMBOL(unregister_lsm_notifier); 452EXPORT_SYMBOL(unregister_blocking_lsm_notifier);
450 453
451/** 454/**
452 * lsm_cred_alloc - allocate a composite cred blob 455 * lsm_cred_alloc - allocate a composite cred blob
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index c61787b15f27..c1e37018c8eb 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -197,7 +197,7 @@ static int selinux_lsm_notifier_avc_callback(u32 event)
197{ 197{
198 if (event == AVC_CALLBACK_RESET) { 198 if (event == AVC_CALLBACK_RESET) {
199 sel_ib_pkey_flush(); 199 sel_ib_pkey_flush();
200 call_lsm_notifier(LSM_POLICY_CHANGE, NULL); 200 call_blocking_lsm_notifier(LSM_POLICY_CHANGE, NULL);
201 } 201 }
202 202
203 return 0; 203 return 0;
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c
index 145ee62f205a..1e2e3e4b5fdb 100644
--- a/security/selinux/selinuxfs.c
+++ b/security/selinux/selinuxfs.c
@@ -180,7 +180,7 @@ static ssize_t sel_write_enforce(struct file *file, const char __user *buf,
180 selnl_notify_setenforce(new_value); 180 selnl_notify_setenforce(new_value);
181 selinux_status_update_setenforce(state, new_value); 181 selinux_status_update_setenforce(state, new_value);
182 if (!new_value) 182 if (!new_value)
183 call_lsm_notifier(LSM_POLICY_CHANGE, NULL); 183 call_blocking_lsm_notifier(LSM_POLICY_CHANGE, NULL);
184 } 184 }
185 length = count; 185 length = count;
186out: 186out: