@@ -30,13 +30,6 @@ static __initdata const char *lsm_order_legacy;
3030static __initdata struct lsm_info * lsm_order [MAX_LSM_COUNT + 1 ];
3131static __initdata struct lsm_info * lsm_exclusive ;
3232
33- static __initdata bool debug ;
34- #define init_debug (...) \
35- do { \
36- if (debug) \
37- pr_info(__VA_ARGS__); \
38- } while (0)
39-
4033#define lsm_order_for_each (iter ) \
4134 for ((iter) = lsm_order; *(iter); (iter)++)
4235#define lsm_for_each_raw (iter ) \
@@ -77,7 +70,7 @@ __setup("lsm=", lsm_choose_lsm);
7770 */
7871static int __init lsm_debug_enable (char * str )
7972{
80- debug = true;
73+ lsm_debug = true;
8174 return 1 ;
8275}
8376__setup ("lsm.debug" , lsm_debug_enable );
@@ -143,22 +136,28 @@ static void __init lsm_order_append(struct lsm_info *lsm, const char *src)
143136 return ;
144137
145138 /* Skip explicitly disabled LSMs. */
146- if (lsm -> enabled && !lsm_is_enabled (lsm ))
147- goto out ;
139+ if (lsm -> enabled && !lsm_is_enabled (lsm )) {
140+ lsm_pr_dbg ("skip previously disabled LSM %s:%s\n" ,
141+ src , lsm -> id -> name );
142+ return ;
143+ }
148144
149- if (WARN (lsm_active_cnt == MAX_LSM_COUNT ,
150- "%s: out of LSM static calls!?\n" , src )) {
145+ if (lsm_active_cnt == MAX_LSM_COUNT ) {
146+ pr_warn ("exceeded maximum LSM count on %s:%s\n" ,
147+ src , lsm -> id -> name );
151148 lsm_enabled_set (lsm , false);
152- goto out ;
149+ return ;
153150 }
154151
155152 if (lsm -> flags & LSM_FLAG_EXCLUSIVE ) {
156153 if (lsm_exclusive ) {
157- init_debug ("exclusive disabled: %s\n" , lsm -> id -> name );
154+ lsm_pr_dbg ("skip exclusive LSM conflict %s:%s\n" ,
155+ src , lsm -> id -> name );
158156 lsm_enabled_set (lsm , false);
159- goto out ;
157+ return ;
160158 } else {
161- init_debug ("exclusive chosen: %s\n" , lsm -> id -> name );
159+ lsm_pr_dbg ("select exclusive LSM %s:%s\n" ,
160+ src , lsm -> id -> name );
162161 lsm_exclusive = lsm ;
163162 }
164163 }
@@ -167,9 +166,7 @@ static void __init lsm_order_append(struct lsm_info *lsm, const char *src)
167166 lsm_order [lsm_active_cnt ] = lsm ;
168167 lsm_idlist [lsm_active_cnt ++ ] = lsm -> id ;
169168
170- out :
171- init_debug ("%s ordered: %s (%s)\n" , src , lsm -> id -> name ,
172- lsm_is_enabled (lsm ) ? "enabled" : "disabled" );
169+ lsm_pr_dbg ("enabling LSM %s:%s\n" , src , lsm -> id -> name );
173170}
174171
175172/**
@@ -239,7 +236,7 @@ static void __init lsm_init_single(struct lsm_info *lsm)
239236 if (!lsm_is_enabled (lsm ))
240237 return ;
241238
242- init_debug ("initializing %s\n" , lsm -> id -> name );
239+ lsm_pr_dbg ("initializing %s\n" , lsm -> id -> name );
243240 ret = lsm -> init ();
244241 WARN (ret , "%s failed to initialize: %d\n" , lsm -> id -> name , ret );
245242}
@@ -266,8 +263,8 @@ static void __init lsm_order_parse(const char *list, const char *src)
266263 if ((lsm -> flags & LSM_FLAG_LEGACY_MAJOR ) &&
267264 strcmp (lsm -> id -> name , lsm_order_legacy )) {
268265 lsm_enabled_set (lsm , false);
269- init_debug ( "security=%s disabled: %s (only one legacy major LSM) \n" ,
270- lsm_order_legacy , lsm -> id -> name );
266+ lsm_pr_dbg ( "skip legacy LSM conflict %s:%s \n" ,
267+ src , lsm -> id -> name );
271268 }
272269 }
273270 }
@@ -310,16 +307,15 @@ static void __init lsm_order_parse(const char *list, const char *src)
310307 if (lsm_order_exists (lsm ))
311308 continue ;
312309 lsm_enabled_set (lsm , false);
313- init_debug ("%s skipped: %s (not in requested order)\n" ,
314- src , lsm -> id -> name );
310+ lsm_pr_dbg ("skip disabled LSM %s:%s\n" , src , lsm -> id -> name );
315311 }
316312}
317313
318314/**
319315 * lsm_static_call_init - Initialize a LSM's static calls
320316 * @hl: LSM hook list
321317 */
322- static void __init lsm_static_call_init (struct security_hook_list * hl )
318+ static int __init lsm_static_call_init (struct security_hook_list * hl )
323319{
324320 struct lsm_static_call * scall = hl -> scalls ;
325321 int i ;
@@ -331,11 +327,12 @@ static void __init lsm_static_call_init(struct security_hook_list *hl)
331327 hl -> hook .lsm_func_addr );
332328 scall -> hl = hl ;
333329 static_branch_enable (scall -> active );
334- return ;
330+ return 0 ;
335331 }
336332 scall ++ ;
337333 }
338- panic ("%s - Ran out of static slots.\n" , __func__ );
334+
335+ return - ENOSPC ;
339336}
340337
341338/**
@@ -353,7 +350,9 @@ void __init security_add_hooks(struct security_hook_list *hooks, int count,
353350
354351 for (i = 0 ; i < count ; i ++ ) {
355352 hooks [i ].lsmid = lsmid ;
356- lsm_static_call_init (& hooks [i ]);
353+ if (lsm_static_call_init (& hooks [i ]))
354+ panic ("exhausted LSM callback slots with LSM %s\n" ,
355+ lsmid -> name );
357356 }
358357}
359358
@@ -384,58 +383,42 @@ int __init security_init(void)
384383{
385384 unsigned int cnt ;
386385 struct lsm_info * * lsm ;
387- struct lsm_info * early ;
388- unsigned int first = 0 ;
389386
390- init_debug ("legacy security=%s\n" , lsm_order_legacy ? : " *unspecified*" );
391- init_debug (" CONFIG_LSM=%s\n" , lsm_order_builtin );
392- init_debug ("boot arg lsm=%s\n" , lsm_order_cmdline ? : " *unspecified*" );
387+ if (lsm_debug ) {
388+ lsm_pr ("built-in LSM list: %s\n" , lsm_order_builtin );
389+ lsm_pr ("legacy LSM parameter: %s\n" , lsm_order_legacy );
390+ lsm_pr ("boot LSM parameter: %s\n" , lsm_order_cmdline );
391+ }
393392
394393 if (lsm_order_cmdline ) {
395- if (lsm_order_legacy ) {
396- pr_warn ("security=%s is ignored because it is superseded by lsm=%s\n" ,
397- lsm_order_legacy , lsm_order_cmdline );
394+ if (lsm_order_legacy )
398395 lsm_order_legacy = NULL ;
399- }
400396 lsm_order_parse (lsm_order_cmdline , "cmdline" );
401397 } else
402398 lsm_order_parse (lsm_order_builtin , "builtin" );
403399
404400 lsm_order_for_each (lsm )
405401 lsm_prepare (* lsm );
406402
407- pr_info ("initializing lsm=" );
408- lsm_early_for_each_raw (early ) {
409- if (lsm_is_enabled (early ))
410- pr_cont ("%s%s" ,
411- first ++ == 0 ? "" : "," , early -> id -> name );
412- }
413- lsm_order_for_each (lsm ) {
414- if (lsm_is_enabled (* lsm ))
415- pr_cont ("%s%s" ,
416- first ++ == 0 ? "" : "," , (* lsm )-> id -> name );
403+ if (lsm_debug ) {
404+ lsm_pr ("blob(cred) size %d\n" , blob_sizes .lbs_cred );
405+ lsm_pr ("blob(file) size %d\n" , blob_sizes .lbs_file );
406+ lsm_pr ("blob(ib) size %d\n" , blob_sizes .lbs_ib );
407+ lsm_pr ("blob(inode) size %d\n" , blob_sizes .lbs_inode );
408+ lsm_pr ("blob(ipc) size %d\n" , blob_sizes .lbs_ipc );
409+ lsm_pr ("blob(key) size %d\n" , blob_sizes .lbs_key );
410+ lsm_pr ("blob(msg_msg)_size %d\n" , blob_sizes .lbs_msg_msg );
411+ lsm_pr ("blob(sock) size %d\n" , blob_sizes .lbs_sock );
412+ lsm_pr ("blob(superblock) size %d\n" , blob_sizes .lbs_superblock );
413+ lsm_pr ("blob(perf_event) size %d\n" , blob_sizes .lbs_perf_event );
414+ lsm_pr ("blob(task) size %d\n" , blob_sizes .lbs_task );
415+ lsm_pr ("blob(tun_dev) size %d\n" , blob_sizes .lbs_tun_dev );
416+ lsm_pr ("blob(xattr) count %d\n" , blob_sizes .lbs_xattr_count );
417+ lsm_pr ("blob(bdev) size %d\n" , blob_sizes .lbs_bdev );
418+ lsm_pr ("blob(bpf_map) size %d\n" , blob_sizes .lbs_bpf_map );
419+ lsm_pr ("blob(bpf_prog) size %d\n" , blob_sizes .lbs_bpf_prog );
420+ lsm_pr ("blob(bpf_token) size %d\n" , blob_sizes .lbs_bpf_token );
417421 }
418- pr_cont ("\n" );
419-
420- init_debug ("cred blob size = %d\n" , blob_sizes .lbs_cred );
421- init_debug ("file blob size = %d\n" , blob_sizes .lbs_file );
422- init_debug ("ib blob size = %d\n" , blob_sizes .lbs_ib );
423- init_debug ("inode blob size = %d\n" , blob_sizes .lbs_inode );
424- init_debug ("ipc blob size = %d\n" , blob_sizes .lbs_ipc );
425- #ifdef CONFIG_KEYS
426- init_debug ("key blob size = %d\n" , blob_sizes .lbs_key );
427- #endif /* CONFIG_KEYS */
428- init_debug ("msg_msg blob size = %d\n" , blob_sizes .lbs_msg_msg );
429- init_debug ("sock blob size = %d\n" , blob_sizes .lbs_sock );
430- init_debug ("superblock blob size = %d\n" , blob_sizes .lbs_superblock );
431- init_debug ("perf event blob size = %d\n" , blob_sizes .lbs_perf_event );
432- init_debug ("task blob size = %d\n" , blob_sizes .lbs_task );
433- init_debug ("tun device blob size = %d\n" , blob_sizes .lbs_tun_dev );
434- init_debug ("xattr slots = %d\n" , blob_sizes .lbs_xattr_count );
435- init_debug ("bdev blob size = %d\n" , blob_sizes .lbs_bdev );
436- init_debug ("bpf map blob size = %d\n" , blob_sizes .lbs_bpf_map );
437- init_debug ("bpf prog blob size = %d\n" , blob_sizes .lbs_bpf_prog );
438- init_debug ("bpf token blob size = %d\n" , blob_sizes .lbs_bpf_token );
439422
440423 if (blob_sizes .lbs_file )
441424 lsm_file_cache = kmem_cache_create ("lsm_file_cache" ,
@@ -447,9 +430,9 @@ int __init security_init(void)
447430 SLAB_PANIC , NULL );
448431
449432 if (lsm_cred_alloc ((struct cred __rcu * )current -> cred , GFP_KERNEL ))
450- panic ("%s: early cred alloc failed. \n" , __func__ );
433+ panic ("early LSM cred alloc failed\n" );
451434 if (lsm_task_alloc (current ))
452- panic ("%s: early task alloc failed. \n" , __func__ );
435+ panic ("early LSM task alloc failed\n" );
453436
454437 cnt = 0 ;
455438 lsm_order_for_each (lsm ) {
0 commit comments