diff options
| author | Chris Zankel <chris@zankel.net> | 2014-02-24 03:34:36 -0500 |
|---|---|---|
| committer | Chris Zankel <chris@zankel.net> | 2014-02-24 03:34:36 -0500 |
| commit | b3fdfc1b4b641d372e35ced98814289bc60bc5d1 (patch) | |
| tree | 5f11d5ba885031dde45690745646519fb887f447 /security/selinux/hooks.c | |
| parent | c0e50d41126e4786d9cf1105bdf783e55c99f915 (diff) | |
| parent | f63b6d7555cd4064554b39da4d44c4cbbc9d6a4a (diff) | |
Merge tag 'xtensa-for-next-20140221-1' into for_next
Xtensa fixes for 3.14:
- allow booting xtfpga on boards with new uBoot and >128MBytes memory;
- drop nonexistent GPIO32 support from fsf variant;
- don't select USE_GENERIC_SMP_HELPERS;
- enable common clock framework support, set up ethoc clock on xtfpga;
- wire up sched_setattr and sched_getattr syscalls.
Signed-off-by: Chris Zankel <chris@zankel.net>
Diffstat (limited to 'security/selinux/hooks.c')
| -rw-r--r-- | security/selinux/hooks.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 6625699f497c..4b34847208cc 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
| @@ -82,7 +82,6 @@ | |||
| 82 | #include <linux/syslog.h> | 82 | #include <linux/syslog.h> |
| 83 | #include <linux/user_namespace.h> | 83 | #include <linux/user_namespace.h> |
| 84 | #include <linux/export.h> | 84 | #include <linux/export.h> |
| 85 | #include <linux/security.h> | ||
| 86 | #include <linux/msg.h> | 85 | #include <linux/msg.h> |
| 87 | #include <linux/shm.h> | 86 | #include <linux/shm.h> |
| 88 | 87 | ||
| @@ -234,6 +233,14 @@ static int inode_alloc_security(struct inode *inode) | |||
| 234 | return 0; | 233 | return 0; |
| 235 | } | 234 | } |
| 236 | 235 | ||
| 236 | static void inode_free_rcu(struct rcu_head *head) | ||
| 237 | { | ||
| 238 | struct inode_security_struct *isec; | ||
| 239 | |||
| 240 | isec = container_of(head, struct inode_security_struct, rcu); | ||
| 241 | kmem_cache_free(sel_inode_cache, isec); | ||
| 242 | } | ||
| 243 | |||
| 237 | static void inode_free_security(struct inode *inode) | 244 | static void inode_free_security(struct inode *inode) |
| 238 | { | 245 | { |
| 239 | struct inode_security_struct *isec = inode->i_security; | 246 | struct inode_security_struct *isec = inode->i_security; |
| @@ -244,8 +251,16 @@ static void inode_free_security(struct inode *inode) | |||
| 244 | list_del_init(&isec->list); | 251 | list_del_init(&isec->list); |
| 245 | spin_unlock(&sbsec->isec_lock); | 252 | spin_unlock(&sbsec->isec_lock); |
| 246 | 253 | ||
| 247 | inode->i_security = NULL; | 254 | /* |
| 248 | kmem_cache_free(sel_inode_cache, isec); | 255 | * The inode may still be referenced in a path walk and |
| 256 | * a call to selinux_inode_permission() can be made | ||
| 257 | * after inode_free_security() is called. Ideally, the VFS | ||
| 258 | * wouldn't do this, but fixing that is a much harder | ||
| 259 | * job. For now, simply free the i_security via RCU, and | ||
| 260 | * leave the current inode->i_security pointer intact. | ||
| 261 | * The inode will be freed after the RCU grace period too. | ||
| 262 | */ | ||
| 263 | call_rcu(&isec->rcu, inode_free_rcu); | ||
| 249 | } | 264 | } |
| 250 | 265 | ||
| 251 | static int file_alloc_security(struct file *file) | 266 | static int file_alloc_security(struct file *file) |
| @@ -4474,14 +4489,10 @@ static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb, | |||
| 4474 | { | 4489 | { |
| 4475 | struct sk_security_struct *sksec = sk->sk_security; | 4490 | struct sk_security_struct *sksec = sk->sk_security; |
| 4476 | int err; | 4491 | int err; |
| 4477 | u16 family = sk->sk_family; | 4492 | u16 family = req->rsk_ops->family; |
| 4478 | u32 connsid; | 4493 | u32 connsid; |
| 4479 | u32 peersid; | 4494 | u32 peersid; |
| 4480 | 4495 | ||
| 4481 | /* handle mapped IPv4 packets arriving via IPv6 sockets */ | ||
| 4482 | if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP)) | ||
| 4483 | family = PF_INET; | ||
| 4484 | |||
| 4485 | err = selinux_skb_peerlbl_sid(skb, family, &peersid); | 4496 | err = selinux_skb_peerlbl_sid(skb, family, &peersid); |
| 4486 | if (err) | 4497 | if (err) |
| 4487 | return err; | 4498 | return err; |
