=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/ssh.c,v retrieving revision 1.249.2.3 retrieving revision 1.250 diff -u -r1.249.2.3 -r1.250 --- src/usr.bin/ssh/ssh.c 2006/11/08 00:44:05 1.249.2.3 +++ src/usr.bin/ssh/ssh.c 2005/09/13 23:40:07 1.250 @@ -1,4 +1,3 @@ -/* $OpenBSD: ssh.c,v 1.249.2.3 2006/11/08 00:44:05 brad Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -40,39 +39,21 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include -#include -#include -#include -#include -#include -#include -#include +#include "includes.h" +RCSID("$OpenBSD: ssh.c,v 1.250 2005/09/13 23:40:07 djm Exp $"); -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include #include -#include "xmalloc.h" #include "ssh.h" #include "ssh1.h" #include "ssh2.h" #include "compat.h" #include "cipher.h" +#include "xmalloc.h" #include "packet.h" #include "buffer.h" +#include "bufaux.h" #include "channels.h" #include "key.h" #include "authfd.h" @@ -91,7 +72,6 @@ #include "msg.h" #include "monitor_fdpass.h" #include "uidswap.h" -#include "version.h" #ifdef SMARTCARD #include "scard.h" @@ -178,13 +158,13 @@ { fprintf(stderr, "usage: ssh [-1246AaCfgkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]\n" -" [-D [bind_address:]port] [-e escape_char] [-F configfile]\n" +" [-D port] [-e escape_char] [-F configfile]\n" " [-i identity_file] [-L [bind_address:]port:host:hostport]\n" " [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]\n" " [-R [bind_address:]port:host:hostport] [-S ctl_path]\n" -" [-w local_tun[:remote_tun]] [user@]hostname [command]\n" +" [user@]hostname [command]\n" ); - exit(255); + exit(1); } static int ssh_session(void); @@ -238,7 +218,7 @@ pw = getpwuid(original_real_uid); if (!pw) { logit("You don't exist, go away!"); - exit(255); + exit(1); } /* Take a copy of the returned structure. */ pw = pwcopy(pw); @@ -257,9 +237,9 @@ /* Parse command-line arguments. */ host = NULL; - again: +again: while ((opt = getopt(ac, av, - "1246ab:c:e:fgi:kl:m:no:p:qstvxACD:F:I:L:MNO:PR:S:TVw:XY")) != -1) { + "1246ab:c:e:fgi:kl:m:no:p:qstvxACD:F:I:L:MNO:PR:S:TVXY")) != -1) { switch (opt) { case '1': options.protocol = SSH_PROTO_1; @@ -355,15 +335,6 @@ if (opt == 'V') exit(0); break; - case 'w': - if (options.tun_open == -1) - options.tun_open = SSH_TUNMODE_DEFAULT; - options.tun_local = a2tun(optarg, &options.tun_remote); - if (options.tun_local == SSH_TUNID_ERR) { - fprintf(stderr, "Bad tun device '%s'\n", optarg); - exit(255); - } - break; case 'q': options.log_level = SYSLOG_LEVEL_QUIET; break; @@ -379,7 +350,7 @@ else { fprintf(stderr, "Bad escape character '%s'.\n", optarg); - exit(255); + exit(1); } break; case 'c': @@ -394,7 +365,7 @@ fprintf(stderr, "Unknown cipher type '%s'\n", optarg); - exit(255); + exit(1); } if (options.cipher == SSH_CIPHER_3DES) options.ciphers = "3des-cbc"; @@ -410,7 +381,7 @@ else { fprintf(stderr, "Unknown mac type '%s'\n", optarg); - exit(255); + exit(1); } break; case 'M': @@ -423,7 +394,7 @@ options.port = a2port(optarg); if (options.port == 0) { fprintf(stderr, "Bad port '%s'\n", optarg); - exit(255); + exit(1); } break; case 'l': @@ -437,7 +408,7 @@ fprintf(stderr, "Bad local forwarding specification '%s'\n", optarg); - exit(255); + exit(1); } break; @@ -448,7 +419,7 @@ fprintf(stderr, "Bad remote forwarding specification " "'%s'\n", optarg); - exit(255); + exit(1); } break; @@ -459,7 +430,7 @@ if ((fwd.listen_host = hpdelim(&cp)) == NULL) { fprintf(stderr, "Bad dynamic forwarding " "specification '%.100s'\n", optarg); - exit(255); + exit(1); } if (cp != NULL) { fwd.listen_port = a2port(cp); @@ -472,7 +443,7 @@ if (fwd.listen_port == 0) { fprintf(stderr, "Bad dynamic port '%s'\n", optarg); - exit(255); + exit(1); } add_local_forward(&options, &fwd); xfree(p); @@ -493,7 +464,7 @@ line = xstrdup(optarg); if (process_config_line(&options, host ? host : "", line, "command-line", 0, &dummy) != 0) - exit(255); + exit(1); xfree(line); break; case 's': @@ -629,7 +600,7 @@ if (options.host_key_alias != NULL) { for (p = options.host_key_alias; *p; p++) if (isupper(*p)) - *p = (char)tolower(*p); + *p = tolower(*p); } /* Get default port if port has not been set. */ @@ -646,15 +617,11 @@ options.control_path = NULL; if (options.control_path != NULL) { - char thishost[NI_MAXHOST]; - - if (gethostname(thishost, sizeof(thishost)) == -1) - fatal("gethostname: %s", strerror(errno)); snprintf(buf, sizeof(buf), "%d", options.port); cp = tilde_expand_filename(options.control_path, original_real_uid); options.control_path = percent_expand(cp, "p", buf, "h", host, - "r", options.user, "l", thishost, (char *)NULL); + "r", options.user, (char *)NULL); xfree(cp); } if (mux_command != 0 && options.control_path == NULL) @@ -667,7 +634,7 @@ options.address_family, options.connection_attempts, original_effective_uid == 0 && options.use_privileged_port, options.proxy_command) != 0) - exit(255); + exit(1); /* * If we successfully made the connection, load the host private key @@ -683,16 +650,16 @@ if (options.rhosts_rsa_authentication || options.hostbased_authentication) { sensitive_data.nkeys = 3; - sensitive_data.keys = xcalloc(sensitive_data.nkeys, + sensitive_data.keys = xmalloc(sensitive_data.nkeys * sizeof(Key)); PRIV_START; sensitive_data.keys[0] = key_load_private_type(KEY_RSA1, - _PATH_HOST_KEY_FILE, "", NULL, NULL); + _PATH_HOST_KEY_FILE, "", NULL); sensitive_data.keys[1] = key_load_private_type(KEY_DSA, - _PATH_HOST_DSA_KEY_FILE, "", NULL, NULL); + _PATH_HOST_DSA_KEY_FILE, "", NULL); sensitive_data.keys[2] = key_load_private_type(KEY_RSA, - _PATH_HOST_RSA_KEY_FILE, "", NULL, NULL); + _PATH_HOST_RSA_KEY_FILE, "", NULL); PRIV_END; if (options.hostbased_authentication == 1 && @@ -720,7 +687,7 @@ /* * Now that we are back to our own permissions, create ~/.ssh - * directory if it doesn't already exist. + * directory if it doesn\'t already exist. */ snprintf(buf, sizeof buf, "%.100s%s%.100s", pw->pw_dir, strcmp(pw->pw_dir, "/") ? "/" : "", _PATH_SSH_USER_DIR); if (stat(buf, &st) < 0) @@ -808,8 +775,6 @@ options.local_forwards[i].connect_port, options.gateway_ports); } - if (i > 0 && success != i && options.exit_on_forward_failure) - fatal("Could not request local forwarding."); if (i > 0 && success == 0) error("Could not request local forwarding."); @@ -818,21 +783,16 @@ debug("Remote connections from %.200s:%d forwarded to " "local address %.200s:%d", (options.remote_forwards[i].listen_host == NULL) ? - "LOCALHOST" : options.remote_forwards[i].listen_host, + (options.gateway_ports ? "*" : "LOCALHOST") : + options.remote_forwards[i].listen_host, options.remote_forwards[i].listen_port, options.remote_forwards[i].connect_host, options.remote_forwards[i].connect_port); - if (channel_request_remote_forwarding( + channel_request_remote_forwarding( options.remote_forwards[i].listen_host, options.remote_forwards[i].listen_port, options.remote_forwards[i].connect_host, - options.remote_forwards[i].connect_port) < 0) { - if (options.exit_on_forward_failure) - fatal("Could not request remote forwarding."); - else - logit("Warning: Could not request remote " - "forwarding."); - } + options.remote_forwards[i].connect_port); } } @@ -840,7 +800,7 @@ check_agent_present(void) { if (options.forward_agent) { - /* Clear agent forwarding if we don't have an agent. */ + /* Clear agent forwarding if we don\'t have an agent. */ if (!ssh_agent_present()) options.forward_agent = 0; } @@ -893,10 +853,10 @@ /* Store window size in the packet. */ if (ioctl(fileno(stdin), TIOCGWINSZ, &ws) < 0) memset(&ws, 0, sizeof(ws)); - packet_put_int((u_int)ws.ws_row); - packet_put_int((u_int)ws.ws_col); - packet_put_int((u_int)ws.ws_xpixel); - packet_put_int((u_int)ws.ws_ypixel); + packet_put_int(ws.ws_row); + packet_put_int(ws.ws_col); + packet_put_int(ws.ws_xpixel); + packet_put_int(ws.ws_ypixel); /* Store tty modes in the packet. */ tty_make_modes(fileno(stdin), NULL); @@ -1014,16 +974,9 @@ options.remote_forwards[i].listen_port, options.remote_forwards[i].connect_host, options.remote_forwards[i].connect_port); - if (type == SSH2_MSG_REQUEST_FAILURE) { - if (options.exit_on_forward_failure) - fatal("Error: remote port forwarding failed for " - "listen port %d", - options.remote_forwards[i].listen_port); - else - logit("Warning: remote port forwarding failed for " - "listen port %d", - options.remote_forwards[i].listen_port); - } + if (type == SSH2_MSG_REQUEST_FAILURE) + logit("Warning: remote port forwarding failed for listen " + "port %d", options.remote_forwards[i].listen_port); } static void @@ -1048,21 +1001,21 @@ fatal("ControlPath too long"); if ((control_fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) - fatal("%s socket(): %s", __func__, strerror(errno)); + fatal("%s socket(): %s\n", __func__, strerror(errno)); old_umask = umask(0177); - if (bind(control_fd, (struct sockaddr *)&addr, addr.sun_len) == -1) { + if (bind(control_fd, (struct sockaddr*)&addr, addr.sun_len) == -1) { control_fd = -1; if (errno == EINVAL || errno == EADDRINUSE) fatal("ControlSocket %s already exists", options.control_path); else - fatal("%s bind(): %s", __func__, strerror(errno)); + fatal("%s bind(): %s\n", __func__, strerror(errno)); } umask(old_umask); if (listen(control_fd, 64) == -1) - fatal("%s listen(): %s", __func__, strerror(errno)); + fatal("%s listen(): %s\n", __func__, strerror(errno)); set_nonblock(control_fd); } @@ -1095,28 +1048,6 @@ packet_send(); } - if (options.tun_open != SSH_TUNMODE_NO) { - Channel *c; - int fd; - - debug("Requesting tun."); - if ((fd = tun_open(options.tun_local, - options.tun_open)) >= 0) { - c = channel_new("tun", SSH_CHANNEL_OPENING, fd, fd, -1, - CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, - 0, "tun", 1); - c->datagram = 1; - packet_start(SSH2_MSG_CHANNEL_OPEN); - packet_put_cstring("tun@openssh.com"); - packet_put_int(c->self); - packet_put_int(c->local_window_max); - packet_put_int(c->local_maxpacket); - packet_put_int(options.tun_open); - packet_put_int(options.tun_remote); - packet_send(); - } - } - client_session2_setup(id, tty_flag, subsystem_flag, getenv("TERM"), NULL, fileno(stdin), &command, environ, &ssh_subsystem_reply); @@ -1181,11 +1112,6 @@ if (!no_shell_flag || (datafellows & SSH_BUG_DUMMYCHAN)) id = ssh_session2_open(); - /* Execute a local command */ - if (options.local_command != NULL && - options.permit_local_command) - ssh_local_cmd(options.local_command); - /* If requested, let ssh continue in the background. */ if (fork_after_authentication_flag) if (daemon(1, 1) < 0) @@ -1198,16 +1124,15 @@ static void load_public_identity_files(void) { - char *filename, *cp, thishost[NI_MAXHOST]; + char *filename; int i = 0; Key *public; - struct passwd *pw; #ifdef SMARTCARD Key **keys; if (options.smartcard_device != NULL && options.num_identity_files < SSH_MAX_IDENTITY_FILES && - (keys = sc_get_keys(options.smartcard_device, NULL)) != NULL) { + (keys = sc_get_keys(options.smartcard_device, NULL)) != NULL ) { int count = 0; for (i = 0; keys[i] != NULL; i++) { count++; @@ -1225,18 +1150,9 @@ xfree(keys); } #endif /* SMARTCARD */ - if ((pw = getpwuid(original_real_uid)) == NULL) - fatal("load_public_identity_files: getpwuid failed"); - if (gethostname(thishost, sizeof(thishost)) == -1) - fatal("load_public_identity_files: gethostname: %s", - strerror(errno)); for (; i < options.num_identity_files; i++) { - cp = tilde_expand_filename(options.identity_files[i], + filename = tilde_expand_filename(options.identity_files[i], original_real_uid); - filename = percent_expand(cp, "d", pw->pw_dir, - "u", pw->pw_name, "l", thishost, "h", host, - "r", options.user, (char *)NULL); - xfree(cp); public = key_load_public(filename, NULL); debug("identity file %s type %d", filename, public ? public->type : -1); @@ -1262,15 +1178,15 @@ static int env_permitted(char *env) { - int i, ret; + int i; char name[1024], *cp; - if ((cp = strchr(env, '=')) == NULL || cp == env) + strlcpy(name, env, sizeof(name)); + if ((cp = strchr(name, '=')) == NULL) return (0); - ret = snprintf(name, sizeof(name), "%.*s", (int)(cp - env), env); - if (ret <= 0 || (size_t)ret >= sizeof(name)) - fatal("env_permitted: name '%.100s...' too long", env); + *cp = '\0'; + for (i = 0; i < options.num_send_env; i++) if (match_pattern(name, options.send_env[i])) return (1); @@ -1314,29 +1230,29 @@ if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) fatal("%s socket(): %s", __func__, strerror(errno)); - if (connect(sock, (struct sockaddr *)&addr, addr.sun_len) == -1) { + if (connect(sock, (struct sockaddr*)&addr, addr.sun_len) == -1) { if (mux_command != SSHMUX_COMMAND_OPEN) { fatal("Control socket connect(%.100s): %s", path, strerror(errno)); } if (errno == ENOENT) - debug("Control socket \"%.100s\" does not exist", path); + debug("Control socket \"%.100s\" does not exist", path); else { - error("Control socket connect(%.100s): %s", path, + error("Control socket connect(%.100s): %s", path, strerror(errno)); } - close(sock); - return; - } + close(sock); + return; + } - if (stdin_null_flag) { - if ((fd = open(_PATH_DEVNULL, O_RDONLY)) == -1) - fatal("open(/dev/null): %s", strerror(errno)); - if (dup2(fd, STDIN_FILENO) == -1) - fatal("dup2: %s", strerror(errno)); - if (fd > STDERR_FILENO) - close(fd); - } + if (stdin_null_flag) { + if ((fd = open(_PATH_DEVNULL, O_RDONLY)) == -1) + fatal("open(/dev/null): %s", strerror(errno)); + if (dup2(fd, STDIN_FILENO) == -1) + fatal("dup2: %s", strerror(errno)); + if (fd > STDERR_FILENO) + close(fd); + } term = getenv("TERM");