@@ -12,6 +12,7 @@
#include <linux/sched.h>
#include <linux/ptrace.h>
#include <linux/audit_arch.h>
+#include <linux/time64.h>
#include <uapi/linux/audit.h>
#include <uapi/linux/netfilter/nf_tables.h>
#include <uapi/linux/fanotify.h>
@@ -408,6 +409,7 @@ extern int __audit_socketcall(int nargs, unsigned long *args);
extern int __audit_sockaddr(int len, void *addr);
extern void __audit_fd_pair(int fd1, int fd2);
extern void __audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr);
+extern struct timespec64 audit_get_ctime(const struct audit_context *ctx);
extern void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec64 *abs_timeout);
extern void __audit_mq_notify(mqd_t mqdes, const struct sigevent *notification);
extern void __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat);
@@ -653,6 +655,12 @@ static inline int audit_sockaddr(int len, void *addr)
}
static inline void audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr)
{ }
+static inline struct timespec64 audit_get_ctime(const struct audit_context *ctx)
+{
+ struct timespec64 t = {};
+
+ return t;
+}
static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len,
unsigned int msg_prio,
const struct timespec64 *abs_timeout)
@@ -2511,6 +2511,22 @@ void __audit_inode_child(struct inode *parent,
}
EXPORT_SYMBOL_GPL(__audit_inode_child);
+/**
+ * audit_get_ctime - get creation time of audit_context
+ *
+ * @ctx: audit_context for the task
+ *
+ * Returns an empty timespec64 if ctx is NULL.
+ */
+struct timespec64 audit_get_ctime(const struct audit_context *ctx)
+{
+ struct timespec64 t = {};
+
+ if (ctx)
+ return ctx->ctime;
+ return t;
+}
+
/**
* auditsc_get_stamp - get local copies of audit_context values
* @ctx: audit_context for the task
@@ -2526,9 +2542,8 @@ int auditsc_get_stamp(struct audit_context *ctx,
return 0;
if (!ctx->serial)
ctx->serial = audit_serial();
- t->tv_sec = ctx->ctime.tv_sec;
- t->tv_nsec = ctx->ctime.tv_nsec;
- *serial = ctx->serial;
+ *t = audit_get_ctime(ctx);
+ *serial = ctx->serial;
if (!ctx->prio) {
ctx->prio = 1;
ctx->current_state = AUDIT_STATE_RECORD;
It may be useful to synchronize with the audit's timestamp e.g., to identify asynchronous events as being created with a previous audit record (see next commit). auditsc_get_stamp() does more than just getting a timestamp, so add a new helper instead of exposing it and risking side effects. It should be noted that we cannot reliably expose event's serial numbers because there may not be any related event, which would then create holes in the sequence of serial numbers. Cc: Eric Paris <eparis@redhat.com> Cc: Paul Moore <paul@paul-moore.com> Signed-off-by: Mickaël Salaün <mic@digikod.net> Link: https://lore.kernel.org/r/20241122143353.59367-10-mic@digikod.net --- Changes since v2: - New patch. --- include/linux/audit.h | 8 ++++++++ kernel/auditsc.c | 21 ++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-)