Refactor audit_log_task_context(), creating a new
audit_log_subject_context(). This is used in netlabel auditing
to provide multiple subject security contexts as necessary.

Signed-off-by: Casey Schaufler <[email protected]>
---
 include/linux/audit.h        |  8 ++++++++
 kernel/audit.c               | 21 ++++++++++++++-------
 net/netlabel/netlabel_user.c |  9 +--------
 3 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/include/linux/audit.h b/include/linux/audit.h
index 0050ef288ab3..ee3e2ce70c45 100644
--- a/include/linux/audit.h
+++ b/include/linux/audit.h
@@ -37,6 +37,7 @@ struct audit_watch;
 struct audit_tree;
 struct sk_buff;
 struct kern_ipc_perm;
+struct lsm_prop;
 
 struct audit_krule {
        u32                     pflags;
@@ -185,6 +186,8 @@ extern void             audit_log_path_denied(int type,
                                                  const char *operation);
 extern void                audit_log_lost(const char *message);
 
+extern int audit_log_subject_context(struct audit_buffer *ab,
+                                    struct lsm_prop *blob);
 extern int audit_log_task_context(struct audit_buffer *ab);
 extern void audit_log_task_info(struct audit_buffer *ab);
 
@@ -245,6 +248,11 @@ static inline void audit_log_key(struct audit_buffer *ab, 
char *key)
 { }
 static inline void audit_log_path_denied(int type, const char *operation)
 { }
+static inline int audit_log_subject_context(struct audit_buffer *ab,
+                                           struct lsm_prop *prop)
+{
+       return 0;
+}
 static inline int audit_log_task_context(struct audit_buffer *ab)
 {
        return 0;
diff --git a/kernel/audit.c b/kernel/audit.c
index 59eaf69ee8ac..f0c1f0c0b250 100644
--- a/kernel/audit.c
+++ b/kernel/audit.c
@@ -2238,20 +2238,18 @@ static void audit_buffer_aux_end(struct audit_buffer 
*ab)
        ab->skb = skb_peek(&ab->skb_list);
 }
 
-int audit_log_task_context(struct audit_buffer *ab)
+int audit_log_subject_context(struct audit_buffer *ab, struct lsm_prop *prop)
 {
-       struct lsm_prop prop;
        struct lsm_context ctx;
        bool space = false;
        int error;
        int i;
 
-       security_current_getlsmprop_subj(&prop);
-       if (!lsmprop_is_set(&prop))
+       if (!lsmprop_is_set(prop))
                return 0;
 
        if (lsm_subjctx_cnt < 2) {
-               error = security_lsmprop_to_secctx(&prop, &ctx, LSM_ID_UNDEF);
+               error = security_lsmprop_to_secctx(prop, &ctx, LSM_ID_UNDEF);
                if (error < 0) {
                        if (error != -EINVAL)
                                goto error_path;
@@ -2270,7 +2268,7 @@ int audit_log_task_context(struct audit_buffer *ab)
        for (i = 0; i < lsm_active_cnt; i++) {
                if (!lsm_idlist[i]->subjctx)
                        continue;
-               error = security_lsmprop_to_secctx(&prop, &ctx,
+               error = security_lsmprop_to_secctx(prop, &ctx,
                                                   lsm_idlist[i]->id);
                if (error < 0) {
                        if (error == -EOPNOTSUPP)
@@ -2290,9 +2288,18 @@ int audit_log_task_context(struct audit_buffer *ab)
        return 0;
 
 error_path:
-       audit_panic("error in audit_log_task_context");
+       audit_panic("error in audit_log_subject_context");
        return error;
 }
+EXPORT_SYMBOL(audit_log_subject_context);
+
+int audit_log_task_context(struct audit_buffer *ab)
+{
+       struct lsm_prop prop;
+
+       security_current_getlsmprop_subj(&prop);
+       return audit_log_subject_context(ab, &prop);
+}
 EXPORT_SYMBOL(audit_log_task_context);
 
 void audit_log_d_path_exe(struct audit_buffer *ab,
diff --git a/net/netlabel/netlabel_user.c b/net/netlabel/netlabel_user.c
index 6d6545297ee3..3d46ea6a8bb8 100644
--- a/net/netlabel/netlabel_user.c
+++ b/net/netlabel/netlabel_user.c
@@ -84,7 +84,6 @@ struct audit_buffer *netlbl_audit_start_common(int type,
                                               struct netlbl_audit *audit_info)
 {
        struct audit_buffer *audit_buf;
-       struct lsm_context ctx;
 
        if (audit_enabled == AUDIT_OFF)
                return NULL;
@@ -96,13 +95,7 @@ struct audit_buffer *netlbl_audit_start_common(int type,
        audit_log_format(audit_buf, "netlabel: auid=%u ses=%u",
                         from_kuid(&init_user_ns, audit_info->loginuid),
                         audit_info->sessionid);
-
-       if (lsmprop_is_set(&audit_info->prop) &&
-           security_lsmprop_to_secctx(&audit_info->prop, &ctx,
-                                      LSM_ID_UNDEF) > 0) {
-               audit_log_format(audit_buf, " subj=%s", ctx.context);
-               security_release_secctx(&ctx);
-       }
+       audit_log_subject_context(audit_buf, &audit_info->prop);
 
        return audit_buf;
 }
-- 
2.47.0


Reply via email to