summaryrefslogtreecommitdiff
path: root/monitor_wrap.c
diff options
context:
space:
mode:
Diffstat (limited to 'monitor_wrap.c')
-rw-r--r--monitor_wrap.c41
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
241out:
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;