s390/3270: hangup the 3270 tty after a disconnect
The disconnect and later reconnect of a 3270 terminal does not do a tty hangup. The current session is resumed which is a security issue. Do a tty hangup after a unit check has been received. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
7e36eff1ee
commit
0c75691492
|
@ -92,6 +92,7 @@ struct tty3270 {
|
||||||
unsigned char inattr; /* Visible/invisible input. */
|
unsigned char inattr; /* Visible/invisible input. */
|
||||||
int throttle, attn; /* tty throttle/unthrottle. */
|
int throttle, attn; /* tty throttle/unthrottle. */
|
||||||
struct tasklet_struct readlet; /* Tasklet to issue read request. */
|
struct tasklet_struct readlet; /* Tasklet to issue read request. */
|
||||||
|
struct tasklet_struct hanglet; /* Tasklet to hang up the tty. */
|
||||||
struct kbd_data *kbd; /* key_maps stuff. */
|
struct kbd_data *kbd; /* key_maps stuff. */
|
||||||
|
|
||||||
/* Escape sequence parsing. */
|
/* Escape sequence parsing. */
|
||||||
|
@ -645,6 +646,16 @@ tty3270_issue_read(struct tty3270 *tp, int lock)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hang up the tty
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
tty3270_hangup_tasklet(struct tty3270 *tp)
|
||||||
|
{
|
||||||
|
tty_port_tty_hangup(&tp->port, true);
|
||||||
|
raw3270_put_view(&tp->view);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Switch to the tty view.
|
* Switch to the tty view.
|
||||||
*/
|
*/
|
||||||
|
@ -678,11 +689,14 @@ tty3270_irq(struct tty3270 *tp, struct raw3270_request *rq, struct irb *irb)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rq) {
|
if (rq) {
|
||||||
if (irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK)
|
if (irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) {
|
||||||
rq->rc = -EIO;
|
rq->rc = -EIO;
|
||||||
else
|
raw3270_get_view(&tp->view);
|
||||||
|
tasklet_schedule(&tp->hanglet);
|
||||||
|
} else {
|
||||||
/* Normal end. Copy residual count. */
|
/* Normal end. Copy residual count. */
|
||||||
rq->rescnt = irb->scsw.cmd.count;
|
rq->rescnt = irb->scsw.cmd.count;
|
||||||
|
}
|
||||||
} else if (irb->scsw.cmd.dstat & DEV_STAT_DEV_END) {
|
} else if (irb->scsw.cmd.dstat & DEV_STAT_DEV_END) {
|
||||||
/* Interrupt without an outstanding request -> update all */
|
/* Interrupt without an outstanding request -> update all */
|
||||||
tp->update_flags = TTY_UPDATE_ALL;
|
tp->update_flags = TTY_UPDATE_ALL;
|
||||||
|
@ -739,6 +753,9 @@ tty3270_alloc_view(void)
|
||||||
tasklet_init(&tp->readlet,
|
tasklet_init(&tp->readlet,
|
||||||
(void (*)(unsigned long)) tty3270_read_tasklet,
|
(void (*)(unsigned long)) tty3270_read_tasklet,
|
||||||
(unsigned long) tp->read);
|
(unsigned long) tp->read);
|
||||||
|
tasklet_init(&tp->hanglet,
|
||||||
|
(void (*)(unsigned long)) tty3270_hangup_tasklet,
|
||||||
|
(unsigned long) tp);
|
||||||
INIT_WORK(&tp->resize_work, tty3270_resize_work);
|
INIT_WORK(&tp->resize_work, tty3270_resize_work);
|
||||||
|
|
||||||
return tp;
|
return tp;
|
||||||
|
@ -1812,7 +1829,22 @@ tty3270_unthrottle(struct tty_struct * tty)
|
||||||
static void
|
static void
|
||||||
tty3270_hangup(struct tty_struct *tty)
|
tty3270_hangup(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
// FIXME: implement
|
struct tty3270 *tp;
|
||||||
|
|
||||||
|
tp = tty->driver_data;
|
||||||
|
if (!tp)
|
||||||
|
return;
|
||||||
|
spin_lock_bh(&tp->view.lock);
|
||||||
|
tp->cx = tp->saved_cx = 0;
|
||||||
|
tp->cy = tp->saved_cy = 0;
|
||||||
|
tp->highlight = tp->saved_highlight = TAX_RESET;
|
||||||
|
tp->f_color = tp->saved_f_color = TAC_RESET;
|
||||||
|
tty3270_blank_screen(tp);
|
||||||
|
while (tp->nr_lines < tp->view.rows - 2)
|
||||||
|
tty3270_blank_line(tp);
|
||||||
|
tp->update_flags = TTY_UPDATE_ALL;
|
||||||
|
spin_unlock_bh(&tp->view.lock);
|
||||||
|
tty3270_set_timer(tp, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in a new issue