tty: Remove dead termiox code
set_termiox() and the TCGETX handler bail out with -EINVAL immediately if ->termiox is NULL, but there are no code paths that can set ->termiox to a non-NULL pointer; and no such code paths seem to have existed since the termiox mechanism was introduced back in commit 1d65b4a088de ("tty: Add termiox") in v2.6.28. Similarly, no driver actually implements .set_termiox; and it looks like no driver ever has. Delete this dead code; but leave the definition of struct termiox in the UAPI headers intact. Signed-off-by: Jann Horn <jannh@google.com> Link: https://lore.kernel.org/r/20201203020331.2394754-1-jannh@google.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
aef1b6a279
commit
e0efb3168d
@ -443,51 +443,6 @@ static int get_termio(struct tty_struct *tty, struct termio __user *termio)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef TCGETX
|
|
||||||
|
|
||||||
/**
|
|
||||||
* set_termiox - set termiox fields if possible
|
|
||||||
* @tty: terminal
|
|
||||||
* @arg: termiox structure from user
|
|
||||||
* @opt: option flags for ioctl type
|
|
||||||
*
|
|
||||||
* Implement the device calling points for the SYS5 termiox ioctl
|
|
||||||
* interface in Linux
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int set_termiox(struct tty_struct *tty, void __user *arg, int opt)
|
|
||||||
{
|
|
||||||
struct termiox tnew;
|
|
||||||
struct tty_ldisc *ld;
|
|
||||||
|
|
||||||
if (tty->termiox == NULL)
|
|
||||||
return -EINVAL;
|
|
||||||
if (copy_from_user(&tnew, arg, sizeof(struct termiox)))
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
ld = tty_ldisc_ref(tty);
|
|
||||||
if (ld != NULL) {
|
|
||||||
if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer)
|
|
||||||
ld->ops->flush_buffer(tty);
|
|
||||||
tty_ldisc_deref(ld);
|
|
||||||
}
|
|
||||||
if (opt & TERMIOS_WAIT) {
|
|
||||||
tty_wait_until_sent(tty, 0);
|
|
||||||
if (signal_pending(current))
|
|
||||||
return -ERESTARTSYS;
|
|
||||||
}
|
|
||||||
|
|
||||||
down_write(&tty->termios_rwsem);
|
|
||||||
if (tty->ops->set_termiox)
|
|
||||||
tty->ops->set_termiox(tty, &tnew);
|
|
||||||
up_write(&tty->termios_rwsem);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef TIOCGETP
|
#ifdef TIOCGETP
|
||||||
/*
|
/*
|
||||||
* These are deprecated, but there is limited support..
|
* These are deprecated, but there is limited support..
|
||||||
@ -815,23 +770,11 @@ int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
|
|||||||
return ret;
|
return ret;
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCGETX
|
#ifdef TCGETX
|
||||||
case TCGETX: {
|
case TCGETX:
|
||||||
struct termiox ktermx;
|
|
||||||
if (real_tty->termiox == NULL)
|
|
||||||
return -EINVAL;
|
|
||||||
down_read(&real_tty->termios_rwsem);
|
|
||||||
memcpy(&ktermx, real_tty->termiox, sizeof(struct termiox));
|
|
||||||
up_read(&real_tty->termios_rwsem);
|
|
||||||
if (copy_to_user(p, &ktermx, sizeof(struct termiox)))
|
|
||||||
ret = -EFAULT;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
case TCSETX:
|
case TCSETX:
|
||||||
return set_termiox(real_tty, p, 0);
|
|
||||||
case TCSETXW:
|
case TCSETXW:
|
||||||
return set_termiox(real_tty, p, TERMIOS_WAIT);
|
|
||||||
case TCSETXF:
|
case TCSETXF:
|
||||||
return set_termiox(real_tty, p, TERMIOS_FLUSH);
|
return -EINVAL;
|
||||||
#endif
|
#endif
|
||||||
case TIOCGSOFTCAR:
|
case TIOCGSOFTCAR:
|
||||||
copy_termios(real_tty, &kterm);
|
copy_termios(real_tty, &kterm);
|
||||||
|
@ -303,7 +303,6 @@ struct tty_struct {
|
|||||||
spinlock_t flow_lock;
|
spinlock_t flow_lock;
|
||||||
/* Termios values are protected by the termios rwsem */
|
/* Termios values are protected by the termios rwsem */
|
||||||
struct ktermios termios, termios_locked;
|
struct ktermios termios, termios_locked;
|
||||||
struct termiox *termiox; /* May be NULL for unsupported */
|
|
||||||
char name[64];
|
char name[64];
|
||||||
struct pid *pgrp; /* Protected by ctrl lock */
|
struct pid *pgrp; /* Protected by ctrl lock */
|
||||||
struct pid *session;
|
struct pid *session;
|
||||||
|
@ -224,14 +224,6 @@
|
|||||||
* line). See tty_do_resize() if you need to wrap the standard method
|
* line). See tty_do_resize() if you need to wrap the standard method
|
||||||
* in your own logic - the usual case.
|
* in your own logic - the usual case.
|
||||||
*
|
*
|
||||||
* void (*set_termiox)(struct tty_struct *tty, struct termiox *new);
|
|
||||||
*
|
|
||||||
* Called when the device receives a termiox based ioctl. Passes down
|
|
||||||
* the requested data from user space. This method will not be invoked
|
|
||||||
* unless the tty also has a valid tty->termiox pointer.
|
|
||||||
*
|
|
||||||
* Optional: Called under the termios lock
|
|
||||||
*
|
|
||||||
* int (*get_icount)(struct tty_struct *tty, struct serial_icounter *icount);
|
* int (*get_icount)(struct tty_struct *tty, struct serial_icounter *icount);
|
||||||
*
|
*
|
||||||
* Called when the device receives a TIOCGICOUNT ioctl. Passed a kernel
|
* Called when the device receives a TIOCGICOUNT ioctl. Passed a kernel
|
||||||
@ -285,7 +277,6 @@ struct tty_operations {
|
|||||||
int (*tiocmset)(struct tty_struct *tty,
|
int (*tiocmset)(struct tty_struct *tty,
|
||||||
unsigned int set, unsigned int clear);
|
unsigned int set, unsigned int clear);
|
||||||
int (*resize)(struct tty_struct *tty, struct winsize *ws);
|
int (*resize)(struct tty_struct *tty, struct winsize *ws);
|
||||||
int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew);
|
|
||||||
int (*get_icount)(struct tty_struct *tty,
|
int (*get_icount)(struct tty_struct *tty,
|
||||||
struct serial_icounter_struct *icount);
|
struct serial_icounter_struct *icount);
|
||||||
int (*get_serial)(struct tty_struct *tty, struct serial_struct *p);
|
int (*get_serial)(struct tty_struct *tty, struct serial_struct *p);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user