Commit f8ee27f6 authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] sparse: tty_ioctl annotation

tty_ioctl.c annotation
parent 1b27246b
...@@ -140,7 +140,7 @@ static void change_termios(struct tty_struct * tty, struct termios * new_termios ...@@ -140,7 +140,7 @@ static void change_termios(struct tty_struct * tty, struct termios * new_termios
(*tty->ldisc.set_termios)(tty, &old_termios); (*tty->ldisc.set_termios)(tty, &old_termios);
} }
static int set_termios(struct tty_struct * tty, unsigned long arg, int opt) static int set_termios(struct tty_struct * tty, void __user *arg, int opt)
{ {
struct termios tmp_termios; struct termios tmp_termios;
int retval = tty_check_change(tty); int retval = tty_check_change(tty);
...@@ -151,11 +151,11 @@ static int set_termios(struct tty_struct * tty, unsigned long arg, int opt) ...@@ -151,11 +151,11 @@ static int set_termios(struct tty_struct * tty, unsigned long arg, int opt)
if (opt & TERMIOS_TERMIO) { if (opt & TERMIOS_TERMIO) {
memcpy(&tmp_termios, tty->termios, sizeof(struct termios)); memcpy(&tmp_termios, tty->termios, sizeof(struct termios));
if (user_termio_to_kernel_termios(&tmp_termios, if (user_termio_to_kernel_termios(&tmp_termios,
(struct termio *) arg)) (struct termio __user *)arg))
return -EFAULT; return -EFAULT;
} else { } else {
if (user_termios_to_kernel_termios(&tmp_termios, if (user_termios_to_kernel_termios(&tmp_termios,
(struct termios *) arg)) (struct termios __user *)arg))
return -EFAULT; return -EFAULT;
} }
...@@ -172,7 +172,7 @@ static int set_termios(struct tty_struct * tty, unsigned long arg, int opt) ...@@ -172,7 +172,7 @@ static int set_termios(struct tty_struct * tty, unsigned long arg, int opt)
return 0; return 0;
} }
static int get_termio(struct tty_struct * tty, struct termio * termio) static int get_termio(struct tty_struct * tty, struct termio __user * termio)
{ {
if (kernel_termios_to_user_termio(termio, tty->termios)) if (kernel_termios_to_user_termio(termio, tty->termios))
return -EFAULT; return -EFAULT;
...@@ -222,7 +222,7 @@ static int get_sgflags(struct tty_struct * tty) ...@@ -222,7 +222,7 @@ static int get_sgflags(struct tty_struct * tty)
return flags; return flags;
} }
static int get_sgttyb(struct tty_struct * tty, struct sgttyb * sgttyb) static int get_sgttyb(struct tty_struct * tty, struct sgttyb __user * sgttyb)
{ {
struct sgttyb tmp; struct sgttyb tmp;
...@@ -260,7 +260,7 @@ static void set_sgflags(struct termios * termios, int flags) ...@@ -260,7 +260,7 @@ static void set_sgflags(struct termios * termios, int flags)
} }
} }
static int set_sgttyb(struct tty_struct * tty, struct sgttyb * sgttyb) static int set_sgttyb(struct tty_struct * tty, struct sgttyb __user * sgttyb)
{ {
int retval; int retval;
struct sgttyb tmp; struct sgttyb tmp;
...@@ -281,7 +281,7 @@ static int set_sgttyb(struct tty_struct * tty, struct sgttyb * sgttyb) ...@@ -281,7 +281,7 @@ static int set_sgttyb(struct tty_struct * tty, struct sgttyb * sgttyb)
#endif #endif
#ifdef TIOCGETC #ifdef TIOCGETC
static int get_tchars(struct tty_struct * tty, struct tchars * tchars) static int get_tchars(struct tty_struct * tty, struct tchars __user * tchars)
{ {
struct tchars tmp; struct tchars tmp;
...@@ -294,7 +294,7 @@ static int get_tchars(struct tty_struct * tty, struct tchars * tchars) ...@@ -294,7 +294,7 @@ static int get_tchars(struct tty_struct * tty, struct tchars * tchars)
return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0; return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
} }
static int set_tchars(struct tty_struct * tty, struct tchars * tchars) static int set_tchars(struct tty_struct * tty, struct tchars __user * tchars)
{ {
struct tchars tmp; struct tchars tmp;
...@@ -311,7 +311,7 @@ static int set_tchars(struct tty_struct * tty, struct tchars * tchars) ...@@ -311,7 +311,7 @@ static int set_tchars(struct tty_struct * tty, struct tchars * tchars)
#endif #endif
#ifdef TIOCGLTC #ifdef TIOCGLTC
static int get_ltchars(struct tty_struct * tty, struct ltchars * ltchars) static int get_ltchars(struct tty_struct * tty, struct ltchars __user * ltchars)
{ {
struct ltchars tmp; struct ltchars tmp;
...@@ -324,7 +324,7 @@ static int get_ltchars(struct tty_struct * tty, struct ltchars * ltchars) ...@@ -324,7 +324,7 @@ static int get_ltchars(struct tty_struct * tty, struct ltchars * ltchars)
return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0; return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
} }
static int set_ltchars(struct tty_struct * tty, struct ltchars * ltchars) static int set_ltchars(struct tty_struct * tty, struct ltchars __user * ltchars)
{ {
struct ltchars tmp; struct ltchars tmp;
...@@ -363,6 +363,7 @@ int n_tty_ioctl(struct tty_struct * tty, struct file * file, ...@@ -363,6 +363,7 @@ int n_tty_ioctl(struct tty_struct * tty, struct file * file,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
struct tty_struct * real_tty; struct tty_struct * real_tty;
void __user *p = (void __user *)arg;
int retval; int retval;
if (tty->driver->type == TTY_DRIVER_TYPE_PTY && if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
...@@ -374,41 +375,41 @@ int n_tty_ioctl(struct tty_struct * tty, struct file * file, ...@@ -374,41 +375,41 @@ int n_tty_ioctl(struct tty_struct * tty, struct file * file,
switch (cmd) { switch (cmd) {
#ifdef TIOCGETP #ifdef TIOCGETP
case TIOCGETP: case TIOCGETP:
return get_sgttyb(real_tty, (struct sgttyb *) arg); return get_sgttyb(real_tty, (struct sgttyb __user *) arg);
case TIOCSETP: case TIOCSETP:
case TIOCSETN: case TIOCSETN:
return set_sgttyb(real_tty, (struct sgttyb *) arg); return set_sgttyb(real_tty, (struct sgttyb __user *) arg);
#endif #endif
#ifdef TIOCGETC #ifdef TIOCGETC
case TIOCGETC: case TIOCGETC:
return get_tchars(real_tty, (struct tchars *) arg); return get_tchars(real_tty, p);
case TIOCSETC: case TIOCSETC:
return set_tchars(real_tty, (struct tchars *) arg); return set_tchars(real_tty, p);
#endif #endif
#ifdef TIOCGLTC #ifdef TIOCGLTC
case TIOCGLTC: case TIOCGLTC:
return get_ltchars(real_tty, (struct ltchars *) arg); return get_ltchars(real_tty, p);
case TIOCSLTC: case TIOCSLTC:
return set_ltchars(real_tty, (struct ltchars *) arg); return set_ltchars(real_tty, p);
#endif #endif
case TCGETS: case TCGETS:
if (kernel_termios_to_user_termios((struct termios *)arg, real_tty->termios)) if (kernel_termios_to_user_termios((struct termios __user *)arg, real_tty->termios))
return -EFAULT; return -EFAULT;
return 0; return 0;
case TCSETSF: case TCSETSF:
return set_termios(real_tty, arg, TERMIOS_FLUSH | TERMIOS_WAIT); return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT);
case TCSETSW: case TCSETSW:
return set_termios(real_tty, arg, TERMIOS_WAIT); return set_termios(real_tty, p, TERMIOS_WAIT);
case TCSETS: case TCSETS:
return set_termios(real_tty, arg, 0); return set_termios(real_tty, p, 0);
case TCGETA: case TCGETA:
return get_termio(real_tty,(struct termio *) arg); return get_termio(real_tty, p);
case TCSETAF: case TCSETAF:
return set_termios(real_tty, arg, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_TERMIO); return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_TERMIO);
case TCSETAW: case TCSETAW:
return set_termios(real_tty, arg, TERMIOS_WAIT | TERMIOS_TERMIO); return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_TERMIO);
case TCSETA: case TCSETA:
return set_termios(real_tty, arg, TERMIOS_TERMIO); return set_termios(real_tty, p, TERMIOS_TERMIO);
case TCXONC: case TCXONC:
retval = tty_check_change(tty); retval = tty_check_change(tty);
if (retval) if (retval)
...@@ -462,21 +463,21 @@ int n_tty_ioctl(struct tty_struct * tty, struct file * file, ...@@ -462,21 +463,21 @@ int n_tty_ioctl(struct tty_struct * tty, struct file * file,
case TIOCOUTQ: case TIOCOUTQ:
return put_user(tty->driver->chars_in_buffer ? return put_user(tty->driver->chars_in_buffer ?
tty->driver->chars_in_buffer(tty) : 0, tty->driver->chars_in_buffer(tty) : 0,
(int *) arg); (int __user *) arg);
case TIOCINQ: case TIOCINQ:
retval = tty->read_cnt; retval = tty->read_cnt;
if (L_ICANON(tty)) if (L_ICANON(tty))
retval = inq_canon(tty); retval = inq_canon(tty);
return put_user(retval, (unsigned int *) arg); return put_user(retval, (unsigned int __user *) arg);
case TIOCGLCKTRMIOS: case TIOCGLCKTRMIOS:
if (kernel_termios_to_user_termios((struct termios *)arg, real_tty->termios_locked)) if (kernel_termios_to_user_termios((struct termios __user *)arg, real_tty->termios_locked))
return -EFAULT; return -EFAULT;
return 0; return 0;
case TIOCSLCKTRMIOS: case TIOCSLCKTRMIOS:
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
return -EPERM; return -EPERM;
if (user_termios_to_kernel_termios(real_tty->termios_locked, (struct termios *) arg)) if (user_termios_to_kernel_termios(real_tty->termios_locked, (struct termios __user *) arg))
return -EFAULT; return -EFAULT;
return 0; return 0;
...@@ -487,7 +488,7 @@ int n_tty_ioctl(struct tty_struct * tty, struct file * file, ...@@ -487,7 +488,7 @@ int n_tty_ioctl(struct tty_struct * tty, struct file * file,
if (tty->driver->type != TTY_DRIVER_TYPE_PTY || if (tty->driver->type != TTY_DRIVER_TYPE_PTY ||
tty->driver->subtype != PTY_TYPE_MASTER) tty->driver->subtype != PTY_TYPE_MASTER)
return -ENOTTY; return -ENOTTY;
if (get_user(pktmode, (int *) arg)) if (get_user(pktmode, (int __user *) arg))
return -EFAULT; return -EFAULT;
if (pktmode) { if (pktmode) {
if (!tty->packet) { if (!tty->packet) {
...@@ -499,9 +500,9 @@ int n_tty_ioctl(struct tty_struct * tty, struct file * file, ...@@ -499,9 +500,9 @@ int n_tty_ioctl(struct tty_struct * tty, struct file * file,
return 0; return 0;
} }
case TIOCGSOFTCAR: case TIOCGSOFTCAR:
return put_user(C_CLOCAL(tty) ? 1 : 0, (int *) arg); return put_user(C_CLOCAL(tty) ? 1 : 0, (int __user *)arg);
case TIOCSSOFTCAR: case TIOCSSOFTCAR:
if (get_user(arg, (unsigned int *) arg)) if (get_user(arg, (unsigned int __user *) arg))
return -EFAULT; return -EFAULT;
tty->termios->c_cflag = tty->termios->c_cflag =
((tty->termios->c_cflag & ~CLOCAL) | ((tty->termios->c_cflag & ~CLOCAL) |
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment