Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf7da7bc authored by Al Viro's avatar Al Viro
Browse files

[PATCH] remove horrors with irix tty ioctls handling



Existing code in there (get_tty(), etc.) is both severely
racy *and* pointless: ioctls in question have Linux equivalents
and there's no need to play silly buggers in irix_ioctl() -
just need to replace arguments and, in case of TIOCGSID,
deal with API differences - Linux one expects pid_t __user *
while Irix one does unsigned long __user *.  BFD...

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 74d92abc
Loading
Loading
Loading
Loading
+9 −46
Original line number Original line Diff line number Diff line
@@ -27,33 +27,6 @@ struct irix_termios {
	cc_t c_cc[NCCS];
	cc_t c_cc[NCCS];
};
};


extern void start_tty(struct tty_struct *tty);
static struct tty_struct *get_tty(int fd)
{
	struct file *filp;
	struct tty_struct *ttyp = NULL;

	rcu_read_lock();
	filp = fcheck(fd);
	if(filp && filp->private_data) {
		ttyp = (struct tty_struct *) filp->private_data;

		if(ttyp->magic != TTY_MAGIC)
			ttyp =NULL;
	}
	rcu_read_unlock();
	return ttyp;
}

static struct tty_struct *get_real_tty(struct tty_struct *tp)
{
	if (tp->driver->type == TTY_DRIVER_TYPE_PTY &&
	   tp->driver->subtype == PTY_TYPE_MASTER)
		return tp->link;
	else
		return tp;
}

asmlinkage int irix_ioctl(int fd, unsigned long cmd, unsigned long arg)
asmlinkage int irix_ioctl(int fd, unsigned long cmd, unsigned long arg)
{
{
	struct tty_struct *tp, *rtp;
	struct tty_struct *tp, *rtp;
@@ -146,34 +119,24 @@ asmlinkage int irix_ioctl(int fd, unsigned long cmd, unsigned long arg)
		error = sys_ioctl(fd, TIOCNOTTY, arg);
		error = sys_ioctl(fd, TIOCNOTTY, arg);
		break;
		break;


	case 0x00007416:
	case 0x00007416: {
		pid_t pid;
#ifdef DEBUG_IOCTLS
#ifdef DEBUG_IOCTLS
		printk("TIOCGSID, %08lx) ", arg);
		printk("TIOCGSID, %08lx) ", arg);
#endif
#endif
		tp = get_tty(fd);
		old_fs = get_fs(); set_fs(get_ds());
		if(!tp) {
		error = sys_ioctl(fd, TIOCGSID, (unsigned long)&pid);
			error = -EINVAL;
		set_fs(old_fs);
		if (!error)
			error = put_user(pid, (unsigned long __user *) arg);
		break;
		break;
	}
	}
		rtp = get_real_tty(tp);
#ifdef DEBUG_IOCTLS
		printk("rtp->session=%d ", rtp->session);
#endif
		error = put_user(rtp->session, (unsigned long __user *) arg);
		break;

	case 0x746e:
	case 0x746e:
		/* TIOCSTART, same effect as hitting ^Q */
		/* TIOCSTART, same effect as hitting ^Q */
#ifdef DEBUG_IOCTLS
#ifdef DEBUG_IOCTLS
		printk("TIOCSTART, %08lx) ", arg);
		printk("TIOCSTART, %08lx) ", arg);
#endif
#endif
		tp = get_tty(fd);
		error = sys_ioctl(fd, TCXONC, TCOON);
		if(!tp) {
			error = -EINVAL;
			break;
		}
		rtp = get_real_tty(tp);
		start_tty(rtp);
		break;
		break;


	case 0x20006968:
	case 0x20006968: