- (djm) Sync with OpenBSD:

- markus@cvs.openbsd.org  2000/10/16 15:46:32
     [ssh.1]
     fixes from pekkas@netcore.fi
   - markus@cvs.openbsd.org  2000/10/17 14:28:11
     [atomicio.c]
     return number of characters processed; ok deraadt@
   - markus@cvs.openbsd.org  2000/10/18 12:04:02
     [atomicio.c]
     undo
   - markus@cvs.openbsd.org  2000/10/18 12:23:02
     [scp.c]
     replace atomicio(read,...) with read(); ok deraadt@
   - markus@cvs.openbsd.org  2000/10/18 12:42:00
     [session.c]
     restore old record login behaviour
   - deraadt@cvs.openbsd.org 2000/10/19 10:41:13
     [auth-skey.c]
     fmt string problem in unused code
   - provos@cvs.openbsd.org  2000/10/19 10:45:16
     [sshconnect2.c]
     don't reference freed memory. okay deraadt@
   - markus@cvs.openbsd.org  2000/10/21 11:04:23
     [canohost.c]
     typo, eramore@era-t.ericsson.se; ok niels@
   - markus@cvs.openbsd.org  2000/10/23 13:31:55
     [cipher.c]
     non-alignment dependent swap_bytes(); from
     simonb@wasabisystems.com/netbsd
   - markus@cvs.openbsd.org  2000/10/26 12:38:28
     [compat.c]
     add older vandyke products
   - markus@cvs.openbsd.org  2000/10/27 01:32:19
     [channels.c channels.h clientloop.c serverloop.c session.c]
     [ssh.c util.c]
     enable non-blocking IO on channels, and tty's (except for the
     client ttys).
   - markus@cvs.openbsd.org  2000/10/27 01:48:22
     channels.c channels.h clientloop.c
     deny agent/x11 forwarding unless requested; thanks to jwl@pobox.com
This commit is contained in:
Damien Miller 2000-10-28 14:19:58 +11:00
parent c05e01875b
commit 69b69aa50d
16 changed files with 174 additions and 86 deletions

View File

@ -2,6 +2,46 @@
- (djm) fix select hack in serverloop.c from Philippe WILLEM - (djm) fix select hack in serverloop.c from Philippe WILLEM
<Philippe.WILLEM@urssaf.fr> <Philippe.WILLEM@urssaf.fr>
- (djm) Fix mangled AIXAUTHENTICATE code - (djm) Fix mangled AIXAUTHENTICATE code
- (djm) Sync with OpenBSD:
- markus@cvs.openbsd.org 2000/10/16 15:46:32
[ssh.1]
fixes from pekkas@netcore.fi
- markus@cvs.openbsd.org 2000/10/17 14:28:11
[atomicio.c]
return number of characters processed; ok deraadt@
- markus@cvs.openbsd.org 2000/10/18 12:04:02
[atomicio.c]
undo
- markus@cvs.openbsd.org 2000/10/18 12:23:02
[scp.c]
replace atomicio(read,...) with read(); ok deraadt@
- markus@cvs.openbsd.org 2000/10/18 12:42:00
[session.c]
restore old record login behaviour
- deraadt@cvs.openbsd.org 2000/10/19 10:41:13
[auth-skey.c]
fmt string problem in unused code
- provos@cvs.openbsd.org 2000/10/19 10:45:16
[sshconnect2.c]
don't reference freed memory. okay deraadt@
- markus@cvs.openbsd.org 2000/10/21 11:04:23
[canohost.c]
typo, eramore@era-t.ericsson.se; ok niels@
- markus@cvs.openbsd.org 2000/10/23 13:31:55
[cipher.c]
non-alignment dependent swap_bytes(); from
simonb@wasabisystems.com/netbsd
- markus@cvs.openbsd.org 2000/10/26 12:38:28
[compat.c]
add older vandyke products
- markus@cvs.openbsd.org 2000/10/27 01:32:19
[channels.c channels.h clientloop.c serverloop.c session.c]
[ssh.c util.c]
enable non-blocking IO on channels, and tty's (except for the
client ttys).
- markus@cvs.openbsd.org 2000/10/27 01:48:22
channels.c channels.h clientloop.c
deny agent/x11 forwarding unless requested; thanks to jwl@pobox.com
20001027 20001027
- (djm) Increase REKEY_BYTES to 2^24 for arc4random - (djm) Increase REKEY_BYTES to 2^24 for arc4random

View File

@ -24,7 +24,7 @@
*/ */
#include "includes.h" #include "includes.h"
RCSID("$OpenBSD: atomicio.c,v 1.5 2000/09/07 20:27:49 deraadt Exp $"); RCSID("$OpenBSD: atomicio.c,v 1.7 2000/10/18 18:04:02 markus Exp $");
#include "xmalloc.h" #include "xmalloc.h"
#include "ssh.h" #include "ssh.h"

View File

@ -23,7 +23,7 @@
*/ */
#include "includes.h" #include "includes.h"
RCSID("$OpenBSD: auth-skey.c,v 1.8 2000/09/07 20:27:49 deraadt Exp $"); RCSID("$OpenBSD: auth-skey.c,v 1.9 2000/10/19 16:41:13 deraadt Exp $");
#ifdef SKEY #ifdef SKEY
#include "ssh.h" #include "ssh.h"
@ -48,7 +48,7 @@ auth_skey_password(struct passwd * pw, const char *password)
skeyinfo = skey_fake_keyinfo(pw->pw_name); skeyinfo = skey_fake_keyinfo(pw->pw_name);
} }
if (skeyinfo != NULL) if (skeyinfo != NULL)
packet_send_debug(skeyinfo); packet_send_debug("%s", skeyinfo);
/* Try again. */ /* Try again. */
return 0; return 0;
} else if (skey_haskey(pw->pw_name) == 0 && } else if (skey_haskey(pw->pw_name) == 0 &&

View File

@ -12,7 +12,7 @@
*/ */
#include "includes.h" #include "includes.h"
RCSID("$OpenBSD: canohost.c,v 1.15 2000/09/07 21:13:37 markus Exp $"); RCSID("$OpenBSD: canohost.c,v 1.16 2000/10/21 17:04:22 markus Exp $");
#include "packet.h" #include "packet.h"
#include "xmalloc.h" #include "xmalloc.h"
@ -147,7 +147,7 @@ check_ip_options:
else else
ipproto = IPPROTO_IP; ipproto = IPPROTO_IP;
option_size = sizeof(options); option_size = sizeof(options);
if (getsockopt(0, ipproto, IP_OPTIONS, (char *) options, if (getsockopt(socket, ipproto, IP_OPTIONS, (char *) options,
&option_size) >= 0 && option_size != 0) { &option_size) >= 0 && option_size != 0) {
cp = text; cp = text;
/* Note: "text" buffer must be at least 3x as big as options. */ /* Note: "text" buffer must be at least 3x as big as options. */

View File

@ -40,7 +40,7 @@
*/ */
#include "includes.h" #include "includes.h"
RCSID("$OpenBSD: channels.c,v 1.70 2000/09/28 18:03:18 markus Exp $"); RCSID("$OpenBSD: channels.c,v 1.72 2000/10/27 07:48:22 markus Exp $");
#include "ssh.h" #include "ssh.h"
#include "packet.h" #include "packet.h"
@ -174,7 +174,8 @@ channel_lookup(int id)
*/ */
void void
channel_register_fds(Channel *c, int rfd, int wfd, int efd, int extusage) channel_register_fds(Channel *c, int rfd, int wfd, int efd,
int extusage, int nonblock)
{ {
/* Update the maximum file descriptor value. */ /* Update the maximum file descriptor value. */
if (rfd > channel_max_fd_value) if (rfd > channel_max_fd_value)
@ -190,12 +191,16 @@ channel_register_fds(Channel *c, int rfd, int wfd, int efd, int extusage)
c->sock = (rfd == wfd) ? rfd : -1; c->sock = (rfd == wfd) ? rfd : -1;
c->efd = efd; c->efd = efd;
c->extended_usage = extusage; c->extended_usage = extusage;
if (rfd != -1)
set_nonblock(rfd); /* enable nonblocking mode */
if (wfd != -1) if (nonblock) {
set_nonblock(wfd); if (rfd != -1)
if (efd != -1) set_nonblock(rfd);
set_nonblock(efd); if (wfd != -1)
set_nonblock(wfd);
if (efd != -1)
set_nonblock(efd);
}
} }
/* /*
@ -205,7 +210,7 @@ channel_register_fds(Channel *c, int rfd, int wfd, int efd, int extusage)
int int
channel_new(char *ctype, int type, int rfd, int wfd, int efd, channel_new(char *ctype, int type, int rfd, int wfd, int efd,
int window, int maxpack, int extusage, char *remote_name) int window, int maxpack, int extusage, char *remote_name, int nonblock)
{ {
int i, found; int i, found;
Channel *c; Channel *c;
@ -245,7 +250,7 @@ channel_new(char *ctype, int type, int rfd, int wfd, int efd,
buffer_init(&c->output); buffer_init(&c->output);
buffer_init(&c->extended); buffer_init(&c->extended);
chan_init_iostates(c); chan_init_iostates(c);
channel_register_fds(c, rfd, wfd, efd, extusage); channel_register_fds(c, rfd, wfd, efd, extusage, nonblock);
c->self = found; c->self = found;
c->type = type; c->type = type;
c->ctype = ctype; c->ctype = ctype;
@ -269,7 +274,7 @@ channel_new(char *ctype, int type, int rfd, int wfd, int efd,
int int
channel_allocate(int type, int sock, char *remote_name) channel_allocate(int type, int sock, char *remote_name)
{ {
return channel_new("", type, sock, sock, -1, 0, 0, 0, remote_name); return channel_new("", type, sock, sock, -1, 0, 0, 0, remote_name, 1);
} }
@ -548,7 +553,7 @@ channel_post_x11_listener(Channel *c, fd_set * readset, fd_set * writeset)
newch = channel_new("x11", newch = channel_new("x11",
SSH_CHANNEL_OPENING, newsock, newsock, -1, SSH_CHANNEL_OPENING, newsock, newsock, -1,
c->local_window_max, c->local_maxpacket, c->local_window_max, c->local_maxpacket,
0, xstrdup(buf)); 0, xstrdup(buf), 1);
if (compat20) { if (compat20) {
packet_start(SSH2_MSG_CHANNEL_OPEN); packet_start(SSH2_MSG_CHANNEL_OPEN);
packet_put_cstring("x11"); packet_put_cstring("x11");
@ -606,7 +611,7 @@ channel_post_port_listener(Channel *c, fd_set * readset, fd_set * writeset)
newch = channel_new("direct-tcpip", newch = channel_new("direct-tcpip",
SSH_CHANNEL_OPENING, newsock, newsock, -1, SSH_CHANNEL_OPENING, newsock, newsock, -1,
c->local_window_max, c->local_maxpacket, c->local_window_max, c->local_maxpacket,
0, xstrdup(buf)); 0, xstrdup(buf), 1);
if (compat20) { if (compat20) {
packet_start(SSH2_MSG_CHANNEL_OPEN); packet_start(SSH2_MSG_CHANNEL_OPEN);
packet_put_cstring("direct-tcpip"); packet_put_cstring("direct-tcpip");
@ -1514,7 +1519,7 @@ channel_request_local_forwarding(u_short port, const char *host,
"port listener", SSH_CHANNEL_PORT_LISTENER, "port listener", SSH_CHANNEL_PORT_LISTENER,
sock, sock, -1, sock, sock, -1,
CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
0, xstrdup("port listener")); 0, xstrdup("port listener"), 1);
strlcpy(channels[ch].path, host, sizeof(channels[ch].path)); strlcpy(channels[ch].path, host, sizeof(channels[ch].path));
channels[ch].host_port = host_port; channels[ch].host_port = host_port;
channels[ch].listening_port = port; channels[ch].listening_port = port;
@ -1859,7 +1864,7 @@ x11_create_display_inet(int screen_number, int x11_display_offset)
(void) channel_new("x11 listener", (void) channel_new("x11 listener",
SSH_CHANNEL_X11_LISTENER, sock, sock, -1, SSH_CHANNEL_X11_LISTENER, sock, sock, -1,
CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT, CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT,
0, xstrdup("X11 inet listener")); 0, xstrdup("X11 inet listener"), 1);
} }
/* Return a suitable value for the DISPLAY environment variable. */ /* Return a suitable value for the DISPLAY environment variable. */
@ -2045,6 +2050,28 @@ x11_input_open(int type, int plen, void *ctxt)
} }
} }
/* dummy protocol handler that denies SSH-1 requests (agent/x11) */
void
deny_input_open(int type, int plen, void *ctxt)
{
int rchan = packet_get_int();
switch(type){
case SSH_SMSG_AGENT_OPEN:
error("Warning: ssh server tried agent forwarding.");
break;
case SSH_SMSG_X11_OPEN:
error("Warning: ssh server tried X11 forwarding.");
break;
default:
error("deny_input_open: type %d plen %d", type, plen);
break;
}
error("Warning: this is probably a break in attempt by a malicious server.");
packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
packet_put_int(rchan);
packet_send();
}
/* /*
* Requests forwarding of X11 connections, generates fake authentication * Requests forwarding of X11 connections, generates fake authentication
* data, and enables authentication spoofing. * data, and enables authentication spoofing.
@ -2349,13 +2376,13 @@ channel_register_filter(int id, channel_filter_fn *fn)
} }
void void
channel_set_fds(int id, int rfd, int wfd, int efd, int extusage) channel_set_fds(int id, int rfd, int wfd, int efd,
int extusage, int nonblock)
{ {
Channel *c = channel_lookup(id); Channel *c = channel_lookup(id);
if (c == NULL || c->type != SSH_CHANNEL_LARVAL) if (c == NULL || c->type != SSH_CHANNEL_LARVAL)
fatal("channel_activate for non-larval channel %d.", id); fatal("channel_activate for non-larval channel %d.", id);
channel_register_fds(c, rfd, wfd, efd, extusage, nonblock);
channel_register_fds(c, rfd, wfd, efd, extusage);
c->type = SSH_CHANNEL_OPEN; c->type = SSH_CHANNEL_OPEN;
/* XXX window size? */ /* XXX window size? */
c->local_window = c->local_window_max = c->local_maxpacket * 2; c->local_window = c->local_window_max = c->local_maxpacket * 2;

