diff options
Diffstat (limited to 'include/linux/security.h')
-rw-r--r-- | include/linux/security.h | 342 |
1 files changed, 286 insertions, 56 deletions
diff --git a/include/linux/security.h b/include/linux/security.h index d2c17bd91a2..9b5fea81f55 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
@@ -31,6 +31,8 @@ | |||
31 | #include <linux/msg.h> | 31 | #include <linux/msg.h> |
32 | #include <linux/sched.h> | 32 | #include <linux/sched.h> |
33 | #include <linux/key.h> | 33 | #include <linux/key.h> |
34 | #include <linux/xfrm.h> | ||
35 | #include <net/flow.h> | ||
34 | 36 | ||
35 | struct ctl_table; | 37 | struct ctl_table; |
36 | 38 | ||
@@ -67,7 +69,7 @@ struct xfrm_state; | |||
67 | struct xfrm_user_sec_ctx; | 69 | struct xfrm_user_sec_ctx; |
68 | 70 | ||
69 | extern int cap_netlink_send(struct sock *sk, struct sk_buff *skb); | 71 | extern int cap_netlink_send(struct sock *sk, struct sk_buff *skb); |
70 | extern int cap_netlink_recv(struct sk_buff *skb); | 72 | extern int cap_netlink_recv(struct sk_buff *skb, int cap); |
71 | 73 | ||
72 | /* | 74 | /* |
73 | * Values used in the task_security_ops calls | 75 | * Values used in the task_security_ops calls |
@@ -88,6 +90,7 @@ extern int cap_netlink_recv(struct sk_buff *skb); | |||
88 | struct nfsctl_arg; | 90 | struct nfsctl_arg; |
89 | struct sched_param; | 91 | struct sched_param; |
90 | struct swap_info_struct; | 92 | struct swap_info_struct; |
93 | struct request_sock; | ||
91 | 94 | ||
92 | /* bprm_apply_creds unsafe reasons */ | 95 | /* bprm_apply_creds unsafe reasons */ |
93 | #define LSM_UNSAFE_SHARE 1 | 96 | #define LSM_UNSAFE_SHARE 1 |
@@ -567,6 +570,9 @@ struct swap_info_struct; | |||
567 | * @p. | 570 | * @p. |
568 | * @p contains the task_struct for the process. | 571 | * @p contains the task_struct for the process. |
569 | * Return 0 if permission is granted. | 572 | * Return 0 if permission is granted. |
573 | * @task_getsecid: | ||
574 | * Retrieve the security identifier of the process @p. | ||
575 | * @p contains the task_struct for the process and place is into @secid. | ||
570 | * @task_setgroups: | 576 | * @task_setgroups: |
571 | * Check permission before setting the supplementary group set of the | 577 | * Check permission before setting the supplementary group set of the |
572 | * current process. | 578 | * current process. |
@@ -582,6 +588,10 @@ struct swap_info_struct; | |||
582 | * @p contains the task_struct of process. | 588 | * @p contains the task_struct of process. |
583 | * @ioprio contains the new ioprio value | 589 | * @ioprio contains the new ioprio value |
584 | * Return 0 if permission is granted. | 590 | * Return 0 if permission is granted. |
591 | * @task_getioprio | ||
592 | * Check permission before getting the ioprio value of @p. | ||
593 | * @p contains the task_struct of process. | ||
594 | * Return 0 if permission is granted. | ||
585 | * @task_setrlimit: | 595 | * @task_setrlimit: |
586 | * Check permission before setting the resource limits of the current | 596 | * Check permission before setting the resource limits of the current |
587 | * process for @resource to @new_rlim. The old resource limit values can | 597 | * process for @resource to @new_rlim. The old resource limit values can |
@@ -615,6 +625,7 @@ struct swap_info_struct; | |||
615 | * @p contains the task_struct for process. | 625 | * @p contains the task_struct for process. |
616 | * @info contains the signal information. | 626 | * @info contains the signal information. |
617 | * @sig contains the signal value. | 627 | * @sig contains the signal value. |
628 | * @secid contains the sid of the process where the signal originated | ||
618 | * Return 0 if permission is granted. | 629 | * Return 0 if permission is granted. |
619 | * @task_wait: | 630 | * @task_wait: |
620 | * Check permission before allowing a process to reap a child process @p | 631 | * Check permission before allowing a process to reap a child process @p |
@@ -656,6 +667,7 @@ struct swap_info_struct; | |||
656 | * Check permission before processing the received netlink message in | 667 | * Check permission before processing the received netlink message in |
657 | * @skb. | 668 | * @skb. |
658 | * @skb contains the sk_buff structure for the netlink message. | 669 | * @skb contains the sk_buff structure for the netlink message. |
670 | * @cap indicates the capability required | ||
659 | * Return 0 if permission is granted. | 671 | * Return 0 if permission is granted. |
660 | * | 672 | * |
661 | * Security hooks for Unix domain networking. | 673 | * Security hooks for Unix domain networking. |
@@ -803,9 +815,19 @@ struct swap_info_struct; | |||
803 | * which is used to copy security attributes between local stream sockets. | 815 | * which is used to copy security attributes between local stream sockets. |
804 | * @sk_free_security: | 816 | * @sk_free_security: |
805 | * Deallocate security structure. | 817 | * Deallocate security structure. |
806 | * @sk_getsid: | 818 | * @sk_clone_security: |
807 | * Retrieve the LSM-specific sid for the sock to enable caching of network | 819 | * Clone/copy security structure. |
820 | * @sk_getsecid: | ||
821 | * Retrieve the LSM-specific secid for the sock to enable caching of network | ||
808 | * authorizations. | 822 | * authorizations. |
823 | * @sock_graft: | ||
824 | * Sets the socket's isec sid to the sock's sid. | ||
825 | * @inet_conn_request: | ||
826 | * Sets the openreq's sid to socket's sid with MLS portion taken from peer sid. | ||
827 | * @inet_csk_clone: | ||
828 | * Sets the new child socket's sid to the openreq sid. | ||
829 | * @req_classify_flow: | ||
830 | * Sets the flow's sid to the openreq sid. | ||
809 | * | 831 | * |
810 | * Security hooks for XFRM operations. | 832 | * Security hooks for XFRM operations. |
811 | * | 833 | * |
@@ -814,9 +836,10 @@ struct swap_info_struct; | |||
814 | * used by the XFRM system. | 836 | * used by the XFRM system. |
815 | * @sec_ctx contains the security context information being provided by | 837 | * @sec_ctx contains the security context information being provided by |
816 | * the user-level policy update program (e.g., setkey). | 838 | * the user-level policy update program (e.g., setkey). |
817 | * Allocate a security structure to the xp->security field. | 839 | * @sk refers to the sock from which to derive the security context. |
818 | * The security field is initialized to NULL when the xfrm_policy is | 840 | * Allocate a security structure to the xp->security field; the security |
819 | * allocated. | 841 | * field is initialized to NULL when the xfrm_policy is allocated. Only |
842 | * one of sec_ctx or sock can be specified. | ||
820 | * Return 0 if operation was successful (memory to allocate, legal context) | 843 | * Return 0 if operation was successful (memory to allocate, legal context) |
821 | * @xfrm_policy_clone_security: | 844 | * @xfrm_policy_clone_security: |
822 | * @old contains an existing xfrm_policy in the SPD. | 845 | * @old contains an existing xfrm_policy in the SPD. |
@@ -835,9 +858,14 @@ struct swap_info_struct; | |||
835 | * Database by the XFRM system. | 858 | * Database by the XFRM system. |
836 | * @sec_ctx contains the security context information being provided by | 859 | * @sec_ctx contains the security context information being provided by |
837 | * the user-level SA generation program (e.g., setkey or racoon). | 860 | * the user-level SA generation program (e.g., setkey or racoon). |
838 | * Allocate a security structure to the x->security field. The | 861 | * @polsec contains the security context information associated with a xfrm |
839 | * security field is initialized to NULL when the xfrm_state is | 862 | * policy rule from which to take the base context. polsec must be NULL |
840 | * allocated. | 863 | * when sec_ctx is specified. |
864 | * @secid contains the secid from which to take the mls portion of the context. | ||
865 | * Allocate a security structure to the x->security field; the security | ||
866 | * field is initialized to NULL when the xfrm_state is allocated. Set the | ||
867 | * context to correspond to either sec_ctx or polsec, with the mls portion | ||
868 | * taken from secid in the latter case. | ||
841 | * Return 0 if operation was successful (memory to allocate, legal context). | 869 | * Return 0 if operation was successful (memory to allocate, legal context). |
842 | * @xfrm_state_free_security: | 870 | * @xfrm_state_free_security: |
843 | * @x contains the xfrm_state. | 871 | * @x contains the xfrm_state. |
@@ -848,13 +876,27 @@ struct swap_info_struct; | |||
848 | * @xfrm_policy_lookup: | 876 | * @xfrm_policy_lookup: |
849 | * @xp contains the xfrm_policy for which the access control is being | 877 | * @xp contains the xfrm_policy for which the access control is being |
850 | * checked. | 878 | * checked. |
851 | * @sk_sid contains the sock security label that is used to authorize | 879 | * @fl_secid contains the flow security label that is used to authorize |
852 | * access to the policy xp. | 880 | * access to the policy xp. |
853 | * @dir contains the direction of the flow (input or output). | 881 | * @dir contains the direction of the flow (input or output). |
854 | * Check permission when a sock selects a xfrm_policy for processing | 882 | * Check permission when a flow selects a xfrm_policy for processing |
855 | * XFRMs on a packet. The hook is called when selecting either a | 883 | * XFRMs on a packet. The hook is called when selecting either a |
856 | * per-socket policy or a generic xfrm policy. | 884 | * per-socket policy or a generic xfrm policy. |
857 | * Return 0 if permission is granted. | 885 | * Return 0 if permission is granted. |
886 | * @xfrm_state_pol_flow_match: | ||
887 | * @x contains the state to match. | ||
888 | * @xp contains the policy to check for a match. | ||
889 | * @fl contains the flow to check for a match. | ||
890 | * Return 1 if there is a match. | ||
891 | * @xfrm_flow_state_match: | ||
892 | * @fl contains the flow key to match. | ||
893 | * @xfrm points to the xfrm_state to match. | ||
894 | * Return 1 if there is a match. | ||
895 | * @xfrm_decode_session: | ||
896 | * @skb points to skb to decode. | ||
897 | * @secid points to the flow key secid to set. | ||
898 | * @ckall says if all xfrms used should be checked for same secid. | ||
899 | * Return 0 if ckall is zero or all xfrms used have the same secid. | ||
858 | * | 900 | * |
859 | * Security hooks affecting all Key Management operations | 901 | * Security hooks affecting all Key Management operations |
860 | * | 902 | * |
@@ -862,6 +904,7 @@ struct swap_info_struct; | |||
862 | * Permit allocation of a key and assign security data. Note that key does | 904 | * Permit allocation of a key and assign security data. Note that key does |
863 | * not have a serial number assigned at this point. | 905 | * not have a serial number assigned at this point. |
864 | * @key points to the key. | 906 | * @key points to the key. |
907 | * @flags is the allocation flags | ||
865 | * Return 0 if permission is granted, -ve error otherwise. | 908 | * Return 0 if permission is granted, -ve error otherwise. |
866 | * @key_free: | 909 | * @key_free: |
867 | * Notification of destruction; free security data. | 910 | * Notification of destruction; free security data. |
@@ -1099,6 +1142,16 @@ struct swap_info_struct; | |||
1099 | * @name contains the name of the security module being unstacked. | 1142 | * @name contains the name of the security module being unstacked. |
1100 | * @ops contains a pointer to the struct security_operations of the module to unstack. | 1143 | * @ops contains a pointer to the struct security_operations of the module to unstack. |
1101 | * | 1144 | * |
1145 | * @secid_to_secctx: | ||
1146 | * Convert secid to security context. | ||
1147 | * @secid contains the security ID. | ||
1148 | * @secdata contains the pointer that stores the converted security context. | ||
1149 | * | ||
1150 | * @release_secctx: | ||
1151 | * Release the security context. | ||
1152 | * @secdata contains the security context. | ||
1153 | * @seclen contains the length of the security context. | ||
1154 | * | ||
1102 | * This is the main security structure. | 1155 | * This is the main security structure. |
1103 | */ | 1156 | */ |
1104 | struct security_operations { | 1157 | struct security_operations { |
@@ -1217,16 +1270,18 @@ struct security_operations { | |||
1217 | int (*task_setpgid) (struct task_struct * p, pid_t pgid); | 1270 | int (*task_setpgid) (struct task_struct * p, pid_t pgid); |
1218 | int (*task_getpgid) (struct task_struct * p); | 1271 | int (*task_getpgid) (struct task_struct * p); |
1219 | int (*task_getsid) (struct task_struct * p); | 1272 | int (*task_getsid) (struct task_struct * p); |
1273 | void (*task_getsecid) (struct task_struct * p, u32 * secid); | ||
1220 | int (*task_setgroups) (struct group_info *group_info); | 1274 | int (*task_setgroups) (struct group_info *group_info); |
1221 | int (*task_setnice) (struct task_struct * p, int nice); | 1275 | int (*task_setnice) (struct task_struct * p, int nice); |
1222 | int (*task_setioprio) (struct task_struct * p, int ioprio); | 1276 | int (*task_setioprio) (struct task_struct * p, int ioprio); |
1277 | int (*task_getioprio) (struct task_struct * p); | ||
1223 | int (*task_setrlimit) (unsigned int resource, struct rlimit * new_rlim); | 1278 | int (*task_setrlimit) (unsigned int resource, struct rlimit * new_rlim); |
1224 | int (*task_setscheduler) (struct task_struct * p, int policy, | 1279 | int (*task_setscheduler) (struct task_struct * p, int policy, |
1225 | struct sched_param * lp); | 1280 | struct sched_param * lp); |
1226 | int (*task_getscheduler) (struct task_struct * p); | 1281 | int (*task_getscheduler) (struct task_struct * p); |
1227 | int (*task_movememory) (struct task_struct * p); | 1282 | int (*task_movememory) (struct task_struct * p); |
1228 | int (*task_kill) (struct task_struct * p, | 1283 | int (*task_kill) (struct task_struct * p, |
1229 | struct siginfo * info, int sig); | 1284 | struct siginfo * info, int sig, u32 secid); |
1230 | int (*task_wait) (struct task_struct * p); | 1285 | int (*task_wait) (struct task_struct * p); |
1231 | int (*task_prctl) (int option, unsigned long arg2, | 1286 | int (*task_prctl) (int option, unsigned long arg2, |
1232 | unsigned long arg3, unsigned long arg4, | 1287 | unsigned long arg3, unsigned long arg4, |
@@ -1265,7 +1320,7 @@ struct security_operations { | |||
1265 | struct sembuf * sops, unsigned nsops, int alter); | 1320 | struct sembuf * sops, unsigned nsops, int alter); |
1266 | 1321 | ||
1267 | int (*netlink_send) (struct sock * sk, struct sk_buff * skb); | 1322 | int (*netlink_send) (struct sock * sk, struct sk_buff * skb); |
1268 | int (*netlink_recv) (struct sk_buff * skb); | 1323 | int (*netlink_recv) (struct sk_buff * skb, int cap); |
1269 | 1324 | ||
1270 | /* allow module stacking */ | 1325 | /* allow module stacking */ |
1271 | int (*register_security) (const char *name, | 1326 | int (*register_security) (const char *name, |
@@ -1277,6 +1332,8 @@ struct security_operations { | |||
1277 | 1332 | ||
1278 | int (*getprocattr)(struct task_struct *p, char *name, void *value, size_t size); | 1333 | int (*getprocattr)(struct task_struct *p, char *name, void *value, size_t size); |
1279 | int (*setprocattr)(struct task_struct *p, char *name, void *value, size_t size); | 1334 | int (*setprocattr)(struct task_struct *p, char *name, void *value, size_t size); |
1335 | int (*secid_to_secctx)(u32 secid, char **secdata, u32 *seclen); | ||
1336 | void (*release_secctx)(char *secdata, u32 seclen); | ||
1280 | 1337 | ||
1281 | #ifdef CONFIG_SECURITY_NETWORK | 1338 | #ifdef CONFIG_SECURITY_NETWORK |
1282 | int (*unix_stream_connect) (struct socket * sock, | 1339 | int (*unix_stream_connect) (struct socket * sock, |
@@ -1284,8 +1341,8 @@ struct security_operations { | |||
1284 | int (*unix_may_send) (struct socket * sock, struct socket * other); | 1341 | int (*unix_may_send) (struct socket * sock, struct socket * other); |
1285 | 1342 | ||
1286 | int (*socket_create) (int family, int type, int protocol, int kern); | 1343 | int (*socket_create) (int family, int type, int protocol, int kern); |
1287 | void (*socket_post_create) (struct socket * sock, int family, | 1344 | int (*socket_post_create) (struct socket * sock, int family, |
1288 | int type, int protocol, int kern); | 1345 | int type, int protocol, int kern); |
1289 | int (*socket_bind) (struct socket * sock, | 1346 | int (*socket_bind) (struct socket * sock, |
1290 | struct sockaddr * address, int addrlen); | 1347 | struct sockaddr * address, int addrlen); |
1291 | int (*socket_connect) (struct socket * sock, | 1348 | int (*socket_connect) (struct socket * sock, |
@@ -1305,26 +1362,39 @@ struct security_operations { | |||
1305 | int (*socket_shutdown) (struct socket * sock, int how); | 1362 | int (*socket_shutdown) (struct socket * sock, int how); |
1306 | int (*socket_sock_rcv_skb) (struct sock * sk, struct sk_buff * skb); | 1363 | int (*socket_sock_rcv_skb) (struct sock * sk, struct sk_buff * skb); |
1307 | int (*socket_getpeersec_stream) (struct socket *sock, char __user *optval, int __user *optlen, unsigned len); | 1364 | int (*socket_getpeersec_stream) (struct socket *sock, char __user *optval, int __user *optlen, unsigned len); |
1308 | int (*socket_getpeersec_dgram) (struct sk_buff *skb, char **secdata, u32 *seclen); | 1365 | int (*socket_getpeersec_dgram) (struct socket *sock, struct sk_buff *skb, u32 *secid); |
1309 | int (*sk_alloc_security) (struct sock *sk, int family, gfp_t priority); | 1366 | int (*sk_alloc_security) (struct sock *sk, int family, gfp_t priority); |
1310 | void (*sk_free_security) (struct sock *sk); | 1367 | void (*sk_free_security) (struct sock *sk); |
1311 | unsigned int (*sk_getsid) (struct sock *sk, struct flowi *fl, u8 dir); | 1368 | void (*sk_clone_security) (const struct sock *sk, struct sock *newsk); |
1369 | void (*sk_getsecid) (struct sock *sk, u32 *secid); | ||
1370 | void (*sock_graft)(struct sock* sk, struct socket *parent); | ||
1371 | int (*inet_conn_request)(struct sock *sk, struct sk_buff *skb, | ||
1372 | struct request_sock *req); | ||
1373 | void (*inet_csk_clone)(struct sock *newsk, const struct request_sock *req); | ||
1374 | void (*req_classify_flow)(const struct request_sock *req, struct flowi *fl); | ||
1312 | #endif /* CONFIG_SECURITY_NETWORK */ | 1375 | #endif /* CONFIG_SECURITY_NETWORK */ |
1313 | 1376 | ||
1314 | #ifdef CONFIG_SECURITY_NETWORK_XFRM | 1377 | #ifdef CONFIG_SECURITY_NETWORK_XFRM |
1315 | int (*xfrm_policy_alloc_security) (struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx); | 1378 | int (*xfrm_policy_alloc_security) (struct xfrm_policy *xp, |
1379 | struct xfrm_user_sec_ctx *sec_ctx, struct sock *sk); | ||
1316 | int (*xfrm_policy_clone_security) (struct xfrm_policy *old, struct xfrm_policy *new); | 1380 | int (*xfrm_policy_clone_security) (struct xfrm_policy *old, struct xfrm_policy *new); |
1317 | void (*xfrm_policy_free_security) (struct xfrm_policy *xp); | 1381 | void (*xfrm_policy_free_security) (struct xfrm_policy *xp); |
1318 | int (*xfrm_policy_delete_security) (struct xfrm_policy *xp); | 1382 | int (*xfrm_policy_delete_security) (struct xfrm_policy *xp); |
1319 | int (*xfrm_state_alloc_security) (struct xfrm_state *x, struct xfrm_user_sec_ctx *sec_ctx); | 1383 | int (*xfrm_state_alloc_security) (struct xfrm_state *x, |
1384 | struct xfrm_user_sec_ctx *sec_ctx, struct xfrm_sec_ctx *polsec, | ||
1385 | u32 secid); | ||
1320 | void (*xfrm_state_free_security) (struct xfrm_state *x); | 1386 | void (*xfrm_state_free_security) (struct xfrm_state *x); |
1321 | int (*xfrm_state_delete_security) (struct xfrm_state *x); | 1387 | int (*xfrm_state_delete_security) (struct xfrm_state *x); |
1322 | int (*xfrm_policy_lookup)(struct xfrm_policy *xp, u32 sk_sid, u8 dir); | 1388 | int (*xfrm_policy_lookup)(struct xfrm_policy *xp, u32 fl_secid, u8 dir); |
1389 | int (*xfrm_state_pol_flow_match)(struct xfrm_state *x, | ||
1390 | struct xfrm_policy *xp, struct flowi *fl); | ||
1391 | int (*xfrm_flow_state_match)(struct flowi *fl, struct xfrm_state *xfrm); | ||
1392 | int (*xfrm_decode_session)(struct sk_buff *skb, u32 *secid, int ckall); | ||
1323 | #endif /* CONFIG_SECURITY_NETWORK_XFRM */ | 1393 | #endif /* CONFIG_SECURITY_NETWORK_XFRM */ |
1324 | 1394 | ||
1325 | /* key management security hooks */ | 1395 | /* key management security hooks */ |
1326 | #ifdef CONFIG_KEYS | 1396 | #ifdef CONFIG_KEYS |
1327 | int (*key_alloc)(struct key *key, struct task_struct *tsk); | 1397 | int (*key_alloc)(struct key *key, struct task_struct *tsk, unsigned long flags); |
1328 | void (*key_free)(struct key *key); | 1398 | void (*key_free)(struct key *key); |
1329 | int (*key_permission)(key_ref_t key_ref, | 1399 | int (*key_permission)(key_ref_t key_ref, |
1330 | struct task_struct *context, | 1400 | struct task_struct *context, |
@@ -1525,6 +1595,7 @@ static inline void security_sb_post_pivotroot (struct nameidata *old_nd, | |||
1525 | 1595 | ||
1526 | static inline int security_inode_alloc (struct inode *inode) | 1596 | static inline int security_inode_alloc (struct inode *inode) |
1527 | { | 1597 | { |
1598 | inode->i_security = NULL; | ||
1528 | return security_ops->inode_alloc_security (inode); | 1599 | return security_ops->inode_alloc_security (inode); |
1529 | } | 1600 | } |
1530 | 1601 | ||
@@ -1837,6 +1908,11 @@ static inline int security_task_getsid (struct task_struct *p) | |||
1837 | return security_ops->task_getsid (p); | 1908 | return security_ops->task_getsid (p); |
1838 | } | 1909 | } |
1839 | 1910 | ||
1911 | static inline void security_task_getsecid (struct task_struct *p, u32 *secid) | ||
1912 | { | ||
1913 | security_ops->task_getsecid (p, secid); | ||
1914 | } | ||
1915 | |||
1840 | static inline int security_task_setgroups (struct group_info *group_info) | 1916 | static inline int security_task_setgroups (struct group_info *group_info) |
1841 | { | 1917 | { |
1842 | return security_ops->task_setgroups (group_info); | 1918 | return security_ops->task_setgroups (group_info); |
@@ -1852,6 +1928,11 @@ static inline int security_task_setioprio (struct task_struct *p, int ioprio) | |||
1852 | return security_ops->task_setioprio (p, ioprio); | 1928 | return security_ops->task_setioprio (p, ioprio); |
1853 | } | 1929 | } |
1854 | 1930 | ||
1931 | static inline int security_task_getioprio (struct task_struct *p) | ||
1932 | { | ||
1933 | return security_ops->task_getioprio (p); | ||
1934 | } | ||
1935 | |||
1855 | static inline int security_task_setrlimit (unsigned int resource, | 1936 | static inline int security_task_setrlimit (unsigned int resource, |
1856 | struct rlimit *new_rlim) | 1937 | struct rlimit *new_rlim) |
1857 | { | 1938 | { |
@@ -1876,9 +1957,10 @@ static inline int security_task_movememory (struct task_struct *p) | |||
1876 | } | 1957 | } |
1877 | 1958 | ||
1878 | static inline int security_task_kill (struct task_struct *p, | 1959 | static inline int security_task_kill (struct task_struct *p, |
1879 | struct siginfo *info, int sig) | 1960 | struct siginfo *info, int sig, |
1961 | u32 secid) | ||
1880 | { | 1962 | { |
1881 | return security_ops->task_kill (p, info, sig); | 1963 | return security_ops->task_kill (p, info, sig, secid); |
1882 | } | 1964 | } |
1883 | 1965 | ||
1884 | static inline int security_task_wait (struct task_struct *p) | 1966 | static inline int security_task_wait (struct task_struct *p) |
@@ -2031,9 +2113,19 @@ static inline int security_netlink_send(struct sock *sk, struct sk_buff * skb) | |||
2031 | return security_ops->netlink_send(sk, skb); | 2113 | return security_ops->netlink_send(sk, skb); |
2032 | } | 2114 | } |
2033 | 2115 | ||
2034 | static inline int security_netlink_recv(struct sk_buff * skb) | 2116 | static inline int security_netlink_recv(struct sk_buff * skb, int cap) |
2117 | { | ||
2118 | return security_ops->netlink_recv(skb, cap); | ||
2119 | } | ||
2120 | |||
2121 | static inline int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) | ||
2035 | { | 2122 | { |
2036 | return security_ops->netlink_recv(skb); | 2123 | return security_ops->secid_to_secctx(secid, secdata, seclen); |
2124 | } | ||
2125 | |||
2126 | static inline void security_release_secctx(char *secdata, u32 seclen) | ||
2127 | { | ||
2128 | return security_ops->release_secctx(secdata, seclen); | ||
2037 | } | 2129 | } |
2038 | 2130 | ||
2039 | /* prototypes */ | 2131 | /* prototypes */ |
@@ -2489,6 +2581,9 @@ static inline int security_task_getsid (struct task_struct *p) | |||
2489 | return 0; | 2581 | return 0; |
2490 | } | 2582 | } |
2491 | 2583 | ||
2584 | static inline void security_task_getsecid (struct task_struct *p, u32 *secid) | ||
2585 | { } | ||
2586 | |||
2492 | static inline int security_task_setgroups (struct group_info *group_info) | 2587 | static inline int security_task_setgroups (struct group_info *group_info) |
2493 | { | 2588 | { |
2494 | return 0; | 2589 | return 0; |
@@ -2504,6 +2599,11 @@ static inline int security_task_setioprio (struct task_struct *p, int ioprio) | |||
2504 | return 0; | 2599 | return 0; |
2505 | } | 2600 | } |
2506 | 2601 | ||
2602 | static inline int security_task_getioprio (struct task_struct *p) | ||
2603 | { | ||
2604 | return 0; | ||
2605 | } | ||
2606 | |||
2507 | static inline int security_task_setrlimit (unsigned int resource, | 2607 | static inline int security_task_setrlimit (unsigned int resource, |
2508 | struct rlimit *new_rlim) | 2608 | struct rlimit *new_rlim) |
2509 | { | 2609 | { |
@@ -2528,7 +2628,8 @@ static inline int security_task_movememory (struct task_struct *p) | |||
2528 | } | 2628 | } |
2529 | 2629 | ||
2530 | static inline int security_task_kill (struct task_struct *p, | 2630 | static inline int security_task_kill (struct task_struct *p, |
2531 | struct siginfo *info, int sig) | 2631 | struct siginfo *info, int sig, |
2632 | u32 secid) | ||
2532 | { | 2633 | { |
2533 | return 0; | 2634 | return 0; |
2534 | } | 2635 | } |
@@ -2669,9 +2770,9 @@ static inline int security_netlink_send (struct sock *sk, struct sk_buff *skb) | |||
2669 | return cap_netlink_send (sk, skb); | 2770 | return cap_netlink_send (sk, skb); |
2670 | } | 2771 | } |
2671 | 2772 | ||
2672 | static inline int security_netlink_recv (struct sk_buff *skb) | 2773 | static inline int security_netlink_recv (struct sk_buff *skb, int cap) |
2673 | { | 2774 | { |
2674 | return cap_netlink_recv (skb); | 2775 | return cap_netlink_recv (skb, cap); |
2675 | } | 2776 | } |
2676 | 2777 | ||
2677 | static inline struct dentry *securityfs_create_dir(const char *name, | 2778 | static inline struct dentry *securityfs_create_dir(const char *name, |
@@ -2693,6 +2794,14 @@ static inline void securityfs_remove(struct dentry *dentry) | |||
2693 | { | 2794 | { |
2694 | } | 2795 | } |
2695 | 2796 | ||
2797 | static inline int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) | ||
2798 | { | ||
2799 | return -EOPNOTSUPP; | ||
2800 | } | ||
2801 | |||
2802 | static inline void security_release_secctx(char *secdata, u32 seclen) | ||
2803 | { | ||
2804 | } | ||
2696 | #endif /* CONFIG_SECURITY */ | 2805 | #endif /* CONFIG_SECURITY */ |
2697 | 2806 | ||
2698 | #ifdef CONFIG_SECURITY_NETWORK | 2807 | #ifdef CONFIG_SECURITY_NETWORK |
@@ -2716,13 +2825,13 @@ static inline int security_socket_create (int family, int type, | |||
2716 | return security_ops->socket_create(family, type, protocol, kern); | 2825 | return security_ops->socket_create(family, type, protocol, kern); |
2717 | } | 2826 | } |
2718 | 2827 | ||
2719 | static inline void security_socket_post_create(struct socket * sock, | 2828 | static inline int security_socket_post_create(struct socket * sock, |
2720 | int family, | 2829 | int family, |
2721 | int type, | 2830 | int type, |
2722 | int protocol, int kern) | 2831 | int protocol, int kern) |
2723 | { | 2832 | { |
2724 | security_ops->socket_post_create(sock, family, type, | 2833 | return security_ops->socket_post_create(sock, family, type, |
2725 | protocol, kern); | 2834 | protocol, kern); |
2726 | } | 2835 | } |
2727 | 2836 | ||
2728 | static inline int security_socket_bind(struct socket * sock, | 2837 | static inline int security_socket_bind(struct socket * sock, |
@@ -2808,10 +2917,9 @@ static inline int security_socket_getpeersec_stream(struct socket *sock, char __ | |||
2808 | return security_ops->socket_getpeersec_stream(sock, optval, optlen, len); | 2917 | return security_ops->socket_getpeersec_stream(sock, optval, optlen, len); |
2809 | } | 2918 | } |
2810 | 2919 | ||
2811 | static inline int security_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata, | 2920 | static inline int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) |
2812 | u32 *seclen) | ||
2813 | { | 2921 | { |
2814 | return security_ops->socket_getpeersec_dgram(skb, secdata, seclen); | 2922 | return security_ops->socket_getpeersec_dgram(sock, skb, secid); |
2815 | } | 2923 | } |
2816 | 2924 | ||
2817 | static inline int security_sk_alloc(struct sock *sk, int family, gfp_t priority) | 2925 | static inline int security_sk_alloc(struct sock *sk, int family, gfp_t priority) |
@@ -2824,9 +2932,36 @@ static inline void security_sk_free(struct sock *sk) | |||
2824 | return security_ops->sk_free_security(sk); | 2932 | return security_ops->sk_free_security(sk); |
2825 | } | 2933 | } |
2826 | 2934 | ||
2827 | static inline unsigned int security_sk_sid(struct sock *sk, struct flowi *fl, u8 dir) | 2935 | static inline void security_sk_clone(const struct sock *sk, struct sock *newsk) |
2936 | { | ||
2937 | return security_ops->sk_clone_security(sk, newsk); | ||
2938 | } | ||
2939 | |||
2940 | static inline void security_sk_classify_flow(struct sock *sk, struct flowi *fl) | ||
2941 | { | ||
2942 | security_ops->sk_getsecid(sk, &fl->secid); | ||
2943 | } | ||
2944 | |||
2945 | static inline void security_req_classify_flow(const struct request_sock *req, struct flowi *fl) | ||
2946 | { | ||
2947 | security_ops->req_classify_flow(req, fl); | ||
2948 | } | ||
2949 | |||
2950 | static inline void security_sock_graft(struct sock* sk, struct socket *parent) | ||
2828 | { | 2951 | { |
2829 | return security_ops->sk_getsid(sk, fl, dir); | 2952 | security_ops->sock_graft(sk, parent); |
2953 | } | ||
2954 | |||
2955 | static inline int security_inet_conn_request(struct sock *sk, | ||
2956 | struct sk_buff *skb, struct request_sock *req) | ||
2957 | { | ||
2958 | return security_ops->inet_conn_request(sk, skb, req); | ||
2959 | } | ||
2960 | |||
2961 | static inline void security_inet_csk_clone(struct sock *newsk, | ||
2962 | const struct request_sock *req) | ||
2963 | { | ||
2964 | security_ops->inet_csk_clone(newsk, req); | ||
2830 | } | 2965 | } |
2831 | #else /* CONFIG_SECURITY_NETWORK */ | 2966 | #else /* CONFIG_SECURITY_NETWORK */ |
2832 | static inline int security_unix_stream_connect(struct socket * sock, | 2967 | static inline int security_unix_stream_connect(struct socket * sock, |
@@ -2848,11 +2983,12 @@ static inline int security_socket_create (int family, int type, | |||
2848 | return 0; | 2983 | return 0; |
2849 | } | 2984 | } |
2850 | 2985 | ||
2851 | static inline void security_socket_post_create(struct socket * sock, | 2986 | static inline int security_socket_post_create(struct socket * sock, |
2852 | int family, | 2987 | int family, |
2853 | int type, | 2988 | int type, |
2854 | int protocol, int kern) | 2989 | int protocol, int kern) |
2855 | { | 2990 | { |
2991 | return 0; | ||
2856 | } | 2992 | } |
2857 | 2993 | ||
2858 | static inline int security_socket_bind(struct socket * sock, | 2994 | static inline int security_socket_bind(struct socket * sock, |
@@ -2936,8 +3072,7 @@ static inline int security_socket_getpeersec_stream(struct socket *sock, char __ | |||
2936 | return -ENOPROTOOPT; | 3072 | return -ENOPROTOOPT; |
2937 | } | 3073 | } |
2938 | 3074 | ||
2939 | static inline int security_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata, | 3075 | static inline int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) |
2940 | u32 *seclen) | ||
2941 | { | 3076 | { |
2942 | return -ENOPROTOOPT; | 3077 | return -ENOPROTOOPT; |
2943 | } | 3078 | } |
@@ -2951,16 +3086,43 @@ static inline void security_sk_free(struct sock *sk) | |||
2951 | { | 3086 | { |
2952 | } | 3087 | } |
2953 | 3088 | ||
2954 | static inline unsigned int security_sk_sid(struct sock *sk, struct flowi *fl, u8 dir) | 3089 | static inline void security_sk_clone(const struct sock *sk, struct sock *newsk) |
3090 | { | ||
3091 | } | ||
3092 | |||
3093 | static inline void security_sk_classify_flow(struct sock *sk, struct flowi *fl) | ||
3094 | { | ||
3095 | } | ||
3096 | |||
3097 | static inline void security_req_classify_flow(const struct request_sock *req, struct flowi *fl) | ||
3098 | { | ||
3099 | } | ||
3100 | |||
3101 | static inline void security_sock_graft(struct sock* sk, struct socket *parent) | ||
3102 | { | ||
3103 | } | ||
3104 | |||
3105 | static inline int security_inet_conn_request(struct sock *sk, | ||
3106 | struct sk_buff *skb, struct request_sock *req) | ||
2955 | { | 3107 | { |
2956 | return 0; | 3108 | return 0; |
2957 | } | 3109 | } |
3110 | |||
3111 | static inline void security_inet_csk_clone(struct sock *newsk, | ||
3112 | const struct request_sock *req) | ||
3113 | { | ||
3114 | } | ||
2958 | #endif /* CONFIG_SECURITY_NETWORK */ | 3115 | #endif /* CONFIG_SECURITY_NETWORK */ |
2959 | 3116 | ||
2960 | #ifdef CONFIG_SECURITY_NETWORK_XFRM | 3117 | #ifdef CONFIG_SECURITY_NETWORK_XFRM |
2961 | static inline int security_xfrm_policy_alloc(struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx) | 3118 | static inline int security_xfrm_policy_alloc(struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx) |
2962 | { | 3119 | { |
2963 | return security_ops->xfrm_policy_alloc_security(xp, sec_ctx); | 3120 | return security_ops->xfrm_policy_alloc_security(xp, sec_ctx, NULL); |
3121 | } | ||
3122 | |||
3123 | static inline int security_xfrm_sock_policy_alloc(struct xfrm_policy *xp, struct sock *sk) | ||
3124 | { | ||
3125 | return security_ops->xfrm_policy_alloc_security(xp, NULL, sk); | ||
2964 | } | 3126 | } |
2965 | 3127 | ||
2966 | static inline int security_xfrm_policy_clone(struct xfrm_policy *old, struct xfrm_policy *new) | 3128 | static inline int security_xfrm_policy_clone(struct xfrm_policy *old, struct xfrm_policy *new) |
@@ -2978,9 +3140,18 @@ static inline int security_xfrm_policy_delete(struct xfrm_policy *xp) | |||
2978 | return security_ops->xfrm_policy_delete_security(xp); | 3140 | return security_ops->xfrm_policy_delete_security(xp); |
2979 | } | 3141 | } |
2980 | 3142 | ||
2981 | static inline int security_xfrm_state_alloc(struct xfrm_state *x, struct xfrm_user_sec_ctx *sec_ctx) | 3143 | static inline int security_xfrm_state_alloc(struct xfrm_state *x, |
3144 | struct xfrm_user_sec_ctx *sec_ctx) | ||
3145 | { | ||
3146 | return security_ops->xfrm_state_alloc_security(x, sec_ctx, NULL, 0); | ||
3147 | } | ||
3148 | |||
3149 | static inline int security_xfrm_state_alloc_acquire(struct xfrm_state *x, | ||
3150 | struct xfrm_sec_ctx *polsec, u32 secid) | ||
2982 | { | 3151 | { |
2983 | return security_ops->xfrm_state_alloc_security(x, sec_ctx); | 3152 | if (!polsec) |
3153 | return 0; | ||
3154 | return security_ops->xfrm_state_alloc_security(x, NULL, polsec, secid); | ||
2984 | } | 3155 | } |
2985 | 3156 | ||
2986 | static inline int security_xfrm_state_delete(struct xfrm_state *x) | 3157 | static inline int security_xfrm_state_delete(struct xfrm_state *x) |
@@ -2993,9 +3164,32 @@ static inline void security_xfrm_state_free(struct xfrm_state *x) | |||
2993 | security_ops->xfrm_state_free_security(x); | 3164 | security_ops->xfrm_state_free_security(x); |
2994 | } | 3165 | } |
2995 | 3166 | ||
2996 | static inline int security_xfrm_policy_lookup(struct xfrm_policy *xp, u32 sk_sid, u8 dir) | 3167 | static inline int security_xfrm_policy_lookup(struct xfrm_policy *xp, u32 fl_secid, u8 dir) |
2997 | { | 3168 | { |
2998 | return security_ops->xfrm_policy_lookup(xp, sk_sid, dir); | 3169 | return security_ops->xfrm_policy_lookup(xp, fl_secid, dir); |
3170 | } | ||
3171 | |||
3172 | static inline int security_xfrm_state_pol_flow_match(struct xfrm_state *x, | ||
3173 | struct xfrm_policy *xp, struct flowi *fl) | ||
3174 | { | ||
3175 | return security_ops->xfrm_state_pol_flow_match(x, xp, fl); | ||
3176 | } | ||
3177 | |||
3178 | static inline int security_xfrm_flow_state_match(struct flowi *fl, struct xfrm_state *xfrm) | ||
3179 | { | ||
3180 | return security_ops->xfrm_flow_state_match(fl, xfrm); | ||
3181 | } | ||
3182 | |||
3183 | static inline int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid) | ||
3184 | { | ||
3185 | return security_ops->xfrm_decode_session(skb, secid, 1); | ||
3186 | } | ||
3187 | |||
3188 | static inline void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl) | ||
3189 | { | ||
3190 | int rc = security_ops->xfrm_decode_session(skb, &fl->secid, 0); | ||
3191 | |||
3192 | BUG_ON(rc); | ||
2999 | } | 3193 | } |
3000 | #else /* CONFIG_SECURITY_NETWORK_XFRM */ | 3194 | #else /* CONFIG_SECURITY_NETWORK_XFRM */ |
3001 | static inline int security_xfrm_policy_alloc(struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx) | 3195 | static inline int security_xfrm_policy_alloc(struct xfrm_policy *xp, struct xfrm_user_sec_ctx *sec_ctx) |
@@ -3003,6 +3197,11 @@ static inline int security_xfrm_policy_alloc(struct xfrm_policy *xp, struct xfrm | |||
3003 | return 0; | 3197 | return 0; |
3004 | } | 3198 | } |
3005 | 3199 | ||
3200 | static inline int security_xfrm_sock_policy_alloc(struct xfrm_policy *xp, struct sock *sk) | ||
3201 | { | ||
3202 | return 0; | ||
3203 | } | ||
3204 | |||
3006 | static inline int security_xfrm_policy_clone(struct xfrm_policy *old, struct xfrm_policy *new) | 3205 | static inline int security_xfrm_policy_clone(struct xfrm_policy *old, struct xfrm_policy *new) |
3007 | { | 3206 | { |
3008 | return 0; | 3207 | return 0; |
@@ -3017,7 +3216,14 @@ static inline int security_xfrm_policy_delete(struct xfrm_policy *xp) | |||
3017 | return 0; | 3216 | return 0; |
3018 | } | 3217 | } |
3019 | 3218 | ||
3020 | static inline int security_xfrm_state_alloc(struct xfrm_state *x, struct xfrm_user_sec_ctx *sec_ctx) | 3219 | static inline int security_xfrm_state_alloc(struct xfrm_state *x, |
3220 | struct xfrm_user_sec_ctx *sec_ctx) | ||
3221 | { | ||
3222 | return 0; | ||
3223 | } | ||
3224 | |||
3225 | static inline int security_xfrm_state_alloc_acquire(struct xfrm_state *x, | ||
3226 | struct xfrm_sec_ctx *polsec, u32 secid) | ||
3021 | { | 3227 | { |
3022 | return 0; | 3228 | return 0; |
3023 | } | 3229 | } |
@@ -3031,18 +3237,41 @@ static inline int security_xfrm_state_delete(struct xfrm_state *x) | |||
3031 | return 0; | 3237 | return 0; |
3032 | } | 3238 | } |
3033 | 3239 | ||
3034 | static inline int security_xfrm_policy_lookup(struct xfrm_policy *xp, u32 sk_sid, u8 dir) | 3240 | static inline int security_xfrm_policy_lookup(struct xfrm_policy *xp, u32 fl_secid, u8 dir) |
3035 | { | 3241 | { |
3036 | return 0; | 3242 | return 0; |
3037 | } | 3243 | } |
3244 | |||
3245 | static inline int security_xfrm_state_pol_flow_match(struct xfrm_state *x, | ||
3246 | struct xfrm_policy *xp, struct flowi *fl) | ||
3247 | { | ||
3248 | return 1; | ||
3249 | } | ||
3250 | |||
3251 | static inline int security_xfrm_flow_state_match(struct flowi *fl, | ||
3252 | struct xfrm_state *xfrm) | ||
3253 | { | ||
3254 | return 1; | ||
3255 | } | ||
3256 | |||
3257 | static inline int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid) | ||
3258 | { | ||
3259 | return 0; | ||
3260 | } | ||
3261 | |||
3262 | static inline void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl) | ||
3263 | { | ||
3264 | } | ||
3265 | |||
3038 | #endif /* CONFIG_SECURITY_NETWORK_XFRM */ | 3266 | #endif /* CONFIG_SECURITY_NETWORK_XFRM */ |
3039 | 3267 | ||
3040 | #ifdef CONFIG_KEYS | 3268 | #ifdef CONFIG_KEYS |
3041 | #ifdef CONFIG_SECURITY | 3269 | #ifdef CONFIG_SECURITY |
3042 | static inline int security_key_alloc(struct key *key, | 3270 | static inline int security_key_alloc(struct key *key, |
3043 | struct task_struct *tsk) | 3271 | struct task_struct *tsk, |
3272 | unsigned long flags) | ||
3044 | { | 3273 | { |
3045 | return security_ops->key_alloc(key, tsk); | 3274 | return security_ops->key_alloc(key, tsk, flags); |
3046 | } | 3275 | } |
3047 | 3276 | ||
3048 | static inline void security_key_free(struct key *key) | 3277 | static inline void security_key_free(struct key *key) |
@@ -3060,7 +3289,8 @@ static inline int security_key_permission(key_ref_t key_ref, | |||
3060 | #else | 3289 | #else |
3061 | 3290 | ||
3062 | static inline int security_key_alloc(struct key *key, | 3291 | static inline int security_key_alloc(struct key *key, |
3063 | struct task_struct *tsk) | 3292 | struct task_struct *tsk, |
3293 | unsigned long flags) | ||
3064 | { | 3294 | { |
3065 | return 0; | 3295 | return 0; |
3066 | } | 3296 | } |