diff options
| author | Anton Altaparmakov <aia21@cantab.net> | 2006-01-19 11:39:33 -0500 |
|---|---|---|
| committer | Anton Altaparmakov <aia21@cantab.net> | 2006-01-19 11:39:33 -0500 |
| commit | 944d79559d154c12becde0dab327016cf438f46c (patch) | |
| tree | 50c101806f4d3b6585222dda060559eb4f3e005a /security/selinux/hooks.c | |
| parent | d087e4bdd24ebe3ae3d0b265b6573ec901af4b4b (diff) | |
| parent | 0f36b018b2e314d45af86449f1a97facb1fbe300 (diff) | |
Merge branch 'master' of /usr/src/ntfs-2.6/
Diffstat (limited to 'security/selinux/hooks.c')
| -rw-r--r-- | security/selinux/hooks.c | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index fc774436a264..b9f8d9731c3d 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
| @@ -73,6 +73,7 @@ | |||
| 73 | #include "avc.h" | 73 | #include "avc.h" |
| 74 | #include "objsec.h" | 74 | #include "objsec.h" |
| 75 | #include "netif.h" | 75 | #include "netif.h" |
| 76 | #include "xfrm.h" | ||
| 76 | 77 | ||
| 77 | #define XATTR_SELINUX_SUFFIX "selinux" | 78 | #define XATTR_SELINUX_SUFFIX "selinux" |
| 78 | #define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX | 79 | #define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX |
| @@ -1018,7 +1019,7 @@ static inline int dentry_has_perm(struct task_struct *tsk, | |||
| 1018 | has the same SID as the process. If av is zero, then | 1019 | has the same SID as the process. If av is zero, then |
| 1019 | access to the file is not checked, e.g. for cases | 1020 | access to the file is not checked, e.g. for cases |
| 1020 | where only the descriptor is affected like seek. */ | 1021 | where only the descriptor is affected like seek. */ |
| 1021 | static inline int file_has_perm(struct task_struct *tsk, | 1022 | static int file_has_perm(struct task_struct *tsk, |
| 1022 | struct file *file, | 1023 | struct file *file, |
| 1023 | u32 av) | 1024 | u32 av) |
| 1024 | { | 1025 | { |
| @@ -1662,7 +1663,7 @@ static inline void flush_unauthorized_files(struct files_struct * files) | |||
| 1662 | continue; | 1663 | continue; |
| 1663 | } | 1664 | } |
| 1664 | if (devnull) { | 1665 | if (devnull) { |
| 1665 | rcuref_inc(&devnull->f_count); | 1666 | get_file(devnull); |
| 1666 | } else { | 1667 | } else { |
| 1667 | devnull = dentry_open(dget(selinux_null), mntget(selinuxfs_mount), O_RDWR); | 1668 | devnull = dentry_open(dget(selinux_null), mntget(selinuxfs_mount), O_RDWR); |
| 1668 | if (!devnull) { | 1669 | if (!devnull) { |
| @@ -3349,6 +3350,10 @@ static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) | |||
| 3349 | err = avc_has_perm(sock_sid, port_sid, | 3350 | err = avc_has_perm(sock_sid, port_sid, |
| 3350 | sock_class, recv_perm, &ad); | 3351 | sock_class, recv_perm, &ad); |
| 3351 | } | 3352 | } |
| 3353 | |||
| 3354 | if (!err) | ||
| 3355 | err = selinux_xfrm_sock_rcv_skb(sock_sid, skb); | ||
| 3356 | |||
| 3352 | out: | 3357 | out: |
| 3353 | return err; | 3358 | return err; |
| 3354 | } | 3359 | } |
| @@ -3401,6 +3406,24 @@ static void selinux_sk_free_security(struct sock *sk) | |||
| 3401 | sk_free_security(sk); | 3406 | sk_free_security(sk); |
| 3402 | } | 3407 | } |
| 3403 | 3408 | ||
| 3409 | static unsigned int selinux_sk_getsid_security(struct sock *sk, struct flowi *fl, u8 dir) | ||
| 3410 | { | ||
| 3411 | struct inode_security_struct *isec; | ||
| 3412 | u32 sock_sid = SECINITSID_ANY_SOCKET; | ||
| 3413 | |||
| 3414 | if (!sk) | ||
| 3415 | return selinux_no_sk_sid(fl); | ||
| 3416 | |||
| 3417 | read_lock_bh(&sk->sk_callback_lock); | ||
| 3418 | isec = get_sock_isec(sk); | ||
| 3419 | |||
| 3420 | if (isec) | ||
| 3421 | sock_sid = isec->sid; | ||
| 3422 | |||
| 3423 | read_unlock_bh(&sk->sk_callback_lock); | ||
| 3424 | return sock_sid; | ||
| 3425 | } | ||
| 3426 | |||
| 3404 | static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb) | 3427 | static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb) |
| 3405 | { | 3428 | { |
| 3406 | int err = 0; | 3429 | int err = 0; |
| @@ -3536,6 +3559,11 @@ static unsigned int selinux_ip_postroute_last(unsigned int hooknum, | |||
| 3536 | send_perm, &ad) ? NF_DROP : NF_ACCEPT; | 3559 | send_perm, &ad) ? NF_DROP : NF_ACCEPT; |
| 3537 | } | 3560 | } |
| 3538 | 3561 | ||
| 3562 | if (err != NF_ACCEPT) | ||
| 3563 | goto out; | ||
| 3564 | |||
| 3565 | err = selinux_xfrm_postroute_last(isec->sid, skb); | ||
| 3566 | |||
| 3539 | out: | 3567 | out: |
| 3540 | return err; | 3568 | return err; |
| 3541 | } | 3569 | } |
| @@ -4380,6 +4408,16 @@ static struct security_operations selinux_ops = { | |||
| 4380 | .socket_getpeersec = selinux_socket_getpeersec, | 4408 | .socket_getpeersec = selinux_socket_getpeersec, |
| 4381 | .sk_alloc_security = selinux_sk_alloc_security, | 4409 | .sk_alloc_security = selinux_sk_alloc_security, |
| 4382 | .sk_free_security = selinux_sk_free_security, | 4410 | .sk_free_security = selinux_sk_free_security, |
| 4411 | .sk_getsid = selinux_sk_getsid_security, | ||
| 4412 | #endif | ||
| 4413 | |||
| 4414 | #ifdef CONFIG_SECURITY_NETWORK_XFRM | ||
| 4415 | .xfrm_policy_alloc_security = selinux_xfrm_policy_alloc, | ||
| 4416 | .xfrm_policy_clone_security = selinux_xfrm_policy_clone, | ||
| 4417 | .xfrm_policy_free_security = selinux_xfrm_policy_free, | ||
| 4418 | .xfrm_state_alloc_security = selinux_xfrm_state_alloc, | ||
| 4419 | .xfrm_state_free_security = selinux_xfrm_state_free, | ||
| 4420 | .xfrm_policy_lookup = selinux_xfrm_policy_lookup, | ||
| 4383 | #endif | 4421 | #endif |
| 4384 | }; | 4422 | }; |
| 4385 | 4423 | ||
| @@ -4491,6 +4529,7 @@ static int __init selinux_nf_ip_init(void) | |||
| 4491 | panic("SELinux: nf_register_hook for IPv6: error %d\n", err); | 4529 | panic("SELinux: nf_register_hook for IPv6: error %d\n", err); |
| 4492 | 4530 | ||
| 4493 | #endif /* IPV6 */ | 4531 | #endif /* IPV6 */ |
| 4532 | |||
| 4494 | out: | 4533 | out: |
| 4495 | return err; | 4534 | return err; |
| 4496 | } | 4535 | } |
