diff options
Diffstat (limited to 'drivers/char/n_tty.c')
-rw-r--r-- | drivers/char/n_tty.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/char/n_tty.c b/drivers/char/n_tty.c index 371631f4bfb9..038056911934 100644 --- a/drivers/char/n_tty.c +++ b/drivers/char/n_tty.c | |||
@@ -45,6 +45,8 @@ | |||
45 | #include <linux/slab.h> | 45 | #include <linux/slab.h> |
46 | #include <linux/poll.h> | 46 | #include <linux/poll.h> |
47 | #include <linux/bitops.h> | 47 | #include <linux/bitops.h> |
48 | #include <linux/audit.h> | ||
49 | #include <linux/file.h> | ||
48 | 50 | ||
49 | #include <asm/uaccess.h> | 51 | #include <asm/uaccess.h> |
50 | #include <asm/system.h> | 52 | #include <asm/system.h> |
@@ -78,6 +80,13 @@ static inline void free_buf(unsigned char *buf) | |||
78 | free_page((unsigned long) buf); | 80 | free_page((unsigned long) buf); |
79 | } | 81 | } |
80 | 82 | ||
83 | static inline int tty_put_user(struct tty_struct *tty, unsigned char x, | ||
84 | unsigned char __user *ptr) | ||
85 | { | ||
86 | tty_audit_add_data(tty, &x, 1); | ||
87 | return put_user(x, ptr); | ||
88 | } | ||
89 | |||
81 | /** | 90 | /** |
82 | * n_tty_set__room - receive space | 91 | * n_tty_set__room - receive space |
83 | * @tty: terminal | 92 | * @tty: terminal |
@@ -1153,6 +1162,7 @@ static int copy_from_read_buf(struct tty_struct *tty, | |||
1153 | if (n) { | 1162 | if (n) { |
1154 | retval = copy_to_user(*b, &tty->read_buf[tty->read_tail], n); | 1163 | retval = copy_to_user(*b, &tty->read_buf[tty->read_tail], n); |
1155 | n -= retval; | 1164 | n -= retval; |
1165 | tty_audit_add_data(tty, &tty->read_buf[tty->read_tail], n); | ||
1156 | spin_lock_irqsave(&tty->read_lock, flags); | 1166 | spin_lock_irqsave(&tty->read_lock, flags); |
1157 | tty->read_tail = (tty->read_tail + n) & (N_TTY_BUF_SIZE-1); | 1167 | tty->read_tail = (tty->read_tail + n) & (N_TTY_BUF_SIZE-1); |
1158 | tty->read_cnt -= n; | 1168 | tty->read_cnt -= n; |
@@ -1279,7 +1289,7 @@ do_it_again: | |||
1279 | break; | 1289 | break; |
1280 | cs = tty->link->ctrl_status; | 1290 | cs = tty->link->ctrl_status; |
1281 | tty->link->ctrl_status = 0; | 1291 | tty->link->ctrl_status = 0; |
1282 | if (put_user(cs, b++)) { | 1292 | if (tty_put_user(tty, cs, b++)) { |
1283 | retval = -EFAULT; | 1293 | retval = -EFAULT; |
1284 | b--; | 1294 | b--; |
1285 | break; | 1295 | break; |
@@ -1321,7 +1331,7 @@ do_it_again: | |||
1321 | 1331 | ||
1322 | /* Deal with packet mode. */ | 1332 | /* Deal with packet mode. */ |
1323 | if (tty->packet && b == buf) { | 1333 | if (tty->packet && b == buf) { |
1324 | if (put_user(TIOCPKT_DATA, b++)) { | 1334 | if (tty_put_user(tty, TIOCPKT_DATA, b++)) { |
1325 | retval = -EFAULT; | 1335 | retval = -EFAULT; |
1326 | b--; | 1336 | b--; |
1327 | break; | 1337 | break; |
@@ -1352,15 +1362,17 @@ do_it_again: | |||
1352 | spin_unlock_irqrestore(&tty->read_lock, flags); | 1362 | spin_unlock_irqrestore(&tty->read_lock, flags); |
1353 | 1363 | ||
1354 | if (!eol || (c != __DISABLED_CHAR)) { | 1364 | if (!eol || (c != __DISABLED_CHAR)) { |
1355 | if (put_user(c, b++)) { | 1365 | if (tty_put_user(tty, c, b++)) { |
1356 | retval = -EFAULT; | 1366 | retval = -EFAULT; |
1357 | b--; | 1367 | b--; |
1358 | break; | 1368 | break; |
1359 | } | 1369 | } |
1360 | nr--; | 1370 | nr--; |
1361 | } | 1371 | } |
1362 | if (eol) | 1372 | if (eol) { |
1373 | tty_audit_push(tty); | ||
1363 | break; | 1374 | break; |
1375 | } | ||
1364 | } | 1376 | } |
1365 | if (retval) | 1377 | if (retval) |
1366 | break; | 1378 | break; |