[PATCH 37/58] LSM: Use lsm_context in secid_to_secctx hooks
Casey Schaufler
casey at schaufler-ca.com
Fri May 31 23:09:59 UTC 2019
Convert SELinux, Smack and AppArmor to use the lsm_context structure
instead of a context/secid pair. There is some scaffolding involved
that will be removed when the related data is updated.
Signed-off-by: Casey Schaufler <casey at schaufler-ca.com>
---
include/linux/lsm_hooks.h | 6 ++----
security/apparmor/include/secid.h | 2 +-
security/apparmor/secid.c | 11 +++++------
security/security.c | 12 ++++++++++--
security/selinux/hooks.c | 5 ++---
security/smack/smack_lsm.c | 8 +++-----
6 files changed, 23 insertions(+), 21 deletions(-)
diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h
index 0837c214cc17..229899452678 100644
--- a/include/linux/lsm_hooks.h
+++ b/include/linux/lsm_hooks.h
@@ -1320,9 +1320,8 @@
* length and the next call which actually allocates and returns the
* secdata.
* @l points to the security information.
- * @secdata contains the pointer that stores the converted security
+ * @cp contains the pointer that stores the converted security
* context.
- * @seclen pointer which contains the length of the data
* @secctx_to_secid:
* Convert security context to exported lsm data.
* @l contains the pointer to the generated security data.
@@ -1664,8 +1663,7 @@ union security_list_options {
int (*getprocattr)(struct task_struct *p, char *name, char **value);
int (*setprocattr)(const char *name, void *value, size_t size);
int (*ismaclabel)(const char *name);
- int (*secid_to_secctx)(struct lsm_export *l, char **secdata,
- u32 *seclen);
+ int (*secid_to_secctx)(struct lsm_export *l, struct lsm_context *cp);
int (*secctx_to_secid)(const char *secdata, u32 seclen,
struct lsm_export *l);
void (*release_secctx)(char *secdata, u32 seclen);
diff --git a/security/apparmor/include/secid.h b/security/apparmor/include/secid.h
index 5381eff03d4f..964d3dc92635 100644
--- a/security/apparmor/include/secid.h
+++ b/security/apparmor/include/secid.h
@@ -26,7 +26,7 @@ struct aa_label;
#define AA_SECID_WILDCARD 1
struct aa_label *aa_secid_to_label(struct lsm_export *l);
-int apparmor_secid_to_secctx(struct lsm_export *l, char **secdata, u32 *seclen);
+int apparmor_secid_to_secctx(struct lsm_export *l, struct lsm_context *cp);
int apparmor_secctx_to_secid(const char *secdata, u32 seclen,
struct lsm_export *l);
void apparmor_release_secctx(char *secdata, u32 seclen);
diff --git a/security/apparmor/secid.c b/security/apparmor/secid.c
index 69d98a89db75..4e11434605d6 100644
--- a/security/apparmor/secid.c
+++ b/security/apparmor/secid.c
@@ -81,7 +81,7 @@ static inline void aa_export_secid(struct lsm_export *l, u32 secid)
l->apparmor = secid;
}
-int apparmor_secid_to_secctx(struct lsm_export *l, char **secdata, u32 *seclen)
+int apparmor_secid_to_secctx(struct lsm_export *l, struct lsm_context *cp)
{
/* TODO: cache secctx and ref count so we don't have to recreate */
struct aa_label *label;
@@ -89,13 +89,12 @@ int apparmor_secid_to_secctx(struct lsm_export *l, char **secdata, u32 *seclen)
label = aa_secid_to_label(l);
- AA_BUG(!seclen);
-
if (!label)
return -EINVAL;
- if (secdata)
- len = aa_label_asxprint(secdata, root_ns, label,
+ /* scaffolding check - Casey */
+ if (cp)
+ len = aa_label_asxprint(&cp->context, root_ns, label,
FLAG_SHOW_MODE | FLAG_VIEW_SUBNS |
FLAG_HIDDEN_UNCONFINED | FLAG_ABS_ROOT,
GFP_ATOMIC);
@@ -106,7 +105,7 @@ int apparmor_secid_to_secctx(struct lsm_export *l, char **secdata, u32 *seclen)
if (len < 0)
return -ENOMEM;
- *seclen = len;
+ cp->len = len;
return 0;
}
diff --git a/security/security.c b/security/security.c
index 365970f2501d..ac0498daa49e 100644
--- a/security/security.c
+++ b/security/security.c
@@ -1974,8 +1974,16 @@ EXPORT_SYMBOL(security_ismaclabel);
int security_secid_to_secctx(struct lsm_export *l, char **secdata, u32 *seclen)
{
- return call_one_int_hook(secid_to_secctx, -EOPNOTSUPP, l, secdata,
- seclen);
+ struct lsm_context lc = { .context = NULL, .len = 0, };
+ int rc;
+
+ rc = call_one_int_hook(secid_to_secctx, -EOPNOTSUPP, l, &lc);
+ if (secdata)
+ *secdata = lc.context;
+ else
+ security_release_secctx(lc.context, lc.len);
+ *seclen = lc.len;
+ return rc;
}
EXPORT_SYMBOL(security_secid_to_secctx);
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 7dd333f133db..6a2a82dcd948 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -6301,14 +6301,13 @@ static int selinux_ismaclabel(const char *name)
return (strcmp(name, XATTR_SELINUX_SUFFIX) == 0);
}
-static int selinux_secid_to_secctx(struct lsm_export *l, char **secdata,
- u32 *seclen)
+static int selinux_secid_to_secctx(struct lsm_export *l, struct lsm_context *cp)
{
u32 secid;
selinux_import_secid(l, &secid);
return security_sid_to_context(&selinux_state, secid,
- secdata, seclen);
+ &cp->context, &cp->len);
}
static int selinux_secctx_to_secid(const char *secdata, u32 seclen,
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
index a837af153ed9..10d6c6a1a001 100644
--- a/security/smack/smack_lsm.c
+++ b/security/smack/smack_lsm.c
@@ -4434,8 +4434,7 @@ static int smack_ismaclabel(const char *name)
*
* Exists for networking code.
*/
-static int smack_secid_to_secctx(struct lsm_export *l, char **secdata,
- u32 *seclen)
+static int smack_secid_to_secctx(struct lsm_export *l, struct lsm_context *cp)
{
struct smack_known *skp;
u32 secid;
@@ -4443,9 +4442,8 @@ static int smack_secid_to_secctx(struct lsm_export *l, char **secdata,
smack_import_secid(l, &secid);
skp = smack_from_secid(secid);
- if (secdata)
- *secdata = skp->smk_known;
- *seclen = strlen(skp->smk_known);
+ cp->context = skp->smk_known;
+ cp->len = strlen(skp->smk_known);
return 0;
}
--
2.19.1
More information about the Linux-security-module-archive
mailing list