diff options
Diffstat (limited to 'monitor_wrap.c')
-rw-r--r-- | monitor_wrap.c | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/monitor_wrap.c b/monitor_wrap.c index 752af6f93..125f879c5 100644 --- a/monitor_wrap.c +++ b/monitor_wrap.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: monitor_wrap.c,v 1.57 2007/06/07 19:37:34 pvalchev Exp $ */ | 1 | /* $OpenBSD: monitor_wrap.c,v 1.63 2008/07/10 18:08:11 markus Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright 2002 Niels Provos <provos@citi.umich.edu> | 3 | * Copyright 2002 Niels Provos <provos@citi.umich.edu> |
4 | * Copyright 2002 Markus Friedl <markus@openbsd.org> | 4 | * Copyright 2002 Markus Friedl <markus@openbsd.org> |
@@ -41,6 +41,7 @@ | |||
41 | #include <openssl/bn.h> | 41 | #include <openssl/bn.h> |
42 | #include <openssl/dh.h> | 42 | #include <openssl/dh.h> |
43 | 43 | ||
44 | #include "openbsd-compat/sys-queue.h" | ||
44 | #include "xmalloc.h" | 45 | #include "xmalloc.h" |
45 | #include "ssh.h" | 46 | #include "ssh.h" |
46 | #include "dh.h" | 47 | #include "dh.h" |
@@ -222,8 +223,8 @@ mm_getpwnamallow(const char *username) | |||
222 | mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PWNAM, &m); | 223 | mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PWNAM, &m); |
223 | 224 | ||
224 | if (buffer_get_char(&m) == 0) { | 225 | if (buffer_get_char(&m) == 0) { |
225 | buffer_free(&m); | 226 | pw = NULL; |
226 | return (NULL); | 227 | goto out; |
227 | } | 228 | } |
228 | pw = buffer_get_string(&m, &len); | 229 | pw = buffer_get_string(&m, &len); |
229 | if (len != sizeof(struct passwd)) | 230 | if (len != sizeof(struct passwd)) |
@@ -237,6 +238,7 @@ mm_getpwnamallow(const char *username) | |||
237 | pw->pw_dir = buffer_get_string(&m, NULL); | 238 | pw->pw_dir = buffer_get_string(&m, NULL); |
238 | pw->pw_shell = buffer_get_string(&m, NULL); | 239 | pw->pw_shell = buffer_get_string(&m, NULL); |
239 | 240 | ||
241 | out: | ||
240 | /* copy options block as a Match directive may have changed some */ | 242 | /* copy options block as a Match directive may have changed some */ |
241 | newopts = buffer_get_string(&m, &len); | 243 | newopts = buffer_get_string(&m, &len); |
242 | if (len != sizeof(*newopts)) | 244 | if (len != sizeof(*newopts)) |
@@ -589,7 +591,7 @@ mm_send_keystate(struct monitor *monitor) | |||
589 | u_char *blob, *p; | 591 | u_char *blob, *p; |
590 | u_int bloblen, plen; | 592 | u_int bloblen, plen; |
591 | u_int32_t seqnr, packets; | 593 | u_int32_t seqnr, packets; |
592 | u_int64_t blocks; | 594 | u_int64_t blocks, bytes; |
593 | 595 | ||
594 | buffer_init(&m); | 596 | buffer_init(&m); |
595 | 597 | ||
@@ -638,14 +640,16 @@ mm_send_keystate(struct monitor *monitor) | |||
638 | buffer_put_string(&m, blob, bloblen); | 640 | buffer_put_string(&m, blob, bloblen); |
639 | xfree(blob); | 641 | xfree(blob); |
640 | 642 | ||
641 | packet_get_state(MODE_OUT, &seqnr, &blocks, &packets); | 643 | packet_get_state(MODE_OUT, &seqnr, &blocks, &packets, &bytes); |
642 | buffer_put_int(&m, seqnr); | 644 | buffer_put_int(&m, seqnr); |
643 | buffer_put_int64(&m, blocks); | 645 | buffer_put_int64(&m, blocks); |
644 | buffer_put_int(&m, packets); | 646 | buffer_put_int(&m, packets); |
645 | packet_get_state(MODE_IN, &seqnr, &blocks, &packets); | 647 | buffer_put_int64(&m, bytes); |
648 | packet_get_state(MODE_IN, &seqnr, &blocks, &packets, &bytes); | ||
646 | buffer_put_int(&m, seqnr); | 649 | buffer_put_int(&m, seqnr); |
647 | buffer_put_int64(&m, blocks); | 650 | buffer_put_int64(&m, blocks); |
648 | buffer_put_int(&m, packets); | 651 | buffer_put_int(&m, packets); |
652 | buffer_put_int64(&m, bytes); | ||
649 | 653 | ||
650 | debug3("%s: New keys have been sent", __func__); | 654 | debug3("%s: New keys have been sent", __func__); |
651 | skip: | 655 | skip: |
@@ -682,7 +686,20 @@ mm_pty_allocate(int *ptyfd, int *ttyfd, char *namebuf, size_t namebuflen) | |||
682 | { | 686 | { |
683 | Buffer m; | 687 | Buffer m; |
684 | char *p, *msg; | 688 | char *p, *msg; |
685 | int success = 0; | 689 | int success = 0, tmp1 = -1, tmp2 = -1; |
690 | |||
691 | /* Kludge: ensure there are fds free to receive the pty/tty */ | ||
692 | if ((tmp1 = dup(pmonitor->m_recvfd)) == -1 || | ||
693 | (tmp2 = dup(pmonitor->m_recvfd)) == -1) { | ||
694 | error("%s: cannot allocate fds for pty", __func__); | ||
695 | if (tmp1 > 0) | ||
696 | close(tmp1); | ||
697 | if (tmp2 > 0) | ||
698 | close(tmp2); | ||
699 | return 0; | ||
700 | } | ||
701 | close(tmp1); | ||
702 | close(tmp2); | ||
686 | 703 | ||
687 | buffer_init(&m); | 704 | buffer_init(&m); |
688 | mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PTY, &m); | 705 | mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PTY, &m); |
@@ -706,8 +723,9 @@ mm_pty_allocate(int *ptyfd, int *ttyfd, char *namebuf, size_t namebuflen) | |||
706 | buffer_append(&loginmsg, msg, strlen(msg)); | 723 | buffer_append(&loginmsg, msg, strlen(msg)); |
707 | xfree(msg); | 724 | xfree(msg); |
708 | 725 | ||
709 | *ptyfd = mm_receive_fd(pmonitor->m_recvfd); | 726 | if ((*ptyfd = mm_receive_fd(pmonitor->m_recvfd)) == -1 || |
710 | *ttyfd = mm_receive_fd(pmonitor->m_recvfd); | 727 | (*ttyfd = mm_receive_fd(pmonitor->m_recvfd)) == -1) |
728 | fatal("%s: receive fds failed", __func__); | ||
711 | 729 | ||
712 | /* Success */ | 730 | /* Success */ |
713 | return (1); | 731 | return (1); |
@@ -726,8 +744,9 @@ mm_session_pty_cleanup2(Session *s) | |||
726 | buffer_free(&m); | 744 | buffer_free(&m); |
727 | 745 | ||
728 | /* closed dup'ed master */ | 746 | /* closed dup'ed master */ |
729 | if (close(s->ptymaster) < 0) | 747 | if (s->ptymaster != -1 && close(s->ptymaster) < 0) |
730 | error("close(s->ptymaster): %s", strerror(errno)); | 748 | error("close(s->ptymaster/%d): %s", |
749 | s->ptymaster, strerror(errno)); | ||
731 | 750 | ||
732 | /* unlink pty from session */ | 751 | /* unlink pty from session */ |
733 | s->ttyfd = -1; | 752 | s->ttyfd = -1; |