mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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 1d65b4a088 ("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
					
				
					 3 changed files with 2 additions and 69 deletions
				
			
		| 
						 | 
				
			
			@ -443,51 +443,6 @@ static int get_termio(struct tty_struct *tty, struct termio __user *termio)
 | 
			
		|||
	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
 | 
			
		||||
/*
 | 
			
		||||
 * 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;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef 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 TCGETX:
 | 
			
		||||
	case TCSETX:
 | 
			
		||||
		return set_termiox(real_tty, p, 0);
 | 
			
		||||
	case TCSETXW:
 | 
			
		||||
		return set_termiox(real_tty, p, TERMIOS_WAIT);
 | 
			
		||||
	case TCSETXF:
 | 
			
		||||
		return set_termiox(real_tty, p, TERMIOS_FLUSH);
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
#endif		
 | 
			
		||||
	case TIOCGSOFTCAR:
 | 
			
		||||
		copy_termios(real_tty, &kterm);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -303,7 +303,6 @@ struct tty_struct {
 | 
			
		|||
	spinlock_t flow_lock;
 | 
			
		||||
	/* Termios values are protected by the termios rwsem */
 | 
			
		||||
	struct ktermios termios, termios_locked;
 | 
			
		||||
	struct termiox *termiox;	/* May be NULL for unsupported */
 | 
			
		||||
	char name[64];
 | 
			
		||||
	struct pid *pgrp;		/* Protected by ctrl lock */
 | 
			
		||||
	struct pid *session;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -224,14 +224,6 @@
 | 
			
		|||
 *	line). See tty_do_resize() if you need to wrap the standard method
 | 
			
		||||
 *	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);
 | 
			
		||||
 *
 | 
			
		||||
 *	Called when the device receives a TIOCGICOUNT ioctl. Passed a kernel
 | 
			
		||||
| 
						 | 
				
			
			@ -285,7 +277,6 @@ struct tty_operations {
 | 
			
		|||
	int (*tiocmset)(struct tty_struct *tty,
 | 
			
		||||
			unsigned int set, unsigned int clear);
 | 
			
		||||
	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,
 | 
			
		||||
				struct serial_icounter_struct *icount);
 | 
			
		||||
	int  (*get_serial)(struct tty_struct *tty, struct serial_struct *p);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue