[PATCH 12/97] LSM: Use lsm_export in the getpeersec_dgram hooks
Casey Schaufler
casey at schaufler-ca.com
Thu Feb 28 22:18:08 UTC 2019
Convert the getpeersec_dgram hooks to use the lsm_export
structure instead of a u32 secid. There is some scaffolding
involved that will be removed when security_getpeersec_dgram()
is updated.
Signed-off-by: Casey Schaufler <casey at schaufler-ca.com>
---
include/linux/lsm_hooks.h | 7 ++++---
security/apparmor/lsm.c | 3 ++-
security/security.c | 13 ++++++++++---
security/selinux/hooks.c | 6 ++++--
security/smack/smack_lsm.c | 5 +++--
5 files changed, 23 insertions(+), 11 deletions(-)
diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h
index 796eb441be95..d4f260812c20 100644
--- a/include/linux/lsm_hooks.h
+++ b/include/linux/lsm_hooks.h
@@ -865,9 +865,9 @@
* the IP_PASSSEC option via getsockopt. It can then retrieve the
* security state returned by this hook for a packet via the SCM_SECURITY
* ancillary message type.
+ * @sock is the socket
* @skb is the skbuff for the packet being queried
- * @secdata is a pointer to a buffer in which to copy the security data
- * @seclen is the maximum length for @secdata
+ * @l is a pointer to a buffer in which to copy the security data
* Return 0 on success, error on failure.
* @sk_alloc_security:
* Allocate and attach a security structure to the sk->sk_security field,
@@ -1692,7 +1692,8 @@ union security_list_options {
char __user *optval,
int __user *optlen, unsigned len);
int (*socket_getpeersec_dgram)(struct socket *sock,
- struct sk_buff *skb, u32 *secid);
+ struct sk_buff *skb,
+ struct lsm_export *l);
int (*sk_alloc_security)(struct sock *sk, int family, gfp_t priority);
void (*sk_free_security)(struct sock *sk);
void (*sk_clone_security)(const struct sock *sk, struct sock *newsk);
diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
index 377fa4ed1518..0f8e671df5fe 100644
--- a/security/apparmor/lsm.c
+++ b/security/apparmor/lsm.c
@@ -1096,7 +1096,8 @@ static int apparmor_socket_getpeersec_stream(struct socket *sock,
* Sets the netlabel socket state on sk from parent
*/
static int apparmor_socket_getpeersec_dgram(struct socket *sock,
- struct sk_buff *skb, u32 *secid)
+ struct sk_buff *skb,
+ struct lsm_export *l)
{
/* TODO: requires secid support */
diff --git a/security/security.c b/security/security.c
index 1a29fe08a5d9..bbb206b01e8e 100644
--- a/security/security.c
+++ b/security/security.c
@@ -2131,10 +2131,17 @@ int security_socket_getpeersec_stream(struct socket *sock, char __user *optval,
optval, optlen, len);
}
-int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
+int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb,
+ u32 *secid)
{
- return call_int_hook(socket_getpeersec_dgram, -ENOPROTOOPT, sock,
- skb, secid);
+ int rc;
+ struct lsm_export data = { .flags = LSM_EXPORT_NONE };
+
+ rc = call_int_hook(socket_getpeersec_dgram, -ENOPROTOOPT, sock, skb,
+ &data);
+
+ lsm_export_secid(&data, secid);
+ return rc;
}
EXPORT_SYMBOL(security_socket_getpeersec_dgram);
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index efcd905bdabf..1004aa4fc5db 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -4845,7 +4845,9 @@ static int selinux_socket_getpeersec_stream(struct socket *sock,
return err;
}
-static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
+static int selinux_socket_getpeersec_dgram(struct socket *sock,
+ struct sk_buff *skb,
+ struct lsm_export *l)
{
u32 peer_secid = SECSID_NULL;
u16 family;
@@ -4867,7 +4869,7 @@ static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *
selinux_skb_peerlbl_sid(skb, family, &peer_secid);
out:
- *secid = peer_secid;
+ selinux_export_secid(l, peer_secid);
if (peer_secid == SECSID_NULL)
return -EINVAL;
return 0;
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
index 0e1f6ef25eb2..0bed974b833b 100644
--- a/security/smack/smack_lsm.c
+++ b/security/smack/smack_lsm.c
@@ -3887,7 +3887,8 @@ static int smack_socket_getpeersec_stream(struct socket *sock,
* Sets the netlabel socket state on sk from parent
*/
static int smack_socket_getpeersec_dgram(struct socket *sock,
- struct sk_buff *skb, u32 *secid)
+ struct sk_buff *skb,
+ struct lsm_export *l)
{
struct netlbl_lsm_secattr secattr;
@@ -3938,7 +3939,7 @@ static int smack_socket_getpeersec_dgram(struct socket *sock,
#endif
break;
}
- *secid = s;
+ smack_export_secid(l, s);
if (s == 0)
return -EINVAL;
return 0;
--
2.17.0
More information about the Linux-security-module-archive
mailing list