diff options
| author | Lukasz Pawelczyk <l.pawelczyk@samsung.com> | 2014-08-29 11:02:55 -0400 |
|---|---|---|
| committer | Casey Schaufler <casey@schaufler-ca.com> | 2014-08-29 13:10:55 -0400 |
| commit | 21c7eae21a2100a89cfb8cebaf7b770271f32c6e (patch) | |
| tree | 9747fd04fb0a18e98c31985c978ae559f7affc0b /security | |
| parent | d01757904d9deb619e23c9450218829943a46822 (diff) | |
Make Smack operate on smack_known struct where it still used char*
Smack used to use a mix of smack_known struct and char* throughout its
APIs and implementation. This patch unifies the behaviour and makes it
store and operate exclusively on smack_known struct pointers when managing
labels.
Signed-off-by: Lukasz Pawelczyk <l.pawelczyk@samsung.com>
Conflicts:
security/smack/smack_access.c
security/smack/smack_lsm.c
Diffstat (limited to 'security')
| -rw-r--r-- | security/smack/smack.h | 34 | ||||
| -rw-r--r-- | security/smack/smack_access.c | 94 | ||||
| -rw-r--r-- | security/smack/smack_lsm.c | 299 | ||||
| -rw-r--r-- | security/smack/smackfs.c | 61 |
4 files changed, 233 insertions, 255 deletions
diff --git a/security/smack/smack.h b/security/smack/smack.h index 2d13d5fb17ed..b828a379377c 100644 --- a/security/smack/smack.h +++ b/security/smack/smack.h | |||
| @@ -71,11 +71,11 @@ struct smack_known { | |||
| 71 | #define SMK_CIPSOLEN 24 | 71 | #define SMK_CIPSOLEN 24 |
| 72 | 72 | ||
| 73 | struct superblock_smack { | 73 | struct superblock_smack { |
| 74 | char *smk_root; | 74 | struct smack_known *smk_root; |
| 75 | char *smk_floor; | 75 | struct smack_known *smk_floor; |
| 76 | char *smk_hat; | 76 | struct smack_known *smk_hat; |
| 77 | char *smk_default; | 77 | struct smack_known *smk_default; |
| 78 | int smk_initialized; | 78 | int smk_initialized; |
| 79 | }; | 79 | }; |
| 80 | 80 | ||
| 81 | struct socket_smack { | 81 | struct socket_smack { |
| @@ -88,7 +88,7 @@ struct socket_smack { | |||
| 88 | * Inode smack data | 88 | * Inode smack data |
| 89 | */ | 89 | */ |
| 90 | struct inode_smack { | 90 | struct inode_smack { |
| 91 | char *smk_inode; /* label of the fso */ | 91 | struct smack_known *smk_inode; /* label of the fso */ |
| 92 | struct smack_known *smk_task; /* label of the task */ | 92 | struct smack_known *smk_task; /* label of the task */ |
| 93 | struct smack_known *smk_mmap; /* label of the mmap domain */ | 93 | struct smack_known *smk_mmap; /* label of the mmap domain */ |
| 94 | struct mutex smk_lock; /* initialization lock */ | 94 | struct mutex smk_lock; /* initialization lock */ |
| @@ -112,7 +112,7 @@ struct task_smack { | |||
| 112 | struct smack_rule { | 112 | struct smack_rule { |
| 113 | struct list_head list; | 113 | struct list_head list; |
| 114 | struct smack_known *smk_subject; | 114 | struct smack_known *smk_subject; |
| 115 | char *smk_object; | 115 | struct smack_known *smk_object; |
| 116 | int smk_access; | 116 | int smk_access; |
| 117 | }; | 117 | }; |
| 118 | 118 | ||
| @@ -123,7 +123,7 @@ struct smk_netlbladdr { | |||
| 123 | struct list_head list; | 123 | struct list_head list; |
| 124 | struct sockaddr_in smk_host; /* network address */ | 124 | struct sockaddr_in smk_host; /* network address */ |
| 125 | struct in_addr smk_mask; /* network mask */ | 125 | struct in_addr smk_mask; /* network mask */ |
| 126 | char *smk_label; /* label */ | 126 | struct smack_known *smk_label; /* label */ |
| 127 | }; | 127 | }; |
| 128 | 128 | ||
| 129 | /* | 129 | /* |
| @@ -227,23 +227,23 @@ struct smk_audit_info { | |||
| 227 | /* | 227 | /* |
| 228 | * These functions are in smack_lsm.c | 228 | * These functions are in smack_lsm.c |
| 229 | */ | 229 | */ |
| 230 | struct inode_smack *new_inode_smack(char *); | 230 | struct inode_smack *new_inode_smack(struct smack_known *); |
| 231 | 231 | ||
| 232 | /* | 232 | /* |
| 233 | * These functions are in smack_access.c | 233 | * These functions are in smack_access.c |
| 234 | */ | 234 | */ |
| 235 | int smk_access_entry(char *, char *, struct list_head *); | 235 | int smk_access_entry(char *, char *, struct list_head *); |
| 236 | int smk_access(struct smack_known *, char *, int, struct smk_audit_info *); | 236 | int smk_access(struct smack_known *, struct smack_known *, |
| 237 | int smk_tskacc(struct task_smack *, char *, u32, struct smk_audit_info *); | 237 | int, struct smk_audit_info *); |
| 238 | int smk_curacc(char *, u32, struct smk_audit_info *); | 238 | int smk_tskacc(struct task_smack *, struct smack_known *, |
| 239 | u32, struct smk_audit_info *); | ||
| 240 | int smk_curacc(struct smack_known *, u32, struct smk_audit_info *); | ||
| 239 | struct smack_known *smack_from_secid(const u32); | 241 | struct smack_known *smack_from_secid(const u32); |
| 240 | char *smk_parse_smack(const char *string, int len); | 242 | char *smk_parse_smack(const char *string, int len); |
| 241 | int smk_netlbl_mls(int, char *, struct netlbl_lsm_secattr *, int); | 243 | int smk_netlbl_mls(int, char *, struct netlbl_lsm_secattr *, int); |
| 242 | char *smk_import(const char *, int); | ||
| 243 | struct smack_known *smk_import_entry(const char *, int); | 244 | struct smack_known *smk_import_entry(const char *, int); |
| 244 | void smk_insert_entry(struct smack_known *skp); | 245 | void smk_insert_entry(struct smack_known *skp); |
| 245 | struct smack_known *smk_find_entry(const char *); | 246 | struct smack_known *smk_find_entry(const char *); |
| 246 | u32 smack_to_secid(const char *); | ||
| 247 | 247 | ||
| 248 | /* | 248 | /* |
| 249 | * Shared data. | 249 | * Shared data. |
| @@ -253,7 +253,7 @@ extern int smack_cipso_mapped; | |||
| 253 | extern struct smack_known *smack_net_ambient; | 253 | extern struct smack_known *smack_net_ambient; |
| 254 | extern struct smack_known *smack_onlycap; | 254 | extern struct smack_known *smack_onlycap; |
| 255 | extern struct smack_known *smack_syslog_label; | 255 | extern struct smack_known *smack_syslog_label; |
| 256 | extern const char *smack_cipso_option; | 256 | extern struct smack_known smack_cipso_option; |
| 257 | extern int smack_ptrace_rule; | 257 | extern int smack_ptrace_rule; |
| 258 | 258 | ||
| 259 | extern struct smack_known smack_known_floor; | 259 | extern struct smack_known smack_known_floor; |
| @@ -282,9 +282,9 @@ static inline int smk_inode_transmutable(const struct inode *isp) | |||
| 282 | } | 282 | } |
| 283 | 283 | ||
| 284 | /* | 284 | /* |
| 285 | * Present a pointer to the smack label in an inode blob. | 285 | * Present a pointer to the smack label entry in an inode blob. |
| 286 | */ | 286 | */ |
| 287 | static inline char *smk_of_inode(const struct inode *isp) | 287 | static inline struct smack_known *smk_of_inode(const struct inode *isp) |
| 288 | { | 288 | { |
| 289 | struct inode_smack *sip = isp->i_security; | 289 | struct inode_smack *sip = isp->i_security; |
| 290 | return sip->smk_inode; | 290 | return sip->smk_inode; |
diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c index 9f02cb0ac85e..5b970ffde024 100644 --- a/security/smack/smack_access.c +++ b/security/smack/smack_access.c | |||
| @@ -94,7 +94,7 @@ int smk_access_entry(char *subject_label, char *object_label, | |||
| 94 | struct smack_rule *srp; | 94 | struct smack_rule *srp; |
| 95 | 95 | ||
| 96 | list_for_each_entry_rcu(srp, rule_list, list) { | 96 | list_for_each_entry_rcu(srp, rule_list, list) { |
| 97 | if (srp->smk_object == object_label && | 97 | if (srp->smk_object->smk_known == object_label && |
| 98 | srp->smk_subject->smk_known == subject_label) { | 98 | srp->smk_subject->smk_known == subject_label) { |
| 99 | may = srp->smk_access; | 99 | may = srp->smk_access; |
| 100 | break; | 100 | break; |
| @@ -111,8 +111,8 @@ int smk_access_entry(char *subject_label, char *object_label, | |||
| 111 | 111 | ||
| 112 | /** | 112 | /** |
| 113 | * smk_access - determine if a subject has a specific access to an object | 113 | * smk_access - determine if a subject has a specific access to an object |
| 114 | * @subject_known: a pointer to the subject's Smack label entry | 114 | * @subject: a pointer to the subject's Smack label entry |
| 115 | * @object_label: a pointer to the object's Smack label | 115 | * @object: a pointer to the object's Smack label entry |
| 116 | * @request: the access requested, in "MAY" format | 116 | * @request: the access requested, in "MAY" format |
| 117 | * @a : a pointer to the audit data | 117 | * @a : a pointer to the audit data |
| 118 | * | 118 | * |
| @@ -122,8 +122,8 @@ int smk_access_entry(char *subject_label, char *object_label, | |||
| 122 | * | 122 | * |
| 123 | * Smack labels are shared on smack_list | 123 | * Smack labels are shared on smack_list |
| 124 | */ | 124 | */ |
| 125 | int smk_access(struct smack_known *subject_known, char *object_label, | 125 | int smk_access(struct smack_known *subject, struct smack_known *object, |
| 126 | int request, struct smk_audit_info *a) | 126 | int request, struct smk_audit_info *a) |
| 127 | { | 127 | { |
| 128 | int may = MAY_NOT; | 128 | int may = MAY_NOT; |
| 129 | int rc = 0; | 129 | int rc = 0; |
| @@ -133,7 +133,7 @@ int smk_access(struct smack_known *subject_known, char *object_label, | |||
| 133 | * | 133 | * |
| 134 | * A star subject can't access any object. | 134 | * A star subject can't access any object. |
| 135 | */ | 135 | */ |
| 136 | if (subject_known == &smack_known_star) { | 136 | if (subject == &smack_known_star) { |
| 137 | rc = -EACCES; | 137 | rc = -EACCES; |
| 138 | goto out_audit; | 138 | goto out_audit; |
| 139 | } | 139 | } |
| @@ -142,28 +142,28 @@ int smk_access(struct smack_known *subject_known, char *object_label, | |||
| 142 | * Tasks cannot be assigned the internet label. | 142 | * Tasks cannot be assigned the internet label. |
| 143 | * An internet subject can access any object. | 143 | * An internet subject can access any object. |
| 144 | */ | 144 | */ |
| 145 | if (object_label == smack_known_web.smk_known || | 145 | if (object == &smack_known_web || |
| 146 | subject_known == &smack_known_web) | 146 | subject == &smack_known_web) |
| 147 | goto out_audit; | 147 | goto out_audit; |
| 148 | /* | 148 | /* |
| 149 | * A star object can be accessed by any subject. | 149 | * A star object can be accessed by any subject. |
| 150 | */ | 150 | */ |
| 151 | if (object_label == smack_known_star.smk_known) | 151 | if (object == &smack_known_star) |
| 152 | goto out_audit; | ||
