diff options
Diffstat (limited to 'security/selinux')
-rw-r--r-- | security/selinux/avc.c | 19 | ||||
-rw-r--r-- | security/selinux/hooks.c | 69 | ||||
-rw-r--r-- | security/selinux/include/classmap.h | 2 | ||||
-rw-r--r-- | security/selinux/include/objsec.h | 4 | ||||
-rw-r--r-- | security/selinux/selinuxfs.c | 20 |
5 files changed, 63 insertions, 51 deletions
diff --git a/security/selinux/avc.c b/security/selinux/avc.c index 4d3fab47e643..dad36a6ab45f 100644 --- a/security/selinux/avc.c +++ b/security/selinux/avc.c | |||
@@ -188,11 +188,9 @@ int avc_get_hash_stats(char *page) | |||
188 | for (i = 0; i < AVC_CACHE_SLOTS; i++) { | 188 | for (i = 0; i < AVC_CACHE_SLOTS; i++) { |
189 | head = &avc_cache.slots[i]; | 189 | head = &avc_cache.slots[i]; |
190 | if (!hlist_empty(head)) { | 190 | if (!hlist_empty(head)) { |
191 | struct hlist_node *next; | ||
192 | |||
193 | slots_used++; | 191 | slots_used++; |
194 | chain_len = 0; | 192 | chain_len = 0; |
195 | hlist_for_each_entry_rcu(node, next, head, list) | 193 | hlist_for_each_entry_rcu(node, head, list) |
196 | chain_len++; | 194 | chain_len++; |
197 | if (chain_len > max_chain_len) | 195 | if (chain_len > max_chain_len) |
198 | max_chain_len = chain_len; | 196 | max_chain_len = chain_len; |
@@ -241,7 +239,6 @@ static inline int avc_reclaim_node(void) | |||
241 | int hvalue, try, ecx; | 239 | int hvalue, try, ecx; |
242 | unsigned long flags; | 240 | unsigned long flags; |
243 | struct hlist_head *head; | 241 | struct hlist_head *head; |
244 | struct hlist_node *next; | ||
245 | spinlock_t *lock; | 242 | spinlock_t *lock; |
246 | 243 | ||
247 | for (try = 0, ecx = 0; try < AVC_CACHE_SLOTS; try++) { | 244 | for (try = 0, ecx = 0; try < AVC_CACHE_SLOTS; try++) { |
@@ -253,7 +250,7 @@ static inline int avc_reclaim_node(void) | |||
253 | continue; | 250 | continue; |
254 | 251 | ||
255 | rcu_read_lock(); | 252 | rcu_read_lock(); |
256 | hlist_for_each_entry(node, next, head, list) { | 253 | hlist_for_each_entry(node, head, list) { |
257 | avc_node_delete(node); | 254 | avc_node_delete(node); |
258 | avc_cache_stats_incr(reclaims); | 255 | avc_cache_stats_incr(reclaims); |
259 | ecx++; | 256 | ecx++; |
@@ -301,11 +298,10 @@ static inline struct avc_node *avc_search_node(u32 ssid, u32 tsid, u16 tclass) | |||
301 | struct avc_node *node, *ret = NULL; | 298 | struct avc_node *node, *ret = NULL; |
302 | int hvalue; | 299 | int hvalue; |
303 | struct hlist_head *head; | 300 | struct hlist_head *head; |
304 | struct hlist_node *next; | ||
305 | 301 | ||
306 | hvalue = avc_hash(ssid, tsid, tclass); | 302 | hvalue = avc_hash(ssid, tsid, tclass); |
307 | head = &avc_cache.slots[hvalue]; | 303 | head = &avc_cache.slots[hvalue]; |
308 | hlist_for_each_entry_rcu(node, next, head, list) { | 304 | hlist_for_each_entry_rcu(node, head, list) { |
309 | if (ssid == node->ae.ssid && | 305 | if (ssid == node->ae.ssid && |
310 | tclass == node->ae.tclass && | 306 | tclass == node->ae.tclass && |
311 | tsid == node->ae.tsid) { | 307 | tsid == node->ae.tsid) { |
@@ -394,7 +390,6 @@ static struct avc_node *avc_insert(u32 ssid, u32 tsid, u16 tclass, struct av_dec | |||
394 | node = avc_alloc_node(); | 390 | node = avc_alloc_node(); |
395 | if (node) { | 391 | if (node) { |
396 | struct hlist_head *head; | 392 | struct hlist_head *head; |
397 | struct hlist_node *next; | ||
398 | spinlock_t *lock; | 393 | spinlock_t *lock; |
399 | 394 | ||
400 | hvalue = avc_hash(ssid, tsid, tclass); | 395 | hvalue = avc_hash(ssid, tsid, tclass); |
@@ -404,7 +399,7 @@ static struct avc_node *avc_insert(u32 ssid, u32 tsid, u16 tclass, struct av_dec | |||
404 | lock = &avc_cache.slots_lock[hvalue]; | 399 | lock = &avc_cache.slots_lock[hvalue]; |
405 | 400 | ||
406 | spin_lock_irqsave(lock, flag); | 401 | spin_lock_irqsave(lock, flag); |
407 | hlist_for_each_entry(pos, next, head, list) { | 402 | hlist_for_each_entry(pos, head, list) { |
408 | if (pos->ae.ssid == ssid && | 403 | if (pos->ae.ssid == ssid && |
409 | pos->ae.tsid == tsid && | 404 | pos->ae.tsid == tsid && |
410 | pos->ae.tclass == tclass) { | 405 | pos->ae.tclass == tclass) { |
@@ -541,7 +536,6 @@ static int avc_update_node(u32 event, u32 perms, u32 ssid, u32 tsid, u16 tclass, | |||
541 | unsigned long flag; | 536 | unsigned long flag; |
542 | struct avc_node *pos, *node, *orig = NULL; | 537 | struct avc_node *pos, *node, *orig = NULL; |
543 | struct hlist_head *head; | 538 | struct hlist_head *head; |
544 | struct hlist_node *next; | ||
545 | spinlock_t *lock; | 539 | spinlock_t *lock; |
546 | 540 | ||
547 | node = avc_alloc_node(); | 541 | node = avc_alloc_node(); |
@@ -558,7 +552,7 @@ static int avc_update_node(u32 event, u32 perms, u32 ssid, u32 tsid, u16 tclass, | |||
558 | 552 | ||
559 | spin_lock_irqsave(lock, flag); | 553 | spin_lock_irqsave(lock, flag); |
560 | 554 | ||
561 | hlist_for_each_entry(pos, next, head, list) { | 555 | hlist_for_each_entry(pos, head, list) { |
562 | if (ssid == pos->ae.ssid && | 556 | if (ssid == pos->ae.ssid && |
563 | tsid == pos->ae.tsid && | 557 | tsid == pos->ae.tsid && |
564 | tclass == pos->ae.tclass && | 558 | tclass == pos->ae.tclass && |
@@ -614,7 +608,6 @@ out: | |||
614 | static void avc_flush(void) | 608 | static void avc_flush(void) |
615 | { | 609 | { |
616 | struct hlist_head *head; | 610 | struct hlist_head *head; |
617 | struct hlist_node *next; | ||
618 | struct avc_node *node; | 611 | struct avc_node *node; |
619 | spinlock_t *lock; | 612 | spinlock_t *lock; |
620 | unsigned long flag; | 613 | unsigned long flag; |
@@ -630,7 +623,7 @@ static void avc_flush(void) | |||
630 | * prevent RCU grace periods from ending. | 623 | * prevent RCU grace periods from ending. |
631 | */ | 624 | */ |
632 | rcu_read_lock(); | 625 | rcu_read_lock(); |
633 | hlist_for_each_entry(node, next, head, list) | 626 | hlist_for_each_entry(node, head, list) |
634 | avc_node_delete(node); | 627 | avc_node_delete(node); |
635 | rcu_read_unlock(); | 628 | rcu_read_unlock(); |
636 | spin_unlock_irqrestore(lock, flag); | 629 | spin_unlock_irqrestore(lock, flag); |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 61a53367d029..2fa28c88900c 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -1528,7 +1528,7 @@ static int file_has_perm(const struct cred *cred, | |||
1528 | u32 av) | 1528 | u32 av) |
1529 | { | 1529 | { |
1530 | struct file_security_struct *fsec = file->f_security; | 1530 | struct file_security_struct *fsec = file->f_security; |
1531 | struct inode *inode = file->f_path.dentry->d_inode; | 1531 | struct inode *inode = file_inode(file); |
1532 | struct common_audit_data ad; | 1532 | struct common_audit_data ad; |
1533 | u32 sid = cred_sid(cred); | 1533 | u32 sid = cred_sid(cred); |
1534 | int rc; | 1534 | int rc; |
@@ -1957,7 +1957,7 @@ static int selinux_bprm_set_creds(struct linux_binprm *bprm) | |||
1957 | struct task_security_struct *new_tsec; | 1957 | struct task_security_struct *new_tsec; |
1958 | struct inode_security_struct *isec; | 1958 | struct inode_security_struct *isec; |
1959 | struct common_audit_data ad; | 1959 | struct common_audit_data ad; |
1960 | struct inode *inode = bprm->file->f_path.dentry->d_inode; | 1960 | struct inode *inode = file_inode(bprm->file); |
1961 | int rc; | 1961 | int rc; |
1962 | 1962 | ||
1963 | rc = cap_bprm_set_creds(bprm); | 1963 | rc = cap_bprm_set_creds(bprm); |
@@ -2929,7 +2929,7 @@ static void selinux_inode_getsecid(const struct inode *inode, u32 *secid) | |||
2929 | static int selinux_revalidate_file_permission(struct file *file, int mask) | 2929 | static int selinux_revalidate_file_permission(struct file *file, int mask) |
2930 | { | 2930 | { |
2931 | const struct cred *cred = current_cred(); | 2931 | const struct cred *cred = current_cred(); |
2932 | struct inode *inode = file->f_path.dentry->d_inode; | 2932 | struct inode *inode = file_inode(file); |
2933 | 2933 | ||
2934 | /* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */ | 2934 | /* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */ |
2935 | if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE)) | 2935 | if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE)) |
@@ -2941,7 +2941,7 @@ static int selinux_revalidate_file_permission(struct file *file, int mask) | |||
2941 | 2941 | ||
2942 | static int selinux_file_permission(struct file *file, int mask) | 2942 | static int selinux_file_permission(struct file *file, int mask) |
2943 | { | 2943 | { |
2944 | struct inode *inode = file->f_path.dentry->d_inode; | 2944 | struct inode *inode = file_inode(file); |
2945 | struct file_security_struct *fsec = file->f_security; | 2945 | struct file_security_struct *fsec = file->f_security; |
2946 | struct inode_security_struct *isec = inode->i_security; | 2946 | struct inode_security_struct *isec = inode->i_security; |
2947 | u32 sid = current_sid(); | 2947 | u32 sid = current_sid(); |
@@ -3135,11 +3135,6 @@ static int selinux_file_fcntl(struct file *file, unsigned int cmd, | |||
3135 | 3135 | ||
3136 | switch (cmd) { | 3136 | switch (cmd) { |
3137 | case F_SETFL: | 3137 | case F_SETFL: |
3138 | if (!file->f_path.dentry || !file->f_path.dentry->d_inode) { | ||
3139 | err = -EINVAL; | ||
3140 | break; | ||
3141 | } | ||
3142 | |||
3143 | if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) { | 3138 | if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) { |
3144 | err = file_has_perm(cred, file, FILE__WRITE); | 3139 | err = file_has_perm(cred, file, FILE__WRITE); |
3145 | break; | 3140 | break; |
@@ -3162,10 +3157,6 @@ static int selinux_file_fcntl(struct file *file, unsigned int cmd, | |||
3162 | case F_SETLK64: | 3157 | case F_SETLK64: |
3163 | case F_SETLKW64: | 3158 | case F_SETLKW64: |
3164 | #endif | 3159 | #endif |
3165 | if (!file->f_path.dentry || !file->f_path.dentry->d_inode) { | ||
3166 | err = -EINVAL; | ||
3167 | break; | ||
3168 | } | ||
3169 | err = file_has_perm(cred, file, FILE__LOCK); | 3160 | err = file_has_perm(cred, file, FILE__LOCK); |
3170 | break; | 3161 | break; |
3171 | } | 3162 | } |
@@ -3218,7 +3209,7 @@ static int selinux_file_open(struct file *file, const struct cred *cred) | |||
3218 | struct inode_security_struct *isec; | 3209 | struct inode_security_struct *isec; |
3219 | 3210 | ||
3220 | fsec = file->f_security; | 3211 | fsec = file->f_security; |
3221 | isec = file->f_path.dentry->d_inode->i_security; | 3212 | isec = file_inode(file)->i_security; |
3222 | /* | 3213 | /* |
3223 | * Save inode label and policy sequence number | 3214 | * Save inode label and policy sequence number |
3224 | * at open-time so that selinux_file_permission | 3215 | * at open-time so that selinux_file_permission |
@@ -4399,6 +4390,24 @@ static void selinux_req_classify_flow(const struct request_sock *req, | |||
4399 | fl->flowi_secid = req->secid; | 4390 | fl->flowi_secid = req->secid; |
4400 | } | 4391 | } |
4401 | 4392 | ||
4393 | static int selinux_tun_dev_alloc_security(void **security) | ||
4394 | { | ||
4395 | struct tun_security_struct *tunsec; | ||
4396 | |||
4397 | tunsec = kzalloc(sizeof(*tunsec), GFP_KERNEL); | ||
4398 | if (!tunsec) | ||
4399 | return -ENOMEM; | ||
4400 | tunsec->sid = current_sid(); | ||
4401 | |||
4402 | *security = tunsec; | ||
4403 | return 0; | ||
4404 | } | ||
4405 | |||
4406 | static void selinux_tun_dev_free_security(void *security) | ||
4407 | { | ||
4408 | kfree(security); | ||
4409 | } | ||
4410 | |||
4402 | static int selinux_tun_dev_create(void) | 4411 | static int selinux_tun_dev_create(void) |
4403 | { | 4412 | { |
4404 | u32 sid = current_sid(); | 4413 | u32 sid = current_sid(); |
@@ -4414,8 +4423,17 @@ static int selinux_tun_dev_create(void) | |||
4414 | NULL); | 4423 | NULL); |
4415 | } | 4424 | } |
4416 | 4425 | ||
4417 | static void selinux_tun_dev_post_create(struct sock *sk) | 4426 | static int selinux_tun_dev_attach_queue(void *security) |
4427 | { | ||
4428 | struct tun_security_struct *tunsec = security; | ||
4429 | |||
4430 | return avc_has_perm(current_sid(), tunsec->sid, SECCLASS_TUN_SOCKET, | ||
4431 | TUN_SOCKET__ATTACH_QUEUE, NULL); | ||
4432 | } | ||
4433 | |||
4434 | static int selinux_tun_dev_attach(struct sock *sk, void *security) | ||
4418 | { | 4435 | { |
4436 | struct tun_security_struct *tunsec = security; | ||
4419 | struct sk_security_struct *sksec = sk->sk_security; | 4437 | struct sk_security_struct *sksec = sk->sk_security; |
4420 | 4438 | ||
4421 | /* we don't currently perform any NetLabel based labeling here and it | 4439 | /* we don't currently perform any NetLabel based labeling here and it |
@@ -4425,20 +4443,19 @@ static void selinux_tun_dev_post_create(struct sock *sk) | |||
4425 | * cause confusion to the TUN user that had no idea network labeling | 4443 | * cause confusion to the TUN user that had no idea network labeling |
4426 | * protocols were being used */ | 4444 | * protocols were being used */ |
4427 | 4445 | ||
4428 | /* see the comments in selinux_tun_dev_create() about why we don't use | 4446 | sksec->sid = tunsec->sid; |
4429 | * the sockcreate SID here */ | ||
4430 | |||
4431 | sksec->sid = current_sid(); | ||
4432 | sksec->sclass = SECCLASS_TUN_SOCKET; | 4447 | sksec->sclass = SECCLASS_TUN_SOCKET; |
4448 | |||
4449 | return 0; | ||
4433 | } | 4450 | } |
4434 | 4451 | ||
4435 | static int selinux_tun_dev_attach(struct sock *sk) | 4452 | static int selinux_tun_dev_open(void *security) |
4436 | { | 4453 | { |
4437 | struct sk_security_struct *sksec = sk->sk_security; | 4454 | struct tun_security_struct *tunsec = security; |
4438 | u32 sid = current_sid(); | 4455 | u32 sid = current_sid(); |
4439 | int err; | 4456 | int err; |
4440 | 4457 | ||
4441 | err = avc_has_perm(sid, sksec->sid, SECCLASS_TUN_SOCKET, | 4458 | err = avc_has_perm(sid, tunsec->sid, SECCLASS_TUN_SOCKET, |
4442 | TUN_SOCKET__RELABELFROM, NULL); | 4459 | TUN_SOCKET__RELABELFROM, NULL); |
4443 | if (err) | 4460 | if (err) |
4444 | return err; | 4461 | return err; |
@@ -4446,8 +4463,7 @@ static int selinux_tun_dev_attach(struct sock *sk) | |||
4446 | TUN_SOCKET__RELABELTO, NULL); | 4463 | TUN_SOCKET__RELABELTO, NULL); |
4447 | if (err) | 4464 | if (err) |
4448 | return err; | 4465 | return err; |
4449 | 4466 | tunsec->sid = sid; | |
4450 | sksec->sid = sid; | ||
4451 | 4467 | ||
4452 | return 0; | 4468 | return 0; |
4453 | } | 4469 | } |
@@ -5642,9 +5658,12 @@ static struct security_operations selinux_ops = { | |||
5642 | .secmark_refcount_inc = selinux_secmark_refcount_inc, | 5658 | .secmark_refcount_inc = selinux_secmark_refcount_inc, |
5643 | .secmark_refcount_dec = selinux_secmark_refcount_dec, | 5659 | .secmark_refcount_dec = selinux_secmark_refcount_dec, |
5644 | .req_classify_flow = selinux_req_classify_flow, | 5660 | .req_classify_flow = selinux_req_classify_flow, |
5661 | .tun_dev_alloc_security = selinux_tun_dev_alloc_security, | ||
5662 | .tun_dev_free_security = selinux_tun_dev_free_security, | ||
5645 | .tun_dev_create = selinux_tun_dev_create, | 5663 | .tun_dev_create = selinux_tun_dev_create, |
5646 | .tun_dev_post_create = selinux_tun_dev_post_create, | 5664 | .tun_dev_attach_queue = selinux_tun_dev_attach_queue, |
5647 | .tun_dev_attach = selinux_tun_dev_attach, | 5665 | .tun_dev_attach = selinux_tun_dev_attach, |
5666 | .tun_dev_open = selinux_tun_dev_open, | ||
5648 | 5667 | ||
5649 | #ifdef CONFIG_SECURITY_NETWORK_XFRM | 5668 | #ifdef CONFIG_SECURITY_NETWORK_XFRM |
5650 | .xfrm_policy_alloc_security = selinux_xfrm_policy_alloc, | 5669 | .xfrm_policy_alloc_security = selinux_xfrm_policy_alloc, |
diff --git a/security/selinux/include/classmap.h b/security/selinux/include/classmap.h index df2de54a958d..14d04e63b1f0 100644 --- a/security/selinux/include/classmap.h +++ b/security/selinux/include/classmap.h | |||
@@ -150,6 +150,6 @@ struct security_class_mapping secclass_map[] = { | |||
150 | NULL } }, | 150 | NULL } }, |
151 | { "kernel_service", { "use_as_override", "create_files_as", NULL } }, | 151 | { "kernel_service", { "use_as_override", "create_files_as", NULL } }, |
152 | { "tun_socket", | 152 | { "tun_socket", |
153 | { COMMON_SOCK_PERMS, NULL } }, | 153 | { COMMON_SOCK_PERMS, "attach_queue", NULL } }, |
154 | { NULL } | 154 | { NULL } |
155 | }; | 155 | }; |
diff --git a/security/selinux/include/objsec.h b/security/selinux/include/objsec.h index 26c7eee1c309..aa47bcabb5f6 100644 --- a/security/selinux/include/objsec.h +++ b/security/selinux/include/objsec.h | |||
@@ -110,6 +110,10 @@ struct sk_security_struct { | |||
110 | u16 sclass; /* sock security class */ | 110 | u16 sclass; /* sock security class */ |
111 | }; | 111 | }; |
112 | 112 | ||
113 | struct tun_security_struct { | ||
114 | u32 sid; /* SID for the tun device sockets */ | ||
115 | }; | ||
116 | |||
113 | struct key_security_struct { | 117 | struct key_security_struct { |
114 | u32 sid; /* SID of key */ | 118 | u32 sid; /* SID of key */ |
115 | }; | 119 | }; |
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c index 3a6e8731646c..ff427733c290 100644 --- a/security/selinux/selinuxfs.c +++ b/security/selinux/selinuxfs.c | |||
@@ -202,7 +202,7 @@ static ssize_t sel_read_handle_unknown(struct file *filp, char __user *buf, | |||
202 | { | 202 | { |
203 | char tmpbuf[TMPBUFLEN]; | 203 | char tmpbuf[TMPBUFLEN]; |
204 | ssize_t length; | 204 | ssize_t length; |
205 | ino_t ino = filp->f_path.dentry->d_inode->i_ino; | 205 | ino_t ino = file_inode(filp)->i_ino; |
206 | int handle_unknown = (ino == SEL_REJECT_UNKNOWN) ? | 206 | int handle_unknown = (ino == SEL_REJECT_UNKNOWN) ? |
207 | security_get_reject_unknown() : !security_get_allow_unknown(); | 207 | security_get_reject_unknown() : !security_get_allow_unknown(); |
208 | 208 | ||
@@ -671,7 +671,7 @@ static ssize_t (*write_op[])(struct file *, char *, size_t) = { | |||
671 | 671 | ||
672 | static ssize_t selinux_transaction_write(struct file *file, const char __user *buf, size_t size, loff_t *pos) | 672 | static ssize_t selinux_transaction_write(struct file *file, const char __user *buf, size_t size, loff_t *pos) |
673 | { | 673 | { |
674 | ino_t ino = file->f_path.dentry->d_inode->i_ino; | 674 | ino_t ino = file_inode(file)->i_ino; |
675 | char *data; | 675 | char *data; |
676 | ssize_t rv; | 676 | ssize_t rv; |
677 | 677 | ||
@@ -1042,8 +1042,7 @@ static ssize_t sel_read_bool(struct file *filep, char __user *buf, | |||
1042 | ssize_t length; | 1042 | ssize_t length; |
1043 | ssize_t ret; | 1043 | ssize_t ret; |
1044 | int cur_enforcing; | 1044 | int cur_enforcing; |
1045 | struct inode *inode = filep->f_path.dentry->d_inode; | 1045 | unsigned index = file_inode(filep)->i_ino & SEL_INO_MASK; |
1046 | unsigned index = inode->i_ino & SEL_INO_MASK; | ||
1047 | const char *name = filep->f_path.dentry->d_name.name; | 1046 | const char *name = filep->f_path.dentry->d_name.name; |
1048 | 1047 | ||
1049 | mutex_lock(&sel_mutex); | 1048 | mutex_lock(&sel_mutex); |
@@ -1077,8 +1076,7 @@ static ssize_t sel_write_bool(struct file *filep, const char __user *buf, | |||
1077 | char *page = NULL; | 1076 | char *page = NULL; |
1078 | ssize_t length; | 1077 | ssize_t length; |
1079 | int new_value; | 1078 | int new_value; |
1080 | struct inode *inode = filep->f_path.dentry->d_inode; | 1079 | unsigned index = file_inode(filep)->i_ino & SEL_INO_MASK; |
1081 | unsigned index = inode->i_ino & SEL_INO_MASK; | ||
1082 | const char *name = filep->f_path.dentry->d_name.name; | 1080 | const char *name = filep->f_path.dentry->d_name.name; |
1083 | 1081 | ||
1084 | mutex_lock(&sel_mutex); | 1082 | mutex_lock(&sel_mutex); |
@@ -1486,13 +1484,11 @@ static int sel_make_avc_files(struct dentry *dir) | |||
1486 | static ssize_t sel_read_initcon(struct file *file, char __user *buf, | 1484 | static ssize_t sel_read_initcon(struct file *file, char __user *buf, |
1487 | size_t count, loff_t *ppos) | 1485 | size_t count, loff_t *ppos) |
1488 | { | 1486 | { |
1489 | struct inode *inode; | ||
1490 | char *con; | 1487 | char *con; |
1491 | u32 sid, len; | 1488 | u32 sid, len; |
1492 | ssize_t ret; | 1489 | ssize_t ret; |
1493 | 1490 | ||
1494 | inode = file->f_path.dentry->d_inode; | 1491 | sid = file_inode(file)->i_ino&SEL_INO_MASK; |
1495 | sid = inode->i_ino&SEL_INO_MASK; | ||
1496 | ret = security_sid_to_context(sid, &con, &len); | 1492 | ret = security_sid_to_context(sid, &con, &len); |
1497 | if (ret) | 1493 | if (ret) |
1498 | return ret; | 1494 | return ret; |
@@ -1553,7 +1549,7 @@ static inline u32 sel_ino_to_perm(unsigned long ino) | |||
1553 | static ssize_t sel_read_class(struct file *file, char __user *buf, | 1549 | static ssize_t sel_read_class(struct file *file, char __user *buf, |
1554 | size_t count, loff_t *ppos) | 1550 | size_t count, loff_t *ppos) |
1555 | { | 1551 | { |
1556 | unsigned long ino = file->f_path.dentry->d_inode->i_ino; | 1552 | unsigned long ino = file_inode(file)->i_ino; |
1557 | char res[TMPBUFLEN]; | 1553 | char res[TMPBUFLEN]; |
1558 | ssize_t len = snprintf(res, sizeof(res), "%d", sel_ino_to_class(ino)); | 1554 | ssize_t len = snprintf(res, sizeof(res), "%d", sel_ino_to_class(ino)); |
1559 | return simple_read_from_buffer(buf, count, ppos, res, len); | 1555 | return simple_read_from_buffer(buf, count, ppos, res, len); |
@@ -1567,7 +1563,7 @@ static const struct file_operations sel_class_ops = { | |||
1567 | static ssize_t sel_read_perm(struct file *file, char __user *buf, | 1563 | static ssize_t sel_read_perm(struct file *file, char __user *buf, |
1568 | size_t count, loff_t *ppos) | 1564 | size_t count, loff_t *ppos) |
1569 | { | 1565 | { |
1570 | unsigned long ino = file->f_path.dentry->d_inode->i_ino; | 1566 | unsigned long ino = file_inode(file)->i_ino; |
1571 | char res[TMPBUFLEN]; | 1567 | char res[TMPBUFLEN]; |
1572 | ssize_t len = snprintf(res, sizeof(res), "%d", sel_ino_to_perm(ino)); | 1568 | ssize_t len = snprintf(res, sizeof(res), "%d", sel_ino_to_perm(ino)); |
1573 | return simple_read_from_buffer(buf, count, ppos, res, len); | 1569 | return simple_read_from_buffer(buf, count, ppos, res, len); |
@@ -1584,7 +1580,7 @@ static ssize_t sel_read_policycap(struct file *file, char __user *buf, | |||
1584 | int value; | 1580 | int value; |
1585 | char tmpbuf[TMPBUFLEN]; | 1581 | char tmpbuf[TMPBUFLEN]; |
1586 | ssize_t length; | 1582 | ssize_t length; |
1587 | unsigned long i_ino = file->f_path.dentry->d_inode->i_ino; | 1583 | unsigned long i_ino = file_inode(file)->i_ino; |
1588 | 1584 | ||
1589 | value = security_policycap_supported(i_ino & SEL_INO_MASK); | 1585 | value = security_policycap_supported(i_ino & SEL_INO_MASK); |
1590 | length = scnprintf(tmpbuf, TMPBUFLEN, "%d", value); | 1586 | length = scnprintf(tmpbuf, TMPBUFLEN, "%d", value); |