[PATCH] fix broken timestamps in AVC generated by kernel threads

Timestamp in audit_context is valid only if ->in_syscall is set.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro 48887e63 7f0ed77d

+7 -6
+2 -2
include/linux/audit.h
··· 435 436 /* Private API (for audit.c only) */ 437 extern unsigned int audit_serial(void); 438 - extern void auditsc_get_stamp(struct audit_context *ctx, 439 struct timespec *t, unsigned int *serial); 440 extern int audit_set_loginuid(struct task_struct *task, uid_t loginuid); 441 #define audit_get_loginuid(t) ((t)->loginuid) ··· 518 #define audit_inode(n,d) do { ; } while (0) 519 #define audit_inode_child(d,i,p) do { ; } while (0) 520 #define audit_core_dumps(i) do { ; } while (0) 521 - #define auditsc_get_stamp(c,t,s) do { BUG(); } while (0) 522 #define audit_get_loginuid(t) (-1) 523 #define audit_get_sessionid(t) (-1) 524 #define audit_log_task_context(b) do { ; } while (0)
··· 435 436 /* Private API (for audit.c only) */ 437 extern unsigned int audit_serial(void); 438 + extern int auditsc_get_stamp(struct audit_context *ctx, 439 struct timespec *t, unsigned int *serial); 440 extern int audit_set_loginuid(struct task_struct *task, uid_t loginuid); 441 #define audit_get_loginuid(t) ((t)->loginuid) ··· 518 #define audit_inode(n,d) do { ; } while (0) 519 #define audit_inode_child(d,i,p) do { ; } while (0) 520 #define audit_core_dumps(i) do { ; } while (0) 521 + #define auditsc_get_stamp(c,t,s) (0) 522 #define audit_get_loginuid(t) (-1) 523 #define audit_get_sessionid(t) (-1) 524 #define audit_log_task_context(b) do { ; } while (0)
+1 -3
kernel/audit.c
··· 1121 static inline void audit_get_stamp(struct audit_context *ctx, 1122 struct timespec *t, unsigned int *serial) 1123 { 1124 - if (ctx) 1125 - auditsc_get_stamp(ctx, t, serial); 1126 - else { 1127 *t = CURRENT_TIME; 1128 *serial = audit_serial(); 1129 }
··· 1121 static inline void audit_get_stamp(struct audit_context *ctx, 1122 struct timespec *t, unsigned int *serial) 1123 { 1124 + if (!ctx || !auditsc_get_stamp(ctx, t, serial)) { 1125 *t = CURRENT_TIME; 1126 *serial = audit_serial(); 1127 }
+4 -1
kernel/auditsc.c
··· 1957 * 1958 * Also sets the context as auditable. 1959 */ 1960 - void auditsc_get_stamp(struct audit_context *ctx, 1961 struct timespec *t, unsigned int *serial) 1962 { 1963 if (!ctx->serial) 1964 ctx->serial = audit_serial(); 1965 t->tv_sec = ctx->ctime.tv_sec; 1966 t->tv_nsec = ctx->ctime.tv_nsec; 1967 *serial = ctx->serial; 1968 ctx->auditable = 1; 1969 } 1970 1971 /* global counter which is incremented every time something logs in */
··· 1957 * 1958 * Also sets the context as auditable. 1959 */ 1960 + int auditsc_get_stamp(struct audit_context *ctx, 1961 struct timespec *t, unsigned int *serial) 1962 { 1963 + if (!ctx->in_syscall) 1964 + return 0; 1965 if (!ctx->serial) 1966 ctx->serial = audit_serial(); 1967 t->tv_sec = ctx->ctime.tv_sec; 1968 t->tv_nsec = ctx->ctime.tv_nsec; 1969 *serial = ctx->serial; 1970 ctx->auditable = 1; 1971 + return 1; 1972 } 1973 1974 /* global counter which is incremented every time something logs in */