提交 309426ae 编写于 作者: P Peter Hurley 提交者: Greg Kroah-Hartman

tty: audit: Remove icanon mode from call chain

The tty termios bits cannot change while n_tty_read() is in the
i/o loop; the termios_rwsem ensures mutual exclusion with termios
changes in n_tty_set_termios(). Check L_ICANON() directly and
eliminate icanon parameter.

NB: tty_audit_add_data() => tty_audit_buf_get() => tty_audit_buf_alloc()
is a single path; ie., tty_audit_buf_get() and tty_audit_buf_alloc()
have no other callers.
Signed-off-by: NPeter Hurley <peter@hurleysoftware.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 eab25a5c
...@@ -162,7 +162,7 @@ static int tty_copy_to_user(struct tty_struct *tty, void __user *to, ...@@ -162,7 +162,7 @@ static int tty_copy_to_user(struct tty_struct *tty, void __user *to,
int uncopied; int uncopied;
if (n > size) { if (n > size) {
tty_audit_add_data(tty, from, size, ldata->icanon); tty_audit_add_data(tty, from, size);
uncopied = copy_to_user(to, from, size); uncopied = copy_to_user(to, from, size);
if (uncopied) if (uncopied)
return uncopied; return uncopied;
...@@ -171,7 +171,7 @@ static int tty_copy_to_user(struct tty_struct *tty, void __user *to, ...@@ -171,7 +171,7 @@ static int tty_copy_to_user(struct tty_struct *tty, void __user *to,
from = ldata->read_buf; from = ldata->read_buf;
} }
tty_audit_add_data(tty, from, n, ldata->icanon); tty_audit_add_data(tty, from, n);
return copy_to_user(to, from, n); return copy_to_user(to, from, n);
} }
...@@ -1978,7 +1978,7 @@ static int copy_from_read_buf(struct tty_struct *tty, ...@@ -1978,7 +1978,7 @@ static int copy_from_read_buf(struct tty_struct *tty,
retval = copy_to_user(*b, from, n); retval = copy_to_user(*b, from, n);
n -= retval; n -= retval;
is_eof = n == 1 && *from == EOF_CHAR(tty); is_eof = n == 1 && *from == EOF_CHAR(tty);
tty_audit_add_data(tty, from, n, ldata->icanon); tty_audit_add_data(tty, from, n);
smp_store_release(&ldata->read_tail, ldata->read_tail + n); smp_store_release(&ldata->read_tail, ldata->read_tail + n);
/* Turn single EOF into zero-length read */ /* Turn single EOF into zero-length read */
if (L_EXTPROC(tty) && ldata->icanon && is_eof && if (L_EXTPROC(tty) && ldata->icanon && is_eof &&
......
...@@ -22,8 +22,7 @@ struct tty_audit_buf { ...@@ -22,8 +22,7 @@ struct tty_audit_buf {
unsigned char *data; /* Allocated size N_TTY_BUF_SIZE */ unsigned char *data; /* Allocated size N_TTY_BUF_SIZE */
}; };
static struct tty_audit_buf *tty_audit_buf_alloc(int major, int minor, static struct tty_audit_buf *tty_audit_buf_alloc(struct tty_struct *tty)
unsigned icanon)
{ {
struct tty_audit_buf *buf; struct tty_audit_buf *buf;
...@@ -35,9 +34,9 @@ static struct tty_audit_buf *tty_audit_buf_alloc(int major, int minor, ...@@ -35,9 +34,9 @@ static struct tty_audit_buf *tty_audit_buf_alloc(int major, int minor,
goto err_buf; goto err_buf;
atomic_set(&buf->count, 1); atomic_set(&buf->count, 1);
mutex_init(&buf->mutex); mutex_init(&buf->mutex);
buf->major = major; buf->major = tty->driver->major;
buf->minor = minor; buf->minor = tty->driver->minor_start + tty->index;
buf->icanon = icanon; buf->icanon = !!L_ICANON(tty);
buf->valid = 0; buf->valid = 0;
return buf; return buf;
...@@ -216,8 +215,7 @@ int tty_audit_push_current(void) ...@@ -216,8 +215,7 @@ int tty_audit_push_current(void)
* if TTY auditing is disabled or out of memory. Otherwise, return a new * if TTY auditing is disabled or out of memory. Otherwise, return a new
* reference to the buffer. * reference to the buffer.
*/ */
static struct tty_audit_buf *tty_audit_buf_get(struct tty_struct *tty, static struct tty_audit_buf *tty_audit_buf_get(struct tty_struct *tty)
unsigned icanon)
{ {
struct tty_audit_buf *buf, *buf2; struct tty_audit_buf *buf, *buf2;
unsigned long flags; unsigned long flags;
...@@ -234,9 +232,7 @@ static struct tty_audit_buf *tty_audit_buf_get(struct tty_struct *tty, ...@@ -234,9 +232,7 @@ static struct tty_audit_buf *tty_audit_buf_get(struct tty_struct *tty,
} }
spin_unlock_irqrestore(&current->sighand->siglock, flags); spin_unlock_irqrestore(&current->sighand->siglock, flags);
buf2 = tty_audit_buf_alloc(tty->driver->major, buf2 = tty_audit_buf_alloc(tty);
tty->driver->minor_start + tty->index,
icanon);
if (buf2 == NULL) { if (buf2 == NULL) {
audit_log_lost("out of memory in TTY auditing"); audit_log_lost("out of memory in TTY auditing");
return NULL; return NULL;
...@@ -265,13 +261,13 @@ static struct tty_audit_buf *tty_audit_buf_get(struct tty_struct *tty, ...@@ -265,13 +261,13 @@ static struct tty_audit_buf *tty_audit_buf_get(struct tty_struct *tty,
* *
* Audit @data of @size from @tty, if necessary. * Audit @data of @size from @tty, if necessary.
*/ */
void tty_audit_add_data(struct tty_struct *tty, const void *data, void tty_audit_add_data(struct tty_struct *tty, const void *data, size_t size)
size_t size, unsigned icanon)
{ {
struct tty_audit_buf *buf; struct tty_audit_buf *buf;
int major, minor; int major, minor;
int audit_log_tty_passwd; int audit_log_tty_passwd;
unsigned long flags; unsigned long flags;
unsigned int icanon = !!L_ICANON(tty);
if (unlikely(size == 0)) if (unlikely(size == 0))
return; return;
...@@ -286,7 +282,7 @@ void tty_audit_add_data(struct tty_struct *tty, const void *data, ...@@ -286,7 +282,7 @@ void tty_audit_add_data(struct tty_struct *tty, const void *data,
if (!audit_log_tty_passwd && icanon && !L_ECHO(tty)) if (!audit_log_tty_passwd && icanon && !L_ECHO(tty))
return; return;
buf = tty_audit_buf_get(tty, icanon); buf = tty_audit_buf_get(tty);
if (!buf) if (!buf)
return; return;
......
...@@ -593,7 +593,7 @@ extern void __init n_tty_init(void); ...@@ -593,7 +593,7 @@ extern void __init n_tty_init(void);
/* tty_audit.c */ /* tty_audit.c */
#ifdef CONFIG_AUDIT #ifdef CONFIG_AUDIT
extern void tty_audit_add_data(struct tty_struct *tty, const void *data, extern void tty_audit_add_data(struct tty_struct *tty, const void *data,
size_t size, unsigned icanon); size_t size);
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);
...@@ -601,7 +601,7 @@ extern void tty_audit_push(struct tty_struct *tty); ...@@ -601,7 +601,7 @@ extern void tty_audit_push(struct tty_struct *tty);
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,
size_t size, unsigned icanon) size_t size)
{ {
} }
static inline void tty_audit_tiocsti(struct tty_struct *tty, char ch) static inline void tty_audit_tiocsti(struct tty_struct *tty, char ch)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册