[BACK]Return to ssh.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/ssh.c between version 1.249.2.1 and 1.249.2.2

version 1.249.2.1, 2006/02/03 03:01:58 version 1.249.2.2, 2006/10/06 03:19:33
Line 1 
Line 1 
   /* $OpenBSD$ */
 /*  /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>   * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland   * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
Line 39 
Line 40 
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */   */
   
 #include "includes.h"  #include <sys/types.h>
 RCSID("$OpenBSD$");  #include <sys/time.h>
   #include <sys/resource.h>
   #include <sys/ioctl.h>
   #include <sys/types.h>
   #include <sys/socket.h>
   #include <sys/un.h>
   #include <sys/stat.h>
   
   #include <ctype.h>
   #include <errno.h>
   #include <fcntl.h>
   #include <netdb.h>
   #include <paths.h>
   #include <pwd.h>
   #include <signal.h>
   #include <stddef.h>
   #include <stdio.h>
   #include <stdlib.h>
   #include <string.h>
   #include <unistd.h>
   
 #include <openssl/evp.h>  #include <openssl/evp.h>
 #include <openssl/err.h>  #include <openssl/err.h>
   
   #include "xmalloc.h"
 #include "ssh.h"  #include "ssh.h"
 #include "ssh1.h"  #include "ssh1.h"
 #include "ssh2.h"  #include "ssh2.h"
 #include "compat.h"  #include "compat.h"
 #include "cipher.h"  #include "cipher.h"
 #include "xmalloc.h"  
 #include "packet.h"  #include "packet.h"
 #include "buffer.h"  #include "buffer.h"
 #include "bufaux.h"  
 #include "channels.h"  #include "channels.h"
 #include "key.h"  #include "key.h"
 #include "authfd.h"  #include "authfd.h"
Line 72 
Line 91 
 #include "msg.h"  #include "msg.h"
 #include "monitor_fdpass.h"  #include "monitor_fdpass.h"
 #include "uidswap.h"  #include "uidswap.h"
   #include "version.h"
   
 #ifdef SMARTCARD  #ifdef SMARTCARD
 #include "scard.h"  #include "scard.h"
Line 162 
Line 182 
 "           [-i identity_file] [-L [bind_address:]port:host:hostport]\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"  "           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]\n"
 "           [-R [bind_address:]port:host:hostport] [-S ctl_path]\n"  "           [-R [bind_address:]port:host:hostport] [-S ctl_path]\n"
 "           [-w tunnel:tunnel] [user@]hostname [command]\n"  "           [-w local_tun[:remote_tun]] [user@]hostname [command]\n"
         );          );
         exit(255);          exit(255);
 }  }
Line 237 
Line 257 
         /* Parse command-line arguments. */          /* Parse command-line arguments. */
         host = NULL;          host = NULL;
   
 again:   again:
         while ((opt = getopt(ac, av,          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:TVw:XY")) != -1) {
                 switch (opt) {                  switch (opt) {
Line 609 
Line 629 
         if (options.host_key_alias != NULL) {          if (options.host_key_alias != NULL) {
                 for (p = options.host_key_alias; *p; p++)                  for (p = options.host_key_alias; *p; p++)
                         if (isupper(*p))                          if (isupper(*p))
                                 *p = tolower(*p);                                  *p = (char)tolower(*p);
         }          }
   
         /* Get default port if port has not been set. */          /* Get default port if port has not been set. */
Line 626 
Line 646 
                 options.control_path = NULL;                  options.control_path = NULL;
   
         if (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);                  snprintf(buf, sizeof(buf), "%d", options.port);
                 cp = tilde_expand_filename(options.control_path,                  cp = tilde_expand_filename(options.control_path,
                     original_real_uid);                      original_real_uid);
                 options.control_path = percent_expand(cp, "p", buf, "h", host,                  options.control_path = percent_expand(cp, "p", buf, "h", host,
                     "r", options.user, (char *)NULL);                      "r", options.user, "l", thishost, (char *)NULL);
                 xfree(cp);                  xfree(cp);
         }          }
         if (mux_command != 0 && options.control_path == NULL)          if (mux_command != 0 && options.control_path == NULL)
Line 659 
Line 683 
         if (options.rhosts_rsa_authentication ||          if (options.rhosts_rsa_authentication ||
             options.hostbased_authentication) {              options.hostbased_authentication) {
                 sensitive_data.nkeys = 3;                  sensitive_data.nkeys = 3;
                 sensitive_data.keys = xmalloc(sensitive_data.nkeys *                  sensitive_data.keys = xcalloc(sensitive_data.nkeys,
                     sizeof(Key));                      sizeof(Key));
   
                 PRIV_START;                  PRIV_START;
                 sensitive_data.keys[0] = key_load_private_type(KEY_RSA1,                  sensitive_data.keys[0] = key_load_private_type(KEY_RSA1,
                     _PATH_HOST_KEY_FILE, "", NULL);                      _PATH_HOST_KEY_FILE, "", NULL, NULL);
                 sensitive_data.keys[1] = key_load_private_type(KEY_DSA,                  sensitive_data.keys[1] = key_load_private_type(KEY_DSA,
                     _PATH_HOST_DSA_KEY_FILE, "", NULL);                      _PATH_HOST_DSA_KEY_FILE, "", NULL, NULL);
                 sensitive_data.keys[2] = key_load_private_type(KEY_RSA,                  sensitive_data.keys[2] = key_load_private_type(KEY_RSA,
                     _PATH_HOST_RSA_KEY_FILE, "", NULL);                      _PATH_HOST_RSA_KEY_FILE, "", NULL, NULL);
                 PRIV_END;                  PRIV_END;
   
                 if (options.hostbased_authentication == 1 &&                  if (options.hostbased_authentication == 1 &&
Line 784 
Line 808 
                     options.local_forwards[i].connect_port,                      options.local_forwards[i].connect_port,
                     options.gateway_ports);                      options.gateway_ports);
         }          }
           if (i > 0 && success != i && options.exit_on_forward_failure)
                   fatal("Could not request local forwarding.");
         if (i > 0 && success == 0)          if (i > 0 && success == 0)
                 error("Could not request local forwarding.");                  error("Could not request local forwarding.");
   
Line 796 
Line 822 
                     options.remote_forwards[i].listen_port,                      options.remote_forwards[i].listen_port,
                     options.remote_forwards[i].connect_host,                      options.remote_forwards[i].connect_host,
                     options.remote_forwards[i].connect_port);                      options.remote_forwards[i].connect_port);
                 channel_request_remote_forwarding(                  if (channel_request_remote_forwarding(
                     options.remote_forwards[i].listen_host,                      options.remote_forwards[i].listen_host,
                     options.remote_forwards[i].listen_port,                      options.remote_forwards[i].listen_port,
                     options.remote_forwards[i].connect_host,                      options.remote_forwards[i].connect_host,
                     options.remote_forwards[i].connect_port);                      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.");
                   }
         }          }
 }  }
   
Line 861 
Line 893 
                 /* Store window size in the packet. */                  /* Store window size in the packet. */
                 if (ioctl(fileno(stdin), TIOCGWINSZ, &ws) < 0)                  if (ioctl(fileno(stdin), TIOCGWINSZ, &ws) < 0)
                         memset(&ws, 0, sizeof(ws));                          memset(&ws, 0, sizeof(ws));
                 packet_put_int(ws.ws_row);                  packet_put_int((u_int)ws.ws_row);
                 packet_put_int(ws.ws_col);                  packet_put_int((u_int)ws.ws_col);
                 packet_put_int(ws.ws_xpixel);                  packet_put_int((u_int)ws.ws_xpixel);
                 packet_put_int(ws.ws_ypixel);                  packet_put_int((u_int)ws.ws_ypixel);
   
                 /* Store tty modes in the packet. */                  /* Store tty modes in the packet. */
                 tty_make_modes(fileno(stdin), NULL);                  tty_make_modes(fileno(stdin), NULL);
Line 982 
Line 1014 
             options.remote_forwards[i].listen_port,              options.remote_forwards[i].listen_port,
             options.remote_forwards[i].connect_host,              options.remote_forwards[i].connect_host,
             options.remote_forwards[i].connect_port);              options.remote_forwards[i].connect_port);
         if (type == SSH2_MSG_REQUEST_FAILURE)          if (type == SSH2_MSG_REQUEST_FAILURE) {
                 logit("Warning: remote port forwarding failed for listen "                  if (options.exit_on_forward_failure)
                     "port %d", options.remote_forwards[i].listen_port);                          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);
           }
 }  }
   
 static void  static void
