diff options
Diffstat (limited to 'monitor_wrap.c')
-rw-r--r-- | monitor_wrap.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/monitor_wrap.c b/monitor_wrap.c index ee2dc2027..0d7a0e3bd 100644 --- a/monitor_wrap.c +++ b/monitor_wrap.c | |||
@@ -25,7 +25,7 @@ | |||
25 | */ | 25 | */ |
26 | 26 | ||
27 | #include "includes.h" | 27 | #include "includes.h" |
28 | RCSID("$OpenBSD: monitor_wrap.c,v 1.35 2003/11/17 11:06:07 markus Exp $"); | 28 | RCSID("$OpenBSD: monitor_wrap.c,v 1.39 2004/07/17 05:31:41 dtucker Exp $"); |
29 | 29 | ||
30 | #include <openssl/bn.h> | 30 | #include <openssl/bn.h> |
31 | #include <openssl/dh.h> | 31 | #include <openssl/dh.h> |
@@ -70,6 +70,7 @@ extern z_stream incoming_stream; | |||
70 | extern z_stream outgoing_stream; | 70 | extern z_stream outgoing_stream; |
71 | extern struct monitor *pmonitor; | 71 | extern struct monitor *pmonitor; |
72 | extern Buffer input, output; | 72 | extern Buffer input, output; |
73 | extern Buffer loginmsg; | ||
73 | extern ServerOptions options; | 74 | extern ServerOptions options; |
74 | 75 | ||
75 | int | 76 | int |
@@ -83,7 +84,7 @@ mm_is_monitor(void) | |||
83 | } | 84 | } |
84 | 85 | ||
85 | void | 86 | void |
86 | mm_request_send(int socket, enum monitor_reqtype type, Buffer *m) | 87 | mm_request_send(int sock, enum monitor_reqtype type, Buffer *m) |
87 | { | 88 | { |
88 | u_int mlen = buffer_len(m); | 89 | u_int mlen = buffer_len(m); |
89 | u_char buf[5]; | 90 | u_char buf[5]; |
@@ -92,14 +93,14 @@ mm_request_send(int socket, enum monitor_reqtype type, Buffer *m) | |||
92 | 93 | ||
93 | PUT_32BIT(buf, mlen + 1); | 94 | PUT_32BIT(buf, mlen + 1); |
94 | buf[4] = (u_char) type; /* 1st byte of payload is mesg-type */ | 95 | buf[4] = (u_char) type; /* 1st byte of payload is mesg-type */ |
95 | if (atomicio(vwrite, socket, buf, sizeof(buf)) != sizeof(buf)) | 96 | if (atomicio(vwrite, sock, buf, sizeof(buf)) != sizeof(buf)) |
96 | fatal("%s: write", __func__); | 97 | fatal("%s: write", __func__); |
97 | if (atomicio(vwrite, socket, buffer_ptr(m), mlen) != mlen) | 98 | if (atomicio(vwrite, sock, buffer_ptr(m), mlen) != mlen) |
98 | fatal("%s: write", __func__); | 99 | fatal("%s: write", __func__); |
99 | } | 100 | } |
100 | 101 | ||
101 | void | 102 | void |
102 | mm_request_receive(int socket, Buffer *m) | 103 | mm_request_receive(int sock, Buffer *m) |
103 | { | 104 | { |
104 | u_char buf[4]; | 105 | u_char buf[4]; |
105 | u_int msg_len; | 106 | u_int msg_len; |
@@ -107,7 +108,7 @@ mm_request_receive(int socket, Buffer *m) | |||
107 | 108 | ||
108 | debug3("%s entering", __func__); | 109 | debug3("%s entering", __func__); |
109 | 110 | ||
110 | res = atomicio(read, socket, buf, sizeof(buf)); | 111 | res = atomicio(read, sock, buf, sizeof(buf)); |
111 | if (res != sizeof(buf)) { | 112 | if (res != sizeof(buf)) { |
112 | if (res == 0) | 113 | if (res == 0) |
113 | cleanup_exit(255); | 114 | cleanup_exit(255); |
@@ -118,19 +119,19 @@ mm_request_receive(int socket, Buffer *m) | |||
118 | fatal("%s: read: bad msg_len %d", __func__, msg_len); | 119 | fatal("%s: read: bad msg_len %d", __func__, msg_len); |
119 | buffer_clear(m); | 120 | buffer_clear(m); |
120 | buffer_append_space(m, msg_len); | 121 | buffer_append_space(m, msg_len); |
121 | res = atomicio(read, socket, buffer_ptr(m), msg_len); | 122 | res = atomicio(read, sock, buffer_ptr(m), msg_len); |
122 | if (res != msg_len) | 123 | if (res != msg_len) |
123 | fatal("%s: read: %ld != msg_len", __func__, (long)res); | 124 | fatal("%s: read: %ld != msg_len", __func__, (long)res); |
124 | } | 125 | } |
125 | 126 | ||
126 | void | 127 | void |
127 | mm_request_receive_expect(int socket, enum monitor_reqtype type, Buffer *m) | 128 | mm_request_receive_expect(int sock, enum monitor_reqtype type, Buffer *m) |
128 | { | 129 | { |
129 | u_char rtype; | 130 | u_char rtype; |
130 | 131 | ||
131 | debug3("%s entering: type %d", __func__, type); | 132 | debug3("%s entering: type %d", __func__, type); |
132 | 133 | ||
133 | mm_request_receive(socket, m); | 134 | mm_request_receive(sock, m); |
134 | rtype = buffer_get_char(m); | 135 | rtype = buffer_get_char(m); |
135 | if (rtype != type) | 136 | if (rtype != type) |
136 | fatal("%s: read: rtype %d != type %d", __func__, | 137 | fatal("%s: read: rtype %d != type %d", __func__, |
@@ -194,7 +195,7 @@ mm_key_sign(Key *key, u_char **sigp, u_int *lenp, u_char *data, u_int datalen) | |||
194 | } | 195 | } |
195 | 196 | ||
196 | struct passwd * | 197 | struct passwd * |
197 | mm_getpwnamallow(const char *login) | 198 | mm_getpwnamallow(const char *username) |
198 | { | 199 | { |
199 | Buffer m; | 200 | Buffer m; |
200 | struct passwd *pw; | 201 | struct passwd *pw; |
@@ -203,7 +204,7 @@ mm_getpwnamallow(const char *login) | |||
203 | debug3("%s entering", __func__); | 204 | debug3("%s entering", __func__); |
204 | 205 | ||
205 | buffer_init(&m); | 206 | buffer_init(&m); |
206 | buffer_put_cstring(&m, login); | 207 | buffer_put_cstring(&m, username); |
207 | 208 | ||
208 | mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PWNAM, &m); | 209 | mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PWNAM, &m); |
209 | 210 | ||
@@ -544,7 +545,7 @@ mm_send_kex(Buffer *m, Kex *kex) | |||
544 | } | 545 | } |
545 | 546 | ||
546 | void | 547 | void |
547 | mm_send_keystate(struct monitor *pmonitor) | 548 | mm_send_keystate(struct monitor *monitor) |
548 | { | 549 | { |
549 | Buffer m; | 550 | Buffer m; |
550 | u_char *blob, *p; | 551 | u_char *blob, *p; |
@@ -580,7 +581,7 @@ mm_send_keystate(struct monitor *pmonitor) | |||
580 | goto skip; | 581 | goto skip; |
581 | } else { | 582 | } else { |
582 | /* Kex for rekeying */ | 583 | /* Kex for rekeying */ |
583 | mm_send_kex(&m, *pmonitor->m_pkex); | 584 | mm_send_kex(&m, *monitor->m_pkex); |
584 | } | 585 | } |
585 | 586 | ||
586 | debug3("%s: Sending new keys: %p %p", | 587 | debug3("%s: Sending new keys: %p %p", |
@@ -632,7 +633,7 @@ mm_send_keystate(struct monitor *pmonitor) | |||
632 | buffer_put_string(&m, buffer_ptr(&input), buffer_len(&input)); | 633 | buffer_put_string(&m, buffer_ptr(&input), buffer_len(&input)); |
633 | buffer_put_string(&m, buffer_ptr(&output), buffer_len(&output)); | 634 | buffer_put_string(&m, buffer_ptr(&output), buffer_len(&output)); |
634 | 635 | ||
635 | mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_KEYEXPORT, &m); | 636 | mm_request_send(monitor->m_recvfd, MONITOR_REQ_KEYEXPORT, &m); |
636 | debug3("%s: Finished sending state", __func__); | 637 | debug3("%s: Finished sending state", __func__); |
637 | 638 | ||
638 | buffer_free(&m); | 639 | buffer_free(&m); |
@@ -642,7 +643,7 @@ int | |||
642 | mm_pty_allocate(int *ptyfd, int *ttyfd, char *namebuf, int namebuflen) | 643 | mm_pty_allocate(int *ptyfd, int *ttyfd, char *namebuf, int namebuflen) |
643 | { | 644 | { |
644 | Buffer m; | 645 | Buffer m; |
645 | char *p; | 646 | char *p, *msg; |
646 | int success = 0; | 647 | int success = 0; |
647 | 648 | ||
648 | buffer_init(&m); | 649 | buffer_init(&m); |
@@ -658,11 +659,15 @@ mm_pty_allocate(int *ptyfd, int *ttyfd, char *namebuf, int namebuflen) | |||
658 | return (0); | 659 | return (0); |
659 | } | 660 | } |
660 | p = buffer_get_string(&m, NULL); | 661 | p = buffer_get_string(&m, NULL); |
662 | msg = buffer_get_string(&m, NULL); | ||
661 | buffer_free(&m); | 663 | buffer_free(&m); |
662 | 664 | ||
663 | strlcpy(namebuf, p, namebuflen); /* Possible truncation */ | 665 | strlcpy(namebuf, p, namebuflen); /* Possible truncation */ |
664 | xfree(p); | 666 | xfree(p); |
665 | 667 | ||
668 | buffer_append(&loginmsg, msg, strlen(msg)); | ||
669 | xfree(msg); | ||
670 | |||
666 | *ptyfd = mm_receive_fd(pmonitor->m_recvfd); | 671 | *ptyfd = mm_receive_fd(pmonitor->m_recvfd); |
667 | *ttyfd = mm_receive_fd(pmonitor->m_recvfd); | 672 | *ttyfd = mm_receive_fd(pmonitor->m_recvfd); |
668 | 673 | ||
@@ -914,6 +919,7 @@ mm_bsdauth_respond(void *ctx, u_int numresponses, char **responses) | |||
914 | return ((authok == 0) ? -1 : 0); | 919 | return ((authok == 0) ? -1 : 0); |
915 | } | 920 | } |
916 | 921 | ||
922 | #ifdef SKEY | ||
917 | int | 923 | int |
918 | mm_skey_query(void *ctx, char **name, char **infotxt, | 924 | mm_skey_query(void *ctx, char **name, char **infotxt, |
919 | u_int *numprompts, char ***prompts, u_int **echo_on) | 925 | u_int *numprompts, char ***prompts, u_int **echo_on) |
@@ -977,6 +983,7 @@ mm_skey_respond(void *ctx, u_int numresponses, char **responses) | |||
977 | 983 | ||
978 | return ((authok == 0) ? -1 : 0); | 984 | return ((authok == 0) ? -1 : 0); |
979 | } | 985 | } |
986 | #endif /* SKEY */ | ||
980 | 987 | ||
981 | void | 988 | void |
982 | mm_ssh1_session_id(u_char session_id[16]) | 989 | mm_ssh1_session_id(u_char session_id[16]) |
@@ -1093,7 +1100,7 @@ mm_auth_rsa_verify_response(Key *key, BIGNUM *p, u_char response[16]) | |||
1093 | 1100 | ||
1094 | #ifdef GSSAPI | 1101 | #ifdef GSSAPI |
1095 | OM_uint32 | 1102 | OM_uint32 |
1096 | mm_ssh_gssapi_server_ctx(Gssctxt **ctx, gss_OID oid) | 1103 | mm_ssh_gssapi_server_ctx(Gssctxt **ctx, gss_OID goid) |
1097 | { | 1104 | { |
1098 | Buffer m; | 1105 | Buffer m; |
1099 | OM_uint32 major; | 1106 | OM_uint32 major; |
@@ -1102,7 +1109,7 @@ mm_ssh_gssapi_server_ctx(Gssctxt **ctx, gss_OID oid) | |||
1102 | *ctx = NULL; | 1109 | *ctx = NULL; |
1103 | 1110 | ||
1104 | buffer_init(&m); | 1111 | buffer_init(&m); |
1105 | buffer_put_string(&m, oid->elements, oid->length); | 1112 | buffer_put_string(&m, goid->elements, goid->length); |
1106 | 1113 | ||
1107 | mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSSETUP, &m); | 1114 | mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSSETUP, &m); |
1108 | mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSSETUP, &m); | 1115 | mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSSETUP, &m); |