View File

@ -32,7 +32,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
/* RCSID("$OpenBSD: channels.h,v 1.20 2000/09/21 11:25:33 markus Exp $"); */ /* RCSID("$OpenBSD: channels.h,v 1.22 2000/10/27 07:48:22 markus Exp $"); */
#ifndef CHANNELS_H #ifndef CHANNELS_H
#define CHANNELS_H #define CHANNELS_H
@ -117,7 +117,6 @@ struct Channel {
#define CHAN_X11_PACKET_DEFAULT (CHAN_X11_WINDOW_DEFAULT/2) #define CHAN_X11_PACKET_DEFAULT (CHAN_X11_WINDOW_DEFAULT/2)
void channel_set_fds(int id, int rfd, int wfd, int efd, int extusage);
void channel_open(int id); void channel_open(int id);
void channel_request(int id, char *service, int wantconfirm); void channel_request(int id, char *service, int wantconfirm);
void channel_request_start(int id, char *service, int wantconfirm); void channel_request_start(int id, char *service, int wantconfirm);
@ -129,7 +128,13 @@ Channel *channel_lookup(int id);
int int
channel_new(char *ctype, int type, int rfd, int wfd, int efd, channel_new(char *ctype, int type, int rfd, int wfd, int efd,
int window, int maxpack, int extended_usage, char *remote_name); int window, int maxpack, int extended_usage, char *remote_name,
int nonblock);
void
channel_set_fds(int id, int rfd, int wfd, int efd,
int extusage, int nonblock);
void deny_input_open(int type, int plen, void *ctxt);
void channel_input_channel_request(int type, int plen, void *ctxt); void channel_input_channel_request(int type, int plen, void *ctxt);
void channel_input_close(int type, int plen, void *ctxt); void channel_input_close(int type, int plen, void *ctxt);

View File

@ -35,7 +35,7 @@
*/ */
#include "includes.h" #include "includes.h"
RCSID("$OpenBSD: cipher.c,v 1.36 2000/10/14 10:01:15 markus Exp $"); RCSID("$OpenBSD: cipher.c,v 1.37 2000/10/23 19:31:54 markus Exp $");
#include "ssh.h" #include "ssh.h"
#include "xmalloc.h" #include "xmalloc.h"
@ -218,28 +218,21 @@ blowfish_cbc_decrypt(CipherContext *cc, u_char *dest, const u_char *src,
* and after encryption/decryption. Thus the swap_bytes stuff (yuk). * and after encryption/decryption. Thus the swap_bytes stuff (yuk).
*/ */
static void static void
swap_bytes(const unsigned char *src, unsigned char *dst_, int n) swap_bytes(const unsigned char *src, unsigned char *dst, int n)
{ {
/* dst must be properly aligned. */ char c[4];
u_int32_t *dst = (u_int32_t *) dst_;
union {
u_int32_t i;
char c[4];
} t;
/* Process 8 bytes every lap. */ /* Process 4 bytes every lap. */
for (n = n / 8; n > 0; n--) { for (n = n / 4; n > 0; n--) {
t.c[3] = *src++; c[3] = *src++;
t.c[2] = *src++; c[2] = *src++;
t.c[1] = *src++; c[1] = *src++;
t.c[0] = *src++; c[0] = *src++;
*dst++ = t.i;
t.c[3] = *src++; *dst++ = c[0];
t.c[2] = *src++; *dst++ = c[1];
t.c[1] = *src++; *dst++ = c[2];
t.c[0] = *src++; *dst++ = c[3];
*dst++ = t.i;
} }
} }

View File

@ -59,7 +59,7 @@
*/ */
#include "includes.h" #include "includes.h"
RCSID("$OpenBSD: clientloop.c,v 1.37 2000/09/26 19:59:58 markus Exp $"); RCSID("$OpenBSD: clientloop.c,v 1.39 2000/10/27 07:48:22 markus Exp $");
#include "xmalloc.h" #include "xmalloc.h"
#include "ssh.h" #include "ssh.h"
@ -75,6 +75,10 @@ RCSID("$OpenBSD: clientloop.c,v 1.37 2000/09/26 19:59:58 markus Exp $");
#include "buffer.h" #include "buffer.h"
#include "bufaux.h" #include "bufaux.h"
/* import options */
extern Options options;
/* Flag indicating that stdin should be redirected from /dev/null. */ /* Flag indicating that stdin should be redirected from /dev/null. */
extern int stdin_null_flag; extern int stdin_null_flag;
@ -790,7 +794,6 @@ simple_escape_filter(Channel *c, char *buf, int len)
int int
client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id) client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id)
{ {
extern Options options;
double start_time, total_time; double start_time, total_time;
int len; int len;
char buf[100]; char buf[100];
@ -1033,7 +1036,7 @@ client_input_channel_open(int type, int plen, void *ctxt)
debug("client_input_channel_open: ctype %s rchan %d win %d max %d", debug("client_input_channel_open: ctype %s rchan %d win %d max %d",
ctype, rchan, rwindow, rmaxpack); ctype, rchan, rwindow, rmaxpack);
if (strcmp(ctype, "x11") == 0) { if (strcmp(ctype, "x11") == 0 && options.forward_x11) {
int sock; int sock;
char *originator; char *originator;
int originator_port; int originator_port;
@ -1052,7 +1055,7 @@ client_input_channel_open(int type, int plen, void *ctxt)
if (sock >= 0) { if (sock >= 0) {
id = channel_new("x11", SSH_CHANNEL_X11_OPEN, id = channel_new("x11", SSH_CHANNEL_X11_OPEN,
sock, sock, -1, CHAN_X11_WINDOW_DEFAULT, sock, sock, -1, CHAN_X11_WINDOW_DEFAULT,
CHAN_X11_PACKET_DEFAULT, 0, xstrdup("x11")); CHAN_X11_PACKET_DEFAULT, 0, xstrdup("x11"), 1);
c = channel_lookup(id); c = channel_lookup(id);
} }
} }
@ -1105,11 +1108,14 @@ client_init_dispatch_13()
dispatch_set(SSH_MSG_CHANNEL_OPEN_CONFIRMATION, &channel_input_open_confirmation); dispatch_set(SSH_MSG_CHANNEL_OPEN_CONFIRMATION, &channel_input_open_confirmation);
dispatch_set(SSH_MSG_CHANNEL_OPEN_FAILURE, &channel_input_open_failure); dispatch_set(SSH_MSG_CHANNEL_OPEN_FAILURE, &channel_input_open_failure);
dispatch_set(SSH_MSG_PORT_OPEN, &channel_input_port_open); dispatch_set(SSH_MSG_PORT_OPEN, &channel_input_port_open);
dispatch_set(SSH_SMSG_AGENT_OPEN, &auth_input_open_request);
dispatch_set(SSH_SMSG_EXITSTATUS, &client_input_exit_status); dispatch_set(SSH_SMSG_EXITSTATUS, &client_input_exit_status);
dispatch_set(SSH_SMSG_STDERR_DATA, &client_input_stderr_data); dispatch_set(SSH_SMSG_STDERR_DATA, &client_input_stderr_data);
dispatch_set(SSH_SMSG_STDOUT_DATA, &client_input_stdout_data); dispatch_set(SSH_SMSG_STDOUT_DATA, &client_input_stdout_data);
dispatch_set(SSH_SMSG_X11_OPEN, &x11_input_open);
dispatch_set(SSH_SMSG_AGENT_OPEN, options.forward_agent ?
&auth_input_open_request : &deny_input_open);
dispatch_set(SSH_SMSG_X11_OPEN, options.forward_x11 ?
&x11_input_open : &deny_input_open);
} }
void void
client_init_dispatch_15() client_init_dispatch_15()

View File

@ -23,7 +23,7 @@
*/ */
#include "includes.h" #include "includes.h"
RCSID("$OpenBSD: compat.c,v 1.25 2000/10/14 12:16:56 markus Exp $"); RCSID("$OpenBSD: compat.c,v 1.26 2000/10/26 18:38:28 markus Exp $");
#include "ssh.h" #include "ssh.h"
#include "packet.h" #include "packet.h"
@ -72,7 +72,10 @@ compat_datafellows(const char *version)
SSH_BUG_PUBKEYAUTH|SSH_BUG_X11FWD }, SSH_BUG_PUBKEYAUTH|SSH_BUG_X11FWD },
{ "^2\\.[23]\\.0 ", SSH_BUG_HMAC}, { "^2\\.[23]\\.0 ", SSH_BUG_HMAC},
{ "^2\\.[2-9]\\.", 0 }, { "^2\\.[2-9]\\.", 0 },
{ "^2\\.", SSH_BUG_HMAC}, /* XXX fallback */ { "^2\\.4$", SSH_OLD_SESSIONID}, /* Van Dyke */
{ "^3\\.0 SecureCRT", SSH_OLD_SESSIONID},
{ "^1\\.7 SecureFX", SSH_OLD_SESSIONID},
{ "^2\\.", SSH_BUG_HMAC}, /* XXX fallback */
{ NULL, 0 } { NULL, 0 }
}; };
/* process table, return first match */ /* process table, return first match */

8
scp.c
View File

@ -75,7 +75,7 @@
*/ */
#include "includes.h" #include "includes.h"
RCSID("$OpenBSD: scp.c,v 1.42 2000/10/14 10:07:21 markus Exp $"); RCSID("$OpenBSD: scp.c,v 1.43 2000/10/18 18:23:02 markus Exp $");
#include "ssh.h" #include "ssh.h"
#include "xmalloc.h" #include "xmalloc.h"
@ -838,8 +838,10 @@ bad: run_err("%s: %s", np, strerror(errno));
amt = size - i; amt = size - i;
count += amt; count += amt;
do { do {
j = atomicio(read, remin, cp, amt); j = read(remin, cp, amt);
if (j <= 0) { if (j == -1 && (errno == EINTR || errno == EAGAIN)) {
continue;
} else if (j <= 0) {
run_err("%s", j ? strerror(errno) : run_err("%s", j ? strerror(errno) :
"dropped connection"); "dropped connection");
exit(1); exit(1);

View File

@ -35,6 +35,8 @@
*/ */
#include "includes.h" #include "includes.h"
RCSID("$OpenBSD: serverloop.c,v 1.34 2000/10/27 07:32:18 markus Exp $");
#include "xmalloc.h" #include "xmalloc.h"
#include "ssh.h" #include "ssh.h"
#include "packet.h" #include "packet.h"
@ -766,7 +768,7 @@ input_direct_tcpip(void)
return -1; return -1;
return channel_new("direct-tcpip", SSH_CHANNEL_OPEN, return channel_new("direct-tcpip", SSH_CHANNEL_OPEN,
sock, sock, -1, CHAN_TCP_WINDOW_DEFAULT, sock, sock, -1, CHAN_TCP_WINDOW_DEFAULT,
CHAN_TCP_PACKET_DEFAULT, 0, xstrdup("direct-tcpip")); CHAN_TCP_PACKET_DEFAULT, 0, xstrdup("direct-tcpip"), 1);
} }
void void
@ -800,7 +802,7 @@ server_input_channel_open(int type, int plen, void *ctxt)
*/ */
id = channel_new(ctype, SSH_CHANNEL_LARVAL, id = channel_new(ctype, SSH_CHANNEL_LARVAL,
-1, -1, -1, 0, CHAN_SES_PACKET_DEFAULT, -1, -1, -1, 0, CHAN_SES_PACKET_DEFAULT,
0, xstrdup("server-session")); 0, xstrdup("server-session"), 1);
if (session_open(id) == 1) { if (session_open(id) == 1) {
channel_register_callback(id, SSH2_MSG_CHANNEL_REQUEST, channel_register_callback(id, SSH2_MSG_CHANNEL_REQUEST,
session_input_channel_req, (void *)0); session_input_channel_req, (void *)0);

View File

@ -33,7 +33,7 @@
*/ */
#include "includes.h" #include "includes.h"
RCSID("$OpenBSD: session.c,v 1.40 2000/10/15 14:14:01 markus Exp $"); RCSID("$OpenBSD: session.c,v 1.42 2000/10/27 07:32:18 markus Exp $");
#include "xmalloc.h" #include "xmalloc.h"
#include "ssh.h" #include "ssh.h"
@ -119,7 +119,7 @@ void session_pty_cleanup(Session *s);
void session_proctitle(Session *s); void session_proctitle(Session *s);
void do_exec_pty(Session *s, const char *command, struct passwd * pw); void do_exec_pty(Session *s, const char *command, struct passwd * pw);
void do_exec_no_pty(Session *s, const char *command, struct passwd * pw); void do_exec_no_pty(Session *s, const char *command, struct passwd * pw);
void do_login(Session *s); void do_login(Session *s, const char *command);
void void
do_child(const char *command, struct passwd * pw, const char *term, do_child(const char *command, struct passwd * pw, const char *term,
@ -627,8 +627,8 @@ do_exec_pty(Session *s, const char *command, struct passwd * pw)
close(ttyfd); close(ttyfd);
/* record login, etc. similar to login(1) */ /* record login, etc. similar to login(1) */
if (command == NULL && !options.use_login) if (!(options.use_login && command == NULL))
do_login(s); do_login(s, command);
/* Do common processing for the child, such as execing the command. */ /* Do common processing for the child, such as execing the command. */
do_child(command, pw, s->term, s->display, s->auth_proto, do_child(command, pw, s->term, s->display, s->auth_proto,
@ -684,7 +684,7 @@ get_remote_name_or_ip(void)
/* administrative, login(1)-like work */ /* administrative, login(1)-like work */
void void
do_login(Session *s) do_login(Session *s, const char *command)
{ {
FILE *f; FILE *f;
char *time_string; char *time_string;
@ -731,7 +731,9 @@ do_login(Session *s)
} }
#endif #endif
/* Done if .hushlogin exists. */ /* Done if .hushlogin exists or a command given. */
if (command != NULL)
return;
snprintf(buf, sizeof(buf), "%.200s/.hushlogin", pw->pw_dir); snprintf(buf, sizeof(buf), "%.200s/.hushlogin", pw->pw_dir);
#ifdef HAVE_LOGIN_CAP #ifdef HAVE_LOGIN_CAP
if (login_getcapbool(lc, "hushlogin", 0) || stat(buf, &st) >= 0) if (login_getcapbool(lc, "hushlogin", 0) || stat(buf, &st) >= 0)
@ -1778,7 +1780,8 @@ session_set_fds(Session *s, int fdin, int fdout, int fderr)
fatal("no channel for session %d", s->self); fatal("no channel for session %d", s->self);
channel_set_fds(s->chanid, channel_set_fds(s->chanid,
fdout, fdin, fderr, fdout, fdin, fderr,
fderr == -1 ? CHAN_EXTENDED_IGNORE : CHAN_EXTENDED_READ); fderr == -1 ? CHAN_EXTENDED_IGNORE : CHAN_EXTENDED_READ,
1);
} }
void void

7
ssh.1
View File

@ -34,6 +34,7 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\" .\"
.\" $OpenBSD: ssh.1,v 1.64 2000/10/16 21:46:31 markus Exp $
.Dd September 25, 1999 .Dd September 25, 1999
.Dt SSH 1 .Dt SSH 1
.Os .Os
@ -367,7 +368,7 @@ It is believed to be secure.
(triple-des) is an encrypt-decrypt-encrypt triple with three different keys. (triple-des) is an encrypt-decrypt-encrypt triple with three different keys.
It is presumably more secure than the It is presumably more secure than the
.Ar des .Ar des
cipher which is no longer supported in cipher which is no longer fully supported in
.Nm ssh . .Nm ssh .
.Ar blowfish .Ar blowfish
is a fast block cipher, it appears very secure and is much faster than is a fast block cipher, it appears very secure and is much faster than
@ -628,9 +629,9 @@ If the option is set to
the check will not be executed. the check will not be executed.
.It Cm Cipher .It Cm Cipher
Specifies the cipher to use for encrypting the session Specifies the cipher to use for encrypting the session
in protocol version 1 in protocol version 1.
Currently, Currently,
.Dq blowfish , .Dq blowfish
and and
.Dq 3des .Dq 3des
are supported. are supported.

12
ssh.c
View File

@ -39,7 +39,7 @@
*/ */
#include "includes.h" #include "includes.h"
RCSID("$OpenBSD: ssh.c,v 1.68 2000/10/11 20:27:24 markus Exp $"); RCSID("$OpenBSD: ssh.c,v 1.69 2000/10/27 07:32:19 markus Exp $");
#include <openssl/evp.h> #include <openssl/evp.h>
#include <openssl/dsa.h> #include <openssl/dsa.h>
@ -1008,6 +1008,14 @@ ssh_session2(void)
if (in < 0 || out < 0 || err < 0) if (in < 0 || out < 0 || err < 0)
fatal("dup() in/out/err failed"); fatal("dup() in/out/err failed");
/* enable nonblocking unless tty */
if (!isatty(in))
set_nonblock(in);
if (!isatty(out))
set_nonblock(out);
if (!isatty(err))
set_nonblock(err);
/* should be pre-session */ /* should be pre-session */
init_local_fwd(); init_local_fwd();
@ -1025,7 +1033,7 @@ ssh_session2(void)
id = channel_new( id = channel_new(
"session", SSH_CHANNEL_OPENING, in, out, err, "session", SSH_CHANNEL_OPENING, in, out, err,
window, packetmax, CHAN_EXTENDED_WRITE, window, packetmax, CHAN_EXTENDED_WRITE,
xstrdup("client-session")); xstrdup("client-session"), /*nonblock*/0);
channel_open(id); channel_open(id);
channel_register_callback(id, SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, client_init, (void *)0); channel_register_callback(id, SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, client_init, (void *)0);

View File

@ -23,7 +23,7 @@
*/ */
#include "includes.h" #include "includes.h"
RCSID("$OpenBSD: sshconnect2.c,v 1.26 2000/10/14 12:16:56 markus Exp $"); RCSID("$OpenBSD: sshconnect2.c,v 1.27 2000/10/19 16:45:16 provos Exp $");
#include <openssl/bn.h> #include <openssl/bn.h>
#include <openssl/rsa.h> #include <openssl/rsa.h>
@ -979,7 +979,7 @@ authmethod_lookup(const char *name)
Authmethod * Authmethod *
authmethod_get(char *authlist) authmethod_get(char *authlist)
{ {
char *name = NULL; char *name = NULL, *authname_old;
Authmethod *method = NULL; Authmethod *method = NULL;
/* Use a suitable default if we're passed a nil list. */ /* Use a suitable default if we're passed a nil list. */
@ -1013,16 +1013,17 @@ authmethod_get(char *authlist)
method = NULL; method = NULL;
} }
if (authname_current != NULL) authname_old = authname_current;
xfree(authname_current);
if (method != NULL) { if (method != NULL) {
debug("next auth method to try is %s", name); debug("next auth method to try is %s", name);
authname_current = xstrdup(name); authname_current = xstrdup(name);
return method;
} else { } else {
debug("no more auth methods to try"); debug("no more auth methods to try");
authname_current = NULL; authname_current = NULL;
return NULL;
} }
if (authname_old != NULL)
xfree(authname_old);
return (method);
} }

13
util.c
View File

@ -1,4 +1,4 @@
/* $OpenBSD: util.c,v 1.5 2000/09/07 20:27:55 deraadt Exp $ */ /* $OpenBSD: util.c,v 1.6 2000/10/27 07:32:19 markus Exp $ */
/* /*
* Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2000 Markus Friedl. All rights reserved.
@ -25,7 +25,7 @@
*/ */
#include "includes.h" #include "includes.h"
RCSID("$OpenBSD: util.c,v 1.5 2000/09/07 20:27:55 deraadt Exp $"); RCSID("$OpenBSD: util.c,v 1.6 2000/10/27 07:32:19 markus Exp $");
#include "ssh.h" #include "ssh.h"
@ -48,18 +48,15 @@ void
set_nonblock(int fd) set_nonblock(int fd)
{ {
int val; int val;
if (isatty(fd)) {
/* do not mess with tty's */
debug("no set_nonblock for tty fd %d", fd);
return;
}
val = fcntl(fd, F_GETFL, 0); val = fcntl(fd, F_GETFL, 0);
if (val < 0) { if (val < 0) {
error("fcntl(%d, F_GETFL, 0): %s", fd, strerror(errno)); error("fcntl(%d, F_GETFL, 0): %s", fd, strerror(errno));
return; return;
} }
if (val & O_NONBLOCK) if (val & O_NONBLOCK) {
debug("fd %d IS O_NONBLOCK", fd);
return; return;
}
debug("fd %d setting O_NONBLOCK", fd); debug("fd %d setting O_NONBLOCK", fd);
val |= O_NONBLOCK; val |= O_NONBLOCK;
if (fcntl(fd, F_SETFL, val) == -1) if (fcntl(fd, F_SETFL, val) == -1)