tty: audit: Ignore current association for audit push
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>
This commit is contained in:
parent
f229c2c161
commit
b50819f437
@ -2072,7 +2072,7 @@ static int canon_copy_from_read_buf(struct tty_struct *tty,
|
|||||||
ldata->line_start = ldata->read_tail;
|
ldata->line_start = ldata->read_tail;
|
||||||
else
|
else
|
||||||
ldata->push = 0;
|
ldata->push = 0;
|
||||||
tty_audit_push(tty);
|
tty_audit_push();
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -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
|
* 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;
|
struct tty_audit_buf *buf;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
@ -331,13 +331,8 @@ void tty_audit_push(struct tty_struct *tty)
|
|||||||
spin_unlock_irqrestore(¤t->sighand->siglock, flags);
|
spin_unlock_irqrestore(¤t->sighand->siglock, flags);
|
||||||
|
|
||||||
if (buf) {
|
if (buf) {
|
||||||
int major, minor;
|
|
||||||
|
|
||||||
major = tty->driver->major;
|
|
||||||
minor = tty->driver->minor_start + tty->index;
|
|
||||||
mutex_lock(&buf->mutex);
|
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);
|
mutex_unlock(&buf->mutex);
|
||||||
tty_audit_buf_put(buf);
|
tty_audit_buf_put(buf);
|
||||||
}
|
}
|
||||||
|
@ -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_exit(void);
|
||||||
extern void tty_audit_fork(struct signal_struct *sig);
|
extern void tty_audit_fork(struct signal_struct *sig);
|
||||||
extern void tty_audit_tiocsti(struct tty_struct *tty, char ch);
|
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);
|
extern int tty_audit_push_current(void);
|
||||||
#else
|
#else
|
||||||
static inline void tty_audit_add_data(struct tty_struct *tty, const void *data,
|
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_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)
|
static inline int tty_audit_push_current(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user