tty: audit: Ignore current association for audit push
authorPeter Hurley <peter@hurleysoftware.com>
Sun, 10 Jan 2016 06:55:30 +0000 (22:55 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Jan 2016 00:41:04 +0000 (16:41 -0800)
In canonical read mode, each line read and logged is pushed separately
with tty_audit_push(). For all single-threaded processes and multi-threaded
processes reading from only one tty, this patch has no effect; the last line
read will still be the entry pushed to the audit log because the tty
association cannot have changed between tty_audit_add_data() and
tty_audit_push().

For multi-threaded processes reading from different ttys concurrently,
the audit log will have mixed log entries anyway. Consider two ttys
audited concurrently:

CPU0                           CPU1
----------                     ------------
tty_audit_add_data(ttyA)
                               tty_audit_add_data(ttyB)
tty_audit_push()
                               tty_audit_add_data(ttyB)
                               tty_audit_push()

This patch will now cause the ttyB output to be split into separate
audit log entries.

However, this possibility is equally likely without this patch:

CPU0                           CPU1
----------                     ------------
                               tty_audit_add_data(ttyB)
tty_audit_add_data(ttyA)
tty_audit_push()
                               tty_audit_add_data(ttyB)
                               tty_audit_push()

Mixed canonical and non-canonical reads have similar races.

Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/n_tty.c
drivers/tty/tty_audit.c
include/linux/tty.h

index 4fbc5defbcd82a79ae32ca79acaa04adaab223e6..827206914b02196c0665a89b02a35a7b8ac0c16c 100644 (file)
@@ -2072,7 +2072,7 @@ static int canon_copy_from_read_buf(struct tty_struct *tty,
                        ldata->line_start = ldata->read_tail;
                else
                        ldata->push = 0;
-               tty_audit_push(tty);
+               tty_audit_push();
        }
        return 0;
 }
index 5f65653cee485683cf9ceda7081b3818b050787a..5ae48396e26544c40991cea99bc632981b818dbe 100644 (file)
@@ -313,9 +313,9 @@ void tty_audit_add_data(struct tty_struct *tty, const void *data, size_t size)
 /**
  *     tty_audit_push  -       Push buffered data out
  *
- *     Make sure no audit data is pending for @tty on the current process.
+ *     Make sure no audit data is pending on the current process.
  */
-void tty_audit_push(struct tty_struct *tty)
+void tty_audit_push(void)
 {
        struct tty_audit_buf *buf;
        unsigned long flags;
@@ -331,13 +331,8 @@ void tty_audit_push(struct tty_struct *tty)
        spin_unlock_irqrestore(&current->sighand->siglock, flags);
 
        if (buf) {
-               int major, minor;
-
-               major = tty->driver->major;
-               minor = tty->driver->minor_start + tty->index;
                mutex_lock(&buf->mutex);
-               if (buf->major == major && buf->minor == minor)
-                       tty_audit_buf_push(buf);
+               tty_audit_buf_push(buf);
                mutex_unlock(&buf->mutex);
                tty_audit_buf_put(buf);
        }
index c011dc205e5cf360e96bd17abe6932d82ff4fe05..83d74dcfb3c8e9f718f30b1c4163d2c7fc189943 100644 (file)
@@ -597,7 +597,7 @@ extern void tty_audit_add_data(struct tty_struct *tty, const void *data,
 extern void tty_audit_exit(void);
 extern void tty_audit_fork(struct signal_struct *sig);
 extern void tty_audit_tiocsti(struct tty_struct *tty, char ch);
-extern void tty_audit_push(struct tty_struct *tty);
+extern void tty_audit_push(void);
 extern int tty_audit_push_current(void);
 #else
 static inline void tty_audit_add_data(struct tty_struct *tty, const void *data,
@@ -613,7 +613,7 @@ static inline void tty_audit_exit(void)
 static inline void tty_audit_fork(struct signal_struct *sig)
 {
 }
-static inline void tty_audit_push(struct tty_struct *tty)
+static inline void tty_audit_push(void)
 {
 }
 static inline int tty_audit_push_current(void)