audit: Use timespec64 to represent audit timestamps
authorDeepa Dinamani <deepa.kernel@gmail.com>
Tue, 2 May 2017 14:16:05 +0000 (10:16 -0400)
committerPaul Moore <paul@paul-moore.com>
Tue, 2 May 2017 14:16:05 +0000 (10:16 -0400)
struct timespec is not y2038 safe.
Audit timestamps are recorded in string format into
an audit buffer for a given context.
These mark the entry timestamps for the syscalls.
Use y2038 safe struct timespec64 to represent the times.
The log strings can handle this transition as strings can
hold upto 1024 characters.

Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Paul Moore <paul@paul-moore.com>
Acked-by: Richard Guy Briggs <rgb@redhat.com>
Signed-off-by: Paul Moore <paul@paul-moore.com>
include/linux/audit.h
kernel/audit.c
kernel/audit.h
kernel/auditsc.c

index cc0497c39472cc398ca26f6d9fb33810d468a2e9..2150bdccfbab2953c33cd56d6d64eb798ca180ea 100644 (file)
@@ -331,7 +331,7 @@ static inline void audit_ptrace(struct task_struct *t)
                                /* Private API (for audit.c only) */
 extern unsigned int audit_serial(void);
 extern int auditsc_get_stamp(struct audit_context *ctx,
-                             struct timespec *t, unsigned int *serial);
+                             struct timespec64 *t, unsigned int *serial);
 extern int audit_set_loginuid(kuid_t loginuid);
 
 static inline kuid_t audit_get_loginuid(struct task_struct *tsk)
@@ -510,7 +510,7 @@ static inline void __audit_seccomp(unsigned long syscall, long signr, int code)
 static inline void audit_seccomp(unsigned long syscall, long signr, int code)
 { }
 static inline int auditsc_get_stamp(struct audit_context *ctx,
-                             struct timespec *t, unsigned int *serial)
+                             struct timespec64 *t, unsigned int *serial)
 {
        return 0;
 }
index a2f7803a68d019e51ff423a2cc8cde8970c6c573..41efd2ad1931cfd5a3009fda4355ab0d1dd2a29c 100644 (file)
@@ -1638,10 +1638,10 @@ unsigned int audit_serial(void)
 }
 
 static inline void audit_get_stamp(struct audit_context *ctx,
-                                  struct timespec *t, unsigned int *serial)
+                                  struct timespec64 *t, unsigned int *serial)
 {
        if (!ctx || !auditsc_get_stamp(ctx, t, serial)) {
-               *t = CURRENT_TIME;
+               ktime_get_real_ts64(t);
                *serial = audit_serial();
        }
 }
@@ -1665,7 +1665,7 @@ struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask,
                                     int type)
 {
        struct audit_buffer *ab;
-       struct timespec t;
+       struct timespec64 t;
        unsigned int uninitialized_var(serial);
 
        if (audit_initialized != AUDIT_INITIALIZED)
@@ -1718,8 +1718,8 @@ struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask,
        }
 
        audit_get_stamp(ab->ctx, &t, &serial);
-       audit_log_format(ab, "audit(%lu.%03lu:%u): ",
-                        t.tv_sec, t.tv_nsec/1000000, serial);
+       audit_log_format(ab, "audit(%llu.%03lu:%u): ",
+                        (unsigned long long)t.tv_sec, t.tv_nsec/1000000, serial);
 
        return ab;
 }
index 4987ea2a47027e53eb43ae809b2fa14852946efb..ddfce2ea4891221a49e9fc3e7f744920c1e67f8b 100644 (file)
@@ -112,7 +112,7 @@ struct audit_context {
        enum audit_state    state, current_state;
        unsigned int        serial;     /* serial number for record */
        int                 major;      /* syscall number */
-       struct timespec     ctime;      /* time of syscall entry */
+       struct timespec64   ctime;      /* time of syscall entry */
        unsigned long       argv[4];    /* syscall arguments */
        long                return_code;/* syscall return code */
        u64                 prio;
index 1c2333155893fac54138a8b3f7311c2ca520992c..b2dcbe637b7ca6f922549f38b66edce42c67a424 100644 (file)
@@ -1532,7 +1532,7 @@ void __audit_syscall_entry(int major, unsigned long a1, unsigned long a2,
                return;
 
        context->serial     = 0;
-       context->ctime      = CURRENT_TIME;
+       ktime_get_real_ts64(&context->ctime);
        context->in_syscall = 1;
        context->current_state  = state;
        context->ppid       = 0;
@@ -1941,13 +1941,13 @@ EXPORT_SYMBOL_GPL(__audit_inode_child);
 /**
  * auditsc_get_stamp - get local copies of audit_context values
  * @ctx: audit_context for the task
- * @t: timespec to store time recorded in the audit_context
+ * @t: timespec64 to store time recorded in the audit_context
  * @serial: serial value that is recorded in the audit_context
  *
  * Also sets the context as auditable.
  */
 int auditsc_get_stamp(struct audit_context *ctx,
-                      struct timespec *t, unsigned int *serial)
+                      struct timespec64 *t, unsigned int *serial)
 {
        if (!ctx->in_syscall)
                return 0;