summaryrefslogtreecommitdiffstats
path: root/kernel/auditsc.c
diff options
context:
space:
mode:
authorEric Paris <eparis@redhat.com>2008-01-07 19:34:51 +0100
committerAl Viro <viro@zeniv.linux.org.uk>2008-02-01 20:05:55 +0100
commitf701b75ed5ffb6820efe530d1a3abcc6fc4678ad (patch)
tree46036f5e1b2703f6f9073a4a1469e3c5a611083e /kernel/auditsc.c
parent[PATCH] get rid of loginuid races (diff)
downloadlinux-f701b75ed5ffb6820efe530d1a3abcc6fc4678ad.tar.xz
linux-f701b75ed5ffb6820efe530d1a3abcc6fc4678ad.zip
[AUDIT] return EINTR not ERESTART*
The syscall exit code will change ERESTART* kernel internal return codes to EINTR if it does not restart the syscall. Since we collect the audit info before that point we should fix those in the audit log as well. Signed-off-by: Eric Paris <eparis@redhat.com>
Diffstat (limited to 'kernel/auditsc.c')
-rw-r--r--kernel/auditsc.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/kernel/auditsc.c b/kernel/auditsc.c
index c95173a194bf..ce8c957201ef 100644
--- a/kernel/auditsc.c
+++ b/kernel/auditsc.c
@@ -701,7 +701,24 @@ static inline struct audit_context *audit_get_context(struct task_struct *tsk,
if (likely(!context))
return NULL;
context->return_valid = return_valid;
- context->return_code = return_code;
+
+ /*
+ * we need to fix up the return code in the audit logs if the actual
+ * return codes are later going to be fixed up by the arch specific
+ * signal handlers
+ *
+ * This is actually a test for:
+ * (rc == ERESTARTSYS ) || (rc == ERESTARTNOINTR) ||
+ * (rc == ERESTARTNOHAND) || (rc == ERESTART_RESTARTBLOCK)
+ *
+ * but is faster than a bunch of ||
+ */
+ if (unlikely(return_code <= -ERESTARTSYS) &&
+ (return_code >= -ERESTART_RESTARTBLOCK) &&
+ (return_code != -ENOIOCTLCMD))
+ context->return_code = -EINTR;
+ else
+ context->return_code = return_code;
if (context->in_syscall && !context->dummy && !context->auditable) {
enum audit_state state;