diff options
Diffstat (limited to 'session.c')
-rw-r--r-- | session.c | 90 |
1 files changed, 32 insertions, 58 deletions
@@ -33,7 +33,7 @@ | |||
33 | */ | 33 | */ |
34 | 34 | ||
35 | #include "includes.h" | 35 | #include "includes.h" |
36 | RCSID("$OpenBSD: session.c,v 1.85 2001/06/12 10:58:29 markus Exp $"); | 36 | RCSID("$OpenBSD: session.c,v 1.86 2001/06/12 16:10:38 markus Exp $"); |
37 | 37 | ||
38 | #include "ssh.h" | 38 | #include "ssh.h" |
39 | #include "ssh1.h" | 39 | #include "ssh1.h" |
@@ -122,6 +122,7 @@ struct Session { | |||
122 | Session *session_new(void); | 122 | Session *session_new(void); |
123 | void session_set_fds(Session *s, int fdin, int fdout, int fderr); | 123 | void session_set_fds(Session *s, int fdin, int fdout, int fderr); |
124 | void session_pty_cleanup(void *session); | 124 | void session_pty_cleanup(void *session); |
125 | int session_pty_req(Session *s); | ||
125 | void session_proctitle(Session *s); | 126 | void session_proctitle(Session *s); |
126 | int session_setup_x11fwd(Session *s); | 127 | int session_setup_x11fwd(Session *s); |
127 | void session_close(Session *s); | 128 | void session_close(Session *s); |
@@ -242,7 +243,7 @@ do_authenticated1(Authctxt *authctxt) | |||
242 | { | 243 | { |
243 | Session *s; | 244 | Session *s; |
244 | char *command; | 245 | char *command; |
245 | int success, type, n_bytes, plen, screen_flag, have_pty = 0; | 246 | int success, type, plen, screen_flag; |
246 | int compression_level = 0, enable_compression_after_reply = 0; | 247 | int compression_level = 0, enable_compression_after_reply = 0; |
247 | u_int proto_len, data_len, dlen; | 248 | u_int proto_len, data_len, dlen; |
248 | 249 | ||
@@ -275,51 +276,7 @@ do_authenticated1(Authctxt *authctxt) | |||
275 | break; | 276 | break; |
276 | 277 | ||
277 | case SSH_CMSG_REQUEST_PTY: | 278 | case SSH_CMSG_REQUEST_PTY: |
278 | if (no_pty_flag) { | 279 | success = session_pty_req(s); |
279 | debug("Allocating a pty not permitted for this authentication."); | ||
280 | break; | ||
281 | } | ||
282 | if (have_pty) | ||
283 | packet_disconnect("Protocol error: you already have a pty."); | ||
284 | |||
285 | debug("Allocating pty."); | ||
286 | |||
287 | /* Allocate a pty and open it. */ | ||
288 | if (!pty_allocate(&s->ptyfd, &s->ttyfd, s->tty, | ||
289 | sizeof(s->tty))) { | ||
290 | error("Failed to allocate pty."); | ||
291 | break; | ||
292 | } | ||
293 | fatal_add_cleanup(session_pty_cleanup, (void *)s); | ||
294 | pty_setowner(s->pw, s->tty); | ||
295 | |||
296 | /* Get TERM from the packet. Note that the value may be of arbitrary length. */ | ||
297 | s->term = packet_get_string(&dlen); | ||
298 | packet_integrity_check(dlen, strlen(s->term), type); | ||
299 | /* packet_integrity_check(plen, 4 + dlen + 4*4 + n_bytes, type); */ | ||
300 | /* Remaining bytes */ | ||
301 | n_bytes = plen - (4 + dlen + 4 * 4); | ||
302 | |||
303 | if (strcmp(s->term, "") == 0) { | ||
304 | xfree(s->term); | ||
305 | s->term = NULL; | ||
306 | } | ||
307 | /* Get window size from the packet. */ | ||
308 | s->row = packet_get_int(); | ||
309 | s->col = packet_get_int(); | ||
310 | s->xpixel = packet_get_int(); | ||
311 | s->ypixel = packet_get_int(); | ||
312 | pty_change_window_size(s->ptyfd, s->row, s->col, s->xpixel, s->ypixel); | ||
313 | |||
314 | /* Get tty modes from the packet. */ | ||
315 | tty_parse_modes(s->ttyfd, &n_bytes); | ||
316 | packet_integrity_check(plen, 4 + dlen + 4 * 4 + n_bytes, type); | ||
317 | |||
318 | session_proctitle(s); | ||
319 | |||
320 | /* Indicate that we now have a pty. */ | ||
321 | success = 1; | ||
322 | have_pty = 1; | ||
323 | break; | 280 | break; |
324 | 281 | ||
325 | case SSH_CMSG_X11_REQUEST_FORWARDING: | 282 | case SSH_CMSG_X11_REQUEST_FORWARDING: |
@@ -391,7 +348,7 @@ do_authenticated1(Authctxt *authctxt) | |||
391 | command = forced_command; | 348 | command = forced_command; |
392 | debug("Forced command '%.500s'", forced_command); | 349 | debug("Forced command '%.500s'", forced_command); |
393 | } | 350 | } |
394 | if (have_pty) | 351 | if (s->ttyfd != -1) |
395 | do_exec_pty(s, command); | 352 | do_exec_pty(s, command); |
396 | else | 353 | else |
397 | do_exec_no_pty(s, command); | 354 | do_exec_no_pty(s, command); |
@@ -1631,13 +1588,24 @@ session_pty_req(Session *s) | |||
1631 | u_int len; | 1588 | u_int len; |
1632 | int n_bytes; | 1589 | int n_bytes; |
1633 | 1590 | ||
1634 | if (no_pty_flag) | 1591 | if (no_pty_flag) { |
1592 | debug("Allocating a pty not permitted for this authentication."); | ||
1635 | return 0; | 1593 | return 0; |
1636 | if (s->ttyfd != -1) | 1594 | } |
1595 | if (s->ttyfd != -1) { | ||
1596 | packet_disconnect("Protocol error: you already have a pty."); | ||
1637 | return 0; | 1597 | return 0; |
1598 | } | ||
1599 | |||
1638 | s->term = packet_get_string(&len); | 1600 | s->term = packet_get_string(&len); |
1639 | s->col = packet_get_int(); | 1601 | |
1640 | s->row = packet_get_int(); | 1602 | if (compat20) { |
1603 | s->col = packet_get_int(); | ||
1604 | s->row = packet_get_int(); | ||
1605 | } else { | ||
1606 | s->row = packet_get_int(); | ||
1607 | s->col = packet_get_int(); | ||
1608 | } | ||
1641 | s->xpixel = packet_get_int(); | 1609 | s->xpixel = packet_get_int(); |
1642 | s->ypixel = packet_get_int(); | 1610 | s->ypixel = packet_get_int(); |
1643 | 1611 | ||
@@ -1645,9 +1613,12 @@ session_pty_req(Session *s) | |||
1645 | xfree(s->term); | 1613 | xfree(s->term); |
1646 | s->term = NULL; | 1614 | s->term = NULL; |
1647 | } | 1615 | } |
1616 | |||
1648 | /* Allocate a pty and open it. */ | 1617 | /* Allocate a pty and open it. */ |
1618 | debug("Allocating pty."); | ||
1649 | if (!pty_allocate(&s->ptyfd, &s->ttyfd, s->tty, sizeof(s->tty))) { | 1619 | if (!pty_allocate(&s->ptyfd, &s->ttyfd, s->tty, sizeof(s->tty))) { |
1650 | xfree(s->term); | 1620 | if (s->term) |
1621 | xfree(s->term); | ||
1651 | s->term = NULL; | 1622 | s->term = NULL; |
1652 | s->ptyfd = -1; | 1623 | s->ptyfd = -1; |
1653 | s->ttyfd = -1; | 1624 | s->ttyfd = -1; |
@@ -1655,21 +1626,24 @@ session_pty_req(Session *s) | |||
1655 | return 0; | 1626 | return 0; |
1656 | } | 1627 | } |
1657 | debug("session_pty_req: session %d alloc %s", s->self, s->tty); | 1628 | debug("session_pty_req: session %d alloc %s", s->self, s->tty); |
1629 | |||
1630 | /* for SSH1 the tty modes length is not given */ | ||
1631 | if (!compat20) | ||
1632 | n_bytes = packet_remaining(); | ||
1633 | tty_parse_modes(s->ttyfd, &n_bytes); | ||
1634 | |||
1658 | /* | 1635 | /* |
1659 | * Add a cleanup function to clear the utmp entry and record logout | 1636 | * Add a cleanup function to clear the utmp entry and record logout |
1660 | * time in case we call fatal() (e.g., the connection gets closed). | 1637 | * time in case we call fatal() (e.g., the connection gets closed). |
1661 | */ | 1638 | */ |
1662 | fatal_add_cleanup(session_pty_cleanup, (void *)s); | 1639 | fatal_add_cleanup(session_pty_cleanup, (void *)s); |
1663 | pty_setowner(s->pw, s->tty); | 1640 | pty_setowner(s->pw, s->tty); |
1664 | /* Get window size from the packet. */ | 1641 | |
1642 | /* Set window size from the packet. */ | ||
1665 | pty_change_window_size(s->ptyfd, s->row, s->col, s->xpixel, s->ypixel); | 1643 | pty_change_window_size(s->ptyfd, s->row, s->col, s->xpixel, s->ypixel); |
1666 | 1644 | ||
1667 | /* Get tty modes from the packet. */ | ||
1668 | tty_parse_modes(s->ttyfd, &n_bytes); | ||
1669 | packet_done(); | 1645 | packet_done(); |
1670 | |||
1671 | session_proctitle(s); | 1646 | session_proctitle(s); |
1672 | |||
1673 | return 1; | 1647 | return 1; |
1674 | } | 1648 | } |
1675 | 1649 | ||