diff options
Diffstat (limited to 'kernel/audit.c')
| -rw-r--r-- | kernel/audit.c | 29 | 
1 files changed, 29 insertions, 0 deletions
diff --git a/kernel/audit.c b/kernel/audit.c index 93950031706..52501b5d490 100644 --- a/kernel/audit.c +++ b/kernel/audit.c @@ -55,6 +55,9 @@  #include <net/sock.h>  #include <net/netlink.h>  #include <linux/skbuff.h> +#ifdef CONFIG_SECURITY +#include <linux/security.h> +#endif  #include <linux/netlink.h>  #include <linux/freezer.h>  #include <linux/tty.h> @@ -1502,6 +1505,32 @@ void audit_log(struct audit_context *ctx, gfp_t gfp_mask, int type,  	}  } +#ifdef CONFIG_SECURITY +/** + * audit_log_secctx - Converts and logs SELinux context + * @ab: audit_buffer + * @secid: security number + * + * This is a helper function that calls security_secid_to_secctx to convert + * secid to secctx and then adds the (converted) SELinux context to the audit + * log by calling audit_log_format, thus also preventing leak of internal secid + * to userspace. If secid cannot be converted audit_panic is called. + */ +void audit_log_secctx(struct audit_buffer *ab, u32 secid) +{ +	u32 len; +	char *secctx; + +	if (security_secid_to_secctx(secid, &secctx, &len)) { +		audit_panic("Cannot convert secid to context"); +	} else { +		audit_log_format(ab, " obj=%s", secctx); +		security_release_secctx(secctx, len); +	} +} +EXPORT_SYMBOL(audit_log_secctx); +#endif +  EXPORT_SYMBOL(audit_log_start);  EXPORT_SYMBOL(audit_log_end);  EXPORT_SYMBOL(audit_log_format);  |