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

Diff for /src/usr.bin/ssh/sshconnect.c between version 1.123 and 1.124

version 1.123, 2002/06/09 22:17:21 version 1.124, 2002/06/11 04:14:26
Line 36 
Line 36 
 char *client_version_string = NULL;  char *client_version_string = NULL;
 char *server_version_string = NULL;  char *server_version_string = NULL;
   
   /* import */
 extern Options options;  extern Options options;
 extern char *__progname;  extern char *__progname;
   extern uid_t original_real_uid;
   extern uid_t original_effective_uid;
   
 static const char *  static const char *
 sockaddr_ntop(struct sockaddr *sa, socklen_t salen)  sockaddr_ntop(struct sockaddr *sa, socklen_t salen)
Line 54 
Line 57 
  * Connect to the given ssh server using a proxy command.   * Connect to the given ssh server using a proxy command.
  */   */
 static int  static int
 ssh_proxy_connect(const char *host, u_short port, struct passwd *pw,  ssh_proxy_connect(const char *host, u_short port, const char *proxy_command)
                   const char *proxy_command)  
 {  {
         Buffer command;          Buffer command;
         const char *cp;          const char *cp;
Line 105 
Line 107 
                 char *argv[10];                  char *argv[10];
   
                 /* Child.  Permanently give up superuser privileges. */                  /* Child.  Permanently give up superuser privileges. */
                 permanently_set_uid(pw);                  seteuid(original_real_uid);
                   setuid(original_real_uid);
   
                 /* Redirect stdin and stdout. */                  /* Redirect stdin and stdout. */
                 close(pin[1]);                  close(pin[1]);
Line 155 
Line 158 
  * Creates a (possibly privileged) socket for use as the ssh connection.   * Creates a (possibly privileged) socket for use as the ssh connection.
  */   */
 static int  static int
 ssh_create_socket(struct passwd *pw, int privileged, int family)  ssh_create_socket(int privileged, int family)
 {  {
         int sock, gaierr;          int sock, gaierr;
         struct addrinfo hints, *res;          struct addrinfo hints, *res;
Line 166 
Line 169 
          */           */
         if (privileged) {          if (privileged) {
                 int p = IPPORT_RESERVED - 1;                  int p = IPPORT_RESERVED - 1;
                   PRIV_START;
                 sock = rresvport_af(&p, family);                  sock = rresvport_af(&p, family);
                   PRIV_END;
                 if (sock < 0)                  if (sock < 0)
                         error("rresvport: af=%d %.100s", family, strerror(errno));                          error("rresvport: af=%d %.100s", family, strerror(errno));
                 else                  else
                         debug("Allocated local port %d.", p);                          debug("Allocated local port %d.", p);
                 return sock;                  return sock;
         }          }
         /*  
          * Just create an ordinary socket on arbitrary port.  We use  
          * the user's uid to create the socket.  
          */  
         temporarily_use_uid(pw);  
         sock = socket(family, SOCK_STREAM, 0);          sock = socket(family, SOCK_STREAM, 0);
         if (sock < 0)          if (sock < 0)
                 error("socket: %.100s", strerror(errno));                  error("socket: %.100s", strerror(errno));
         restore_uid();  
   
         /* Bind the socket to an alternative local IP address */          /* Bind the socket to an alternative local IP address */
         if (options.bind_address == NULL)          if (options.bind_address == NULL)
Line 211 
Line 210 
 /*  /*
  * Opens a TCP/IP connection to the remote server on the given host.   * Opens a TCP/IP connection to the remote server on the given host.
  * The address of the remote host will be returned in hostaddr.   * The address of the remote host will be returned in hostaddr.
  * If port is 0, the default port will be used.  If anonymous is zero,   * If port is 0, the default port will be used.  If needpriv is true,
  * a privileged port will be allocated to make the connection.   * a privileged port will be allocated to make the connection.
  * This requires super-user privileges if anonymous is false.   * This requires super-user privileges if needpriv is true.
  * Connection_attempts specifies the maximum number of tries (one per   * Connection_attempts specifies the maximum number of tries (one per
  * second).  If proxy_command is non-NULL, it specifies the command (with %h   * second).  If proxy_command is non-NULL, it specifies the command (with %h
  * and %p substituted for host and port, respectively) to use to contact   * and %p substituted for host and port, respectively) to use to contact
Line 228 
Line 227 
 int  int
 ssh_connect(const char *host, struct sockaddr_storage * hostaddr,  ssh_connect(const char *host, struct sockaddr_storage * hostaddr,
     u_short port, int family, int connection_attempts,      u_short port, int family, int connection_attempts,
     int anonymous, struct passwd *pw, const char *proxy_command)      int needpriv, const char *proxy_command)
 {  {
         int gaierr;          int gaierr;
         int on = 1;          int on = 1;
Line 244 
Line 243 
          */           */
         int full_failure = 1;          int full_failure = 1;
   
         debug("ssh_connect: getuid %u geteuid %u anon %d",          debug("ssh_connect: needpriv %d", needpriv);
             (u_int) getuid(), (u_int) geteuid(), anonymous);  
   
         /* Get default port if port has not been set. */          /* Get default port if port has not been set. */
         if (port == 0) {          if (port == 0) {
Line 257 
Line 255 
         }          }
         /* If a proxy command is given, connect using it. */          /* If a proxy command is given, connect using it. */
         if (proxy_command != NULL)          if (proxy_command != NULL)
                 return ssh_proxy_connect(host, port, pw, proxy_command);                  return ssh_proxy_connect(host, port, proxy_command);
   
         /* No proxy command. */          /* No proxy command. */
   
Line 293 
Line 291 
                                 host, ntop, strport);                                  host, ntop, strport);
   
                         /* Create a socket for connecting. */                          /* Create a socket for connecting. */
                         sock = ssh_create_socket(pw,                          sock = ssh_create_socket(needpriv, ai->ai_family);
                             !anonymous && geteuid() == 0,  
                             ai->ai_family);  
                         if (sock < 0)                          if (sock < 0)
                                 /* Any error is already output */                                  /* Any error is already output */
                                 continue;                                  continue;
   
                         /* Connect to the host.  We use the user's uid in the  
                          * hope that it will help with tcp_wrappers showing  
                          * the remote uid as root.  
                          */  
                         temporarily_use_uid(pw);  
                         if (connect(sock, ai->ai_addr, ai->ai_addrlen) >= 0) {                          if (connect(sock, ai->ai_addr, ai->ai_addrlen) >= 0) {
                                 /* Successful connection. */                                  /* Successful connection. */
                                 memcpy(hostaddr, ai->ai_addr, ai->ai_addrlen);                                  memcpy(hostaddr, ai->ai_addr, ai->ai_addrlen);
                                 restore_uid();  
                                 break;                                  break;
                         } else {                          } else {
                                 if (errno == ECONNREFUSED)                                  if (errno == ECONNREFUSED)
Line 316 
Line 306 
                                 log("ssh: connect to address %s port %s: %s",                                  log("ssh: connect to address %s port %s: %s",
                                     sockaddr_ntop(ai->ai_addr, ai->ai_addrlen),                                      sockaddr_ntop(ai->ai_addr, ai->ai_addrlen),
                                     strport, strerror(errno));                                      strport, strerror(errno));
                                 restore_uid();  
                                 /*                                  /*
                                  * Close the failed socket; there appear to                                   * Close the failed socket; there appear to
                                  * be some problems when reusing a socket for                                   * be some problems when reusing a socket for

Legend:
Removed from v.1.123  
changed lines
  Added in v.1.124