@@ -35,28 +35,29 @@ static const char * const integrity_status_msg[] = {
35
35
};
36
36
int evm_hmac_attrs ;
37
37
38
- char * evm_config_xattrnames [] = {
38
+ static struct xattr_list evm_config_default_xattrnames [] __ro_after_init = {
39
39
#ifdef CONFIG_SECURITY_SELINUX
40
- XATTR_NAME_SELINUX ,
40
+ {. name = XATTR_NAME_SELINUX } ,
41
41
#endif
42
42
#ifdef CONFIG_SECURITY_SMACK
43
- XATTR_NAME_SMACK ,
43
+ {. name = XATTR_NAME_SMACK } ,
44
44
#ifdef CONFIG_EVM_EXTRA_SMACK_XATTRS
45
- XATTR_NAME_SMACKEXEC ,
46
- XATTR_NAME_SMACKTRANSMUTE ,
47
- XATTR_NAME_SMACKMMAP ,
45
+ {. name = XATTR_NAME_SMACKEXEC } ,
46
+ {. name = XATTR_NAME_SMACKTRANSMUTE } ,
47
+ {. name = XATTR_NAME_SMACKMMAP } ,
48
48
#endif
49
49
#endif
50
50
#ifdef CONFIG_SECURITY_APPARMOR
51
- XATTR_NAME_APPARMOR ,
51
+ {. name = XATTR_NAME_APPARMOR } ,
52
52
#endif
53
53
#ifdef CONFIG_IMA_APPRAISE
54
- XATTR_NAME_IMA ,
54
+ {. name = XATTR_NAME_IMA } ,
55
55
#endif
56
- XATTR_NAME_CAPS ,
57
- NULL
56
+ {.name = XATTR_NAME_CAPS },
58
57
};
59
58
59
+ LIST_HEAD (evm_config_xattrnames );
60
+
60
61
static int evm_fixmode ;
61
62
static int __init evm_set_fixmode (char * str )
62
63
{
@@ -68,6 +69,17 @@ __setup("evm=", evm_set_fixmode);
68
69
69
70
static void __init evm_init_config (void )
70
71
{
72
+ int i , xattrs ;
73
+
74
+ xattrs = ARRAY_SIZE (evm_config_default_xattrnames );
75
+
76
+ pr_info ("Initialising EVM extended attributes:\n" );
77
+ for (i = 0 ; i < xattrs ; i ++ ) {
78
+ pr_info ("%s\n" , evm_config_default_xattrnames [i ].name );
79
+ list_add_tail (& evm_config_default_xattrnames [i ].list ,
80
+ & evm_config_xattrnames );
81
+ }
82
+
71
83
#ifdef CONFIG_EVM_ATTR_FSUUID
72
84
evm_hmac_attrs |= EVM_ATTR_FSUUID ;
73
85
#endif
@@ -82,15 +94,15 @@ static bool evm_key_loaded(void)
82
94
static int evm_find_protected_xattrs (struct dentry * dentry )
83
95
{
84
96
struct inode * inode = d_backing_inode (dentry );
85
- char * * xattr ;
97
+ struct xattr_list * xattr ;
86
98
int error ;
87
99
int count = 0 ;
88
100
89
101
if (!(inode -> i_opflags & IOP_XATTR ))
90
102
return - EOPNOTSUPP ;
91
103
92
- for (xattr = evm_config_xattrnames ; * xattr != NULL ; xattr ++ ) {
93
- error = __vfs_getxattr (dentry , inode , * xattr , NULL , 0 );
104
+ list_for_each_entry (xattr , & evm_config_xattrnames , list ) {
105
+ error = __vfs_getxattr (dentry , inode , xattr -> name , NULL , 0 );
94
106
if (error < 0 ) {
95
107
if (error == - ENODATA )
96
108
continue ;
@@ -211,24 +223,25 @@ static enum integrity_status evm_verify_hmac(struct dentry *dentry,
211
223
212
224
static int evm_protected_xattr (const char * req_xattr_name )
213
225
{
214
- char * * xattrname ;
215
226
int namelen ;
216
227
int found = 0 ;
228
+ struct xattr_list * xattr ;
217
229
218
230
namelen = strlen (req_xattr_name );
219
- for ( xattrname = evm_config_xattrnames ; * xattrname != NULL ; xattrname ++ ) {
220
- if ((strlen (* xattrname ) == namelen )
221
- && (strncmp (req_xattr_name , * xattrname , namelen ) == 0 )) {
231
+ list_for_each_entry ( xattr , & evm_config_xattrnames , list ) {
232
+ if ((strlen (xattr -> name ) == namelen )
233
+ && (strncmp (req_xattr_name , xattr -> name , namelen ) == 0 )) {
222
234
found = 1 ;
223
235
break ;
224
236
}
225
237
if (strncmp (req_xattr_name ,
226
- * xattrname + XATTR_SECURITY_PREFIX_LEN ,
238
+ xattr -> name + XATTR_SECURITY_PREFIX_LEN ,
227
239
strlen (req_xattr_name )) == 0 ) {
228
240
found = 1 ;
229
241
break ;
230
242
}
231
243
}
244
+
232
245
return found ;
233
246
}
234
247
@@ -544,35 +557,35 @@ void __init evm_load_x509(void)
544
557
static int __init init_evm (void )
545
558
{
546
559
int error ;
560
+ struct list_head * pos , * q ;
561
+ struct xattr_list * xattr ;
547
562
548
563
evm_init_config ();
549
564
550
565
error = integrity_init_keyring (INTEGRITY_KEYRING_EVM );
551
566
if (error )
552
- return error ;
567
+ goto error ;
553
568
554
569
error = evm_init_secfs ();
555
570
if (error < 0 ) {
556
571
pr_info ("Error registering secfs\n" );
557
- return error ;
572
+ goto error ;
558
573
}
559
574
560
- return 0 ;
561
- }
562
-
563
- /*
564
- * evm_display_config - list the EVM protected security extended attributes
565
- */
566
- static int __init evm_display_config (void )
567
- {
568
- char * * xattrname ;
575
+ error :
576
+ if (error != 0 ) {
577
+ if (!list_empty (& evm_config_xattrnames )) {
578
+ list_for_each_safe (pos , q , & evm_config_xattrnames ) {
579
+ xattr = list_entry (pos , struct xattr_list ,
580
+ list );
581
+ list_del (pos );
582
+ }
583
+ }
584
+ }
569
585
570
- for (xattrname = evm_config_xattrnames ; * xattrname != NULL ; xattrname ++ )
571
- pr_info ("%s\n" , * xattrname );
572
- return 0 ;
586
+ return error ;
573
587
}
574
588
575
- pure_initcall (evm_display_config );
576
589
late_initcall (init_evm );
577
590
578
591
MODULE_DESCRIPTION ("Extended Verification Module" );
0 commit comments