Line 1012 
Line 1051 
                 fatal("%s socket(): %s", __func__, strerror(errno));                  fatal("%s socket(): %s", __func__, strerror(errno));
   
         old_umask = umask(0177);          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;                  control_fd = -1;
                 if (errno == EINVAL || errno == EADDRINUSE)                  if (errno == EINVAL || errno == EADDRINUSE)
                         fatal("ControlSocket %s already exists",                          fatal("ControlSocket %s already exists",
Line 1159 
Line 1198 
 static void  static void
 load_public_identity_files(void)  load_public_identity_files(void)
 {  {
         char *filename;          char *filename, *cp, thishost[NI_MAXHOST];
         int i = 0;          int i = 0;
         Key *public;          Key *public;
           struct passwd *pw;
 #ifdef SMARTCARD  #ifdef SMARTCARD
         Key **keys;          Key **keys;
   
         if (options.smartcard_device != NULL &&          if (options.smartcard_device != NULL &&
             options.num_identity_files < SSH_MAX_IDENTITY_FILES &&              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;                  int count = 0;
                 for (i = 0; keys[i] != NULL; i++) {                  for (i = 0; keys[i] != NULL; i++) {
                         count++;                          count++;
Line 1185 
Line 1225 
                 xfree(keys);                  xfree(keys);
         }          }
 #endif /* SMARTCARD */  #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++) {          for (; i < options.num_identity_files; i++) {
                 filename = tilde_expand_filename(options.identity_files[i],                  cp = tilde_expand_filename(options.identity_files[i],
                     original_real_uid);                      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);                  public = key_load_public(filename, NULL);
                 debug("identity file %s type %d", filename,                  debug("identity file %s type %d", filename,
                     public ? public->type : -1);                      public ? public->type : -1);
Line 1213 
Line 1262 
 static int  static int
 env_permitted(char *env)  env_permitted(char *env)
 {  {
         int i;          int i, ret;
         char name[1024], *cp;          char name[1024], *cp;
   
         strlcpy(name, env, sizeof(name));          if ((cp = strchr(env, '=')) == NULL || cp == env)
         if ((cp = strchr(name, '=')) == NULL)  
                 return (0);                  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++)          for (i = 0; i < options.num_send_env; i++)
                 if (match_pattern(name, options.send_env[i]))                  if (match_pattern(name, options.send_env[i]))
                         return (1);                          return (1);
Line 1265 
Line 1314 
         if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)          if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
                 fatal("%s socket(): %s", __func__, strerror(errno));                  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) {                  if (mux_command != SSHMUX_COMMAND_OPEN) {
                         fatal("Control socket connect(%.100s): %s", path,                          fatal("Control socket connect(%.100s): %s", path,
                             strerror(errno));                              strerror(errno));
                 }                  }
                 if (errno == ENOENT)                  if (errno == ENOENT)
                         debug("Control socket \"%.100s\" does not exist", path);                          debug("Control socket \"%.100s\" does not exist", path);
                 else {                  else {
                         error("Control socket connect(%.100s): %s", path,                          error("Control socket connect(%.100s): %s", path,
                             strerror(errno));                              strerror(errno));
                 }                  }
                 close(sock);                  close(sock);
                 return;                  return;
         }          }
   
         if (stdin_null_flag) {          if (stdin_null_flag) {
                 if ((fd = open(_PATH_DEVNULL, O_RDONLY)) == -1)                  if ((fd = open(_PATH_DEVNULL, O_RDONLY)) == -1)
                         fatal("open(/dev/null): %s", strerror(errno));                          fatal("open(/dev/null): %s", strerror(errno));
                 if (dup2(fd, STDIN_FILENO) == -1)                  if (dup2(fd, STDIN_FILENO) == -1)
                         fatal("dup2: %s", strerror(errno));                          fatal("dup2: %s", strerror(errno));
                 if (fd > STDERR_FILENO)                  if (fd > STDERR_FILENO)
                         close(fd);                          close(fd);
         }          }
   
         term = getenv("TERM");          term = getenv("TERM");
   

Legend:
Removed from v.1.249.2.1  
changed lines
  Added in v.1.249.2.2