Skip to content

Commit

Permalink
isicom: prepare for lock_kernel push down
Browse files Browse the repository at this point in the history
Again lock the bits we can't trivially prove are safe without the BKL and
remove the broken TIOCS/GSOFTCAR handler.

Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Alan Cox authored and Linus Torvalds committed Apr 30, 2008
1 parent 5a4bc8c commit 1eac494
Showing 1 changed file with 8 additions and 14 deletions.
22 changes: 8 additions & 14 deletions drivers/char/isicom.c
Original file line number Diff line number Diff line change
Expand Up @@ -1258,15 +1258,19 @@ static int isicom_set_serial_info(struct isi_port *port,
if (copy_from_user(&newinfo, info, sizeof(newinfo)))
return -EFAULT;

lock_kernel();

reconfig_port = ((port->flags & ASYNC_SPD_MASK) !=
(newinfo.flags & ASYNC_SPD_MASK));

if (!capable(CAP_SYS_ADMIN)) {
if ((newinfo.close_delay != port->close_delay) ||
(newinfo.closing_wait != port->closing_wait) ||
((newinfo.flags & ~ASYNC_USR_MASK) !=
(port->flags & ~ASYNC_USR_MASK)))
(port->flags & ~ASYNC_USR_MASK))) {
unlock_kernel();
return -EPERM;
}
port->flags = ((port->flags & ~ ASYNC_USR_MASK) |
(newinfo.flags & ASYNC_USR_MASK));
}
Expand All @@ -1282,6 +1286,7 @@ static int isicom_set_serial_info(struct isi_port *port,
isicom_config_port(port);
spin_unlock_irqrestore(&port->card->card_lock, flags);
}
unlock_kernel();
return 0;
}

Expand All @@ -1290,6 +1295,7 @@ static int isicom_get_serial_info(struct isi_port *port,
{
struct serial_struct out_info;

lock_kernel();
memset(&out_info, 0, sizeof(out_info));
/* out_info.type = ? */
out_info.line = port - isi_ports;
Expand All @@ -1299,6 +1305,7 @@ static int isicom_get_serial_info(struct isi_port *port,
/* out_info.baud_base = ? */
out_info.close_delay = port->close_delay;
out_info.closing_wait = port->closing_wait;
unlock_kernel();
if (copy_to_user(info, &out_info, sizeof(out_info)))
return -EFAULT;
return 0;
Expand Down Expand Up @@ -1331,19 +1338,6 @@ static int isicom_ioctl(struct tty_struct *tty, struct file *filp,
tty_wait_until_sent(tty, 0);
isicom_send_break(port, arg ? arg * (HZ/10) : HZ/4);
return 0;

case TIOCGSOFTCAR:
return put_user(C_CLOCAL(tty) ? 1 : 0,
(unsigned long __user *)argp);

case TIOCSSOFTCAR:
if (get_user(arg, (unsigned long __user *) argp))
return -EFAULT;
tty->termios->c_cflag =
((tty->termios->c_cflag & ~CLOCAL) |
(arg ? CLOCAL : 0));
return 0;

case TIOCGSERIAL:
return isicom_get_serial_info(port, argp);

Expand Down

0 comments on commit 1eac494

Please sign in to comment.