move compat handling of tty ioctls to tty_compat_ioctl()
ioctls that are * callable only via tty_ioctl() * not driver-specific * not demand data structure conversions * either always need passing arg as is or always demand compat_ptr() get intercepted in tty_compat_ioctl() from the very beginning and redirecter to tty_ioctl(). As the result, their entries in fs/compat_ioctl.c (some of those had been missing, BTW) got removed, as well as n_tty_compat_ioctl_helper() (now it's never called with any cmd it would accept). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
77021f8bab
commit
e21120383f
|
@ -97,6 +97,7 @@
|
|||
#include <linux/seq_file.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/compat.h>
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
|
@ -2668,6 +2669,81 @@ static long tty_compat_ioctl(struct file *file, unsigned int cmd,
|
|||
struct tty_ldisc *ld;
|
||||
int retval = -ENOIOCTLCMD;
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCSTI:
|
||||
case TIOCGWINSZ:
|
||||
case TIOCSWINSZ:
|
||||
case TIOCGEXCL:
|
||||
case TIOCGETD:
|
||||
case TIOCSETD:
|
||||
case TIOCGDEV:
|
||||
case TIOCMGET:
|
||||
case TIOCMSET:
|
||||
case TIOCMBIC:
|
||||
case TIOCMBIS:
|
||||
case TIOCGICOUNT:
|
||||
case TIOCGPGRP:
|
||||
case TIOCSPGRP:
|
||||
case TIOCGSID:
|
||||
case TIOCSERGETLSR:
|
||||
case TIOCGRS485:
|
||||
case TIOCSRS485:
|
||||
#ifdef TIOCGETP
|
||||
case TIOCGETP:
|
||||
case TIOCSETP:
|
||||
case TIOCSETN:
|
||||
#endif
|
||||
#ifdef TIOCGETC
|
||||
case TIOCGETC:
|
||||
case TIOCSETC:
|
||||
#endif
|
||||
#ifdef TIOCGLTC
|
||||
case TIOCGLTC:
|
||||
case TIOCSLTC:
|
||||
#endif
|
||||
case TCSETSF:
|
||||
case TCSETSW:
|
||||
case TCSETS:
|
||||
case TCGETS:
|
||||
#ifdef TCGETS2
|
||||
case TCGETS2:
|
||||
case TCSETSF2:
|
||||
case TCSETSW2:
|
||||
case TCSETS2:
|
||||
#endif
|
||||
case TCGETA:
|
||||
case TCSETAF:
|
||||
case TCSETAW:
|
||||
case TCSETA:
|
||||
case TIOCGLCKTRMIOS:
|
||||
case TIOCSLCKTRMIOS:
|
||||
#ifdef TCGETX
|
||||
case TCGETX:
|
||||
case TCSETX:
|
||||
case TCSETXW:
|
||||
case TCSETXF:
|
||||
#endif
|
||||
case TIOCGSOFTCAR:
|
||||
case TIOCSSOFTCAR:
|
||||
return tty_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
|
||||
case TIOCCONS:
|
||||
case TIOCEXCL:
|
||||
case TIOCNXCL:
|
||||
case TIOCVHANGUP:
|
||||
case TIOCSBRK:
|
||||
case TIOCCBRK:
|
||||
case TCSBRK:
|
||||
case TCSBRKP:
|
||||
case TCFLSH:
|
||||
case TIOCGPTPEER:
|
||||
case TIOCNOTTY:
|
||||
case TIOCSCTTY:
|
||||
case TCXONC:
|
||||
case TIOCMIWAIT:
|
||||
case TIOCSERCONFIG:
|
||||
return tty_ioctl(file, cmd, arg);
|
||||
}
|
||||
|
||||
if (tty_paranoia_check(tty, file_inode(file), "tty_ioctl"))
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -2682,8 +2758,6 @@ static long tty_compat_ioctl(struct file *file, unsigned int cmd,
|
|||
return hung_up_tty_compat_ioctl(file, cmd, arg);
|
||||
if (ld->ops->compat_ioctl)
|
||||
retval = ld->ops->compat_ioctl(tty, file, cmd, arg);
|
||||
else
|
||||
retval = n_tty_compat_ioctl_helper(tty, file, cmd, arg);
|
||||
tty_ldisc_deref(ld);
|
||||
|
||||
return retval;
|
||||
|
|
|
@ -941,19 +941,3 @@ int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
|
|||
}
|
||||
}
|
||||
EXPORT_SYMBOL(n_tty_ioctl_helper);
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
long n_tty_compat_ioctl_helper(struct tty_struct *tty, struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
switch (cmd) {
|
||||
case TIOCGLCKTRMIOS:
|
||||
case TIOCSLCKTRMIOS:
|
||||
return tty_mode_ioctl(tty, file, cmd, (unsigned long) compat_ptr(arg));
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(n_tty_compat_ioctl_helper);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -711,52 +711,9 @@ COMPATIBLE_IOCTL(0x4B50) /* KDGHWCLK - not in the kernel, but don't complain *
|
|||
COMPATIBLE_IOCTL(0x4B51) /* KDSHWCLK - not in the kernel, but don't complain */
|
||||
|
||||
/* Big T */
|
||||
COMPATIBLE_IOCTL(TCGETA)
|
||||
COMPATIBLE_IOCTL(TCSETA)
|
||||
COMPATIBLE_IOCTL(TCSETAW)
|
||||
COMPATIBLE_IOCTL(TCSETAF)
|
||||
COMPATIBLE_IOCTL(TCSBRK)
|
||||
COMPATIBLE_IOCTL(TCXONC)
|
||||
COMPATIBLE_IOCTL(TCFLSH)
|
||||
COMPATIBLE_IOCTL(TCGETS)
|
||||
COMPATIBLE_IOCTL(TCSETS)
|
||||
COMPATIBLE_IOCTL(TCSETSW)
|
||||
COMPATIBLE_IOCTL(TCSETSF)
|
||||
COMPATIBLE_IOCTL(TIOCLINUX)
|
||||
COMPATIBLE_IOCTL(TIOCSBRK)
|
||||
COMPATIBLE_IOCTL(TIOCGDEV)
|
||||
COMPATIBLE_IOCTL(TIOCCBRK)
|
||||
COMPATIBLE_IOCTL(TIOCGSID)
|
||||
COMPATIBLE_IOCTL(TIOCGICOUNT)
|
||||
COMPATIBLE_IOCTL(TIOCGEXCL)
|
||||
/* Little t */
|
||||
COMPATIBLE_IOCTL(TIOCGETD)
|
||||
COMPATIBLE_IOCTL(TIOCSETD)
|
||||
COMPATIBLE_IOCTL(TIOCEXCL)
|
||||
COMPATIBLE_IOCTL(TIOCNXCL)
|
||||
COMPATIBLE_IOCTL(TIOCCONS)
|
||||
COMPATIBLE_IOCTL(TIOCGSOFTCAR)
|
||||
COMPATIBLE_IOCTL(TIOCSSOFTCAR)
|
||||
COMPATIBLE_IOCTL(TIOCSWINSZ)
|
||||
COMPATIBLE_IOCTL(TIOCGWINSZ)
|
||||
COMPATIBLE_IOCTL(TIOCMGET)
|
||||
COMPATIBLE_IOCTL(TIOCMBIC)
|
||||
COMPATIBLE_IOCTL(TIOCMBIS)
|
||||
COMPATIBLE_IOCTL(TIOCMSET)
|
||||
COMPATIBLE_IOCTL(TIOCNOTTY)
|
||||
COMPATIBLE_IOCTL(TIOCSTI)
|
||||
COMPATIBLE_IOCTL(TIOCOUTQ)
|
||||
COMPATIBLE_IOCTL(TIOCSPGRP)
|
||||
COMPATIBLE_IOCTL(TIOCGPGRP)
|
||||
COMPATIBLE_IOCTL(TIOCSERGETLSR)
|
||||
COMPATIBLE_IOCTL(TIOCSRS485)
|
||||
COMPATIBLE_IOCTL(TIOCGRS485)
|
||||
#ifdef TCGETS2
|
||||
COMPATIBLE_IOCTL(TCGETS2)
|
||||
COMPATIBLE_IOCTL(TCSETS2)
|
||||
COMPATIBLE_IOCTL(TCSETSW2)
|
||||
COMPATIBLE_IOCTL(TCSETSF2)
|
||||
#endif
|
||||
/* Little f */
|
||||
COMPATIBLE_IOCTL(FIOCLEX)
|
||||
COMPATIBLE_IOCTL(FIONCLEX)
|
||||
|
@ -1219,10 +1176,6 @@ COMPATIBLE_IOCTL(JSIOCGAXES)
|
|||
COMPATIBLE_IOCTL(JSIOCGBUTTONS)
|
||||
COMPATIBLE_IOCTL(JSIOCGNAME(0))
|
||||
|
||||
#ifdef TIOCGLTC
|
||||
COMPATIBLE_IOCTL(TIOCGLTC)
|
||||
COMPATIBLE_IOCTL(TIOCSLTC)
|
||||
#endif
|
||||
#ifdef TIOCSTART
|
||||
/*
|
||||
* For these two we have definitions in ioctls.h and/or termios.h on
|
||||
|
@ -1312,10 +1265,6 @@ static long do_ioctl_trans(unsigned int cmd,
|
|||
* so we must not do a compat_ptr() translation.
|
||||
*/
|
||||
switch (cmd) {
|
||||
/* Big T */
|
||||
case TCSBRKP:
|
||||
case TIOCMIWAIT:
|
||||
case TIOCSCTTY:
|
||||
/* RAID */
|
||||
case HOT_REMOVE_DISK:
|
||||
case HOT_ADD_DISK:
|
||||
|
|
|
@ -746,8 +746,6 @@ static inline int tty_audit_push(void)
|
|||
/* tty_ioctl.c */
|
||||
extern int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern long n_tty_compat_ioctl_helper(struct tty_struct *tty, struct file *file,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
|
||||
/* vt.c */
|
||||
|
||||
|
|
Loading…
Reference in New Issue