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

Diff for /src/usr.bin/ssh/session.c between version 1.186.2.1 and 1.186.2.2

version 1.186.2.1, 2006/02/03 03:01:57 version 1.186.2.2, 2006/10/06 03:19:33
Line 1 
Line 1 
   /* $OpenBSD$ */
 /*  /*
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland   * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
  *                    All rights reserved   *                    All rights reserved
Line 32 
Line 33 
  * 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/wait.h>
   #include <sys/un.h>
   #include <sys/stat.h>
   #include <sys/socket.h>
   #include <sys/param.h>
   
   #include <errno.h>
   #include <grp.h>
   #include <paths.h>
   #include <pwd.h>
   #include <signal.h>
   #include <stdio.h>
   #include <stdlib.h>
   #include <string.h>
   #include <unistd.h>
   
   #include "xmalloc.h"
 #include "ssh.h"  #include "ssh.h"
 #include "ssh1.h"  #include "ssh1.h"
 #include "ssh2.h"  #include "ssh2.h"
 #include "xmalloc.h"  
 #include "sshpty.h"  #include "sshpty.h"
 #include "packet.h"  #include "packet.h"
 #include "buffer.h"  #include "buffer.h"
Line 46 
Line 61 
 #include "uidswap.h"  #include "uidswap.h"
 #include "compat.h"  #include "compat.h"
 #include "channels.h"  #include "channels.h"
 #include "bufaux.h"  #include "key.h"
   #include "cipher.h"
   #include "kex.h"
   #include "hostfile.h"
 #include "auth.h"  #include "auth.h"
 #include "auth-options.h"  #include "auth-options.h"
 #include "pathnames.h"  #include "pathnames.h"
Line 56 
Line 74 
 #include "serverloop.h"  #include "serverloop.h"
 #include "canohost.h"  #include "canohost.h"
 #include "session.h"  #include "session.h"
 #include "kex.h"  #ifdef GSSAPI
   #include "ssh-gss.h"
   #endif
 #include "monitor_wrap.h"  #include "monitor_wrap.h"
   
 #ifdef KRB5  #ifdef KRB5
 #include <kafs.h>  #include <kafs.h>
 #endif  #endif
   
 #ifdef GSSAPI  
 #include "ssh-gss.h"  
 #endif  
   
 /* func */  /* func */
   
 Session *session_new(void);  Session *session_new(void);
Line 172 
Line 188 
         sunaddr.sun_family = AF_UNIX;          sunaddr.sun_family = AF_UNIX;
         strlcpy(sunaddr.sun_path, auth_sock_name, sizeof(sunaddr.sun_path));          strlcpy(sunaddr.sun_path, auth_sock_name, sizeof(sunaddr.sun_path));
   
         if (bind(sock, (struct sockaddr *) & sunaddr, sizeof(sunaddr)) < 0)          if (bind(sock, (struct sockaddr *)&sunaddr, sizeof(sunaddr)) < 0)
                 packet_disconnect("bind: %.100s", strerror(errno));                  packet_disconnect("bind: %.100s", strerror(errno));
   
         /* Restore the privileged uid. */          /* Restore the privileged uid. */
Line 319 
Line 335 
                                 break;                                  break;
                         }                          }
                         debug("Received TCP/IP port forwarding request.");                          debug("Received TCP/IP port forwarding request.");
                         channel_input_port_forward_request(s->pw->pw_uid == 0, options.gateway_ports);                          if (channel_input_port_forward_request(s->pw->pw_uid == 0,
                               options.gateway_ports) < 0) {
                                   debug("Port forwarding failed.");
                                   break;
                           }
                         success = 1;                          success = 1;
                         break;                          break;
   
Line 371 
Line 391 
 {  {
         pid_t pid;          pid_t pid;
   
 #ifdef USE_PIPES  
         int pin[2], pout[2], perr[2];  
         /* Allocate pipes for communicating with the program. */  
         if (pipe(pin) < 0 || pipe(pout) < 0 || pipe(perr) < 0)  
                 packet_disconnect("Could not create pipes: %.100s",  
                                   strerror(errno));  
 #else /* USE_PIPES */  
         int inout[2], err[2];          int inout[2], err[2];
         /* Uses socket pairs to communicate with the program. */          /* Uses socket pairs to communicate with the program. */
         if (socketpair(AF_UNIX, SOCK_STREAM, 0, inout) < 0 ||          if (socketpair(AF_UNIX, SOCK_STREAM, 0, inout) < 0 ||
             socketpair(AF_UNIX, SOCK_STREAM, 0, err) < 0)              socketpair(AF_UNIX, SOCK_STREAM, 0, err) < 0)
                 packet_disconnect("Could not create socket pairs: %.100s",                  packet_disconnect("Could not create socket pairs: %.100s",
                                   strerror(errno));                                    strerror(errno));
 #endif /* USE_PIPES */  
         if (s == NULL)          if (s == NULL)
                 fatal("do_exec_no_pty: no session");                  fatal("do_exec_no_pty: no session");
   
Line 404 
Line 416 
                 if (setsid() < 0)                  if (setsid() < 0)
                         error("setsid failed: %.100s", strerror(errno));                          error("setsid failed: %.100s", strerror(errno));
   
 #ifdef USE_PIPES  
                 /*                  /*
                  * Redirect stdin.  We close the parent side of the socket  
                  * pair, and make the child side the standard input.  
                  */  
                 close(pin[1]);  
                 if (dup2(pin[0], 0) < 0)  
                         perror("dup2 stdin");  
                 close(pin[0]);  
   
                 /* Redirect stdout. */  
                 close(pout[0]);  
                 if (dup2(pout[1], 1) < 0)  
                         perror("dup2 stdout");  
                 close(pout[1]);  
   
                 /* Redirect stderr. */  
                 close(perr[0]);  
                 if (dup2(perr[1], 2) < 0)  
                         perror("dup2 stderr");  
                 close(perr[1]);  
 #else /* USE_PIPES */  
                 /*  
                  * Redirect stdin, stdout, and stderr.  Stdin and stdout will                   * Redirect stdin, stdout, and stderr.  Stdin and stdout will
                  * use the same socket, as some programs (particularly rdist)                   * use the same socket, as some programs (particularly rdist)
                  * seem to depend on it.                   * seem to depend on it.
Line 439 
Line 429 
                         perror("dup2 stdout");                          perror("dup2 stdout");
                 if (dup2(err[0], 2) < 0)        /* stderr */                  if (dup2(err[0], 2) < 0)        /* stderr */
                         perror("dup2 stderr");                          perror("dup2 stderr");
 #endif /* USE_PIPES */  
   
                 /* Do processing for the child (exec command etc). */                  /* Do processing for the child (exec command etc). */
                 do_child(s, command);                  do_child(s, command);
Line 450 
Line 439 
         s->pid = pid;          s->pid = pid;
         /* Set interactive/non-interactive mode. */          /* Set interactive/non-interactive mode. */
         packet_set_interactive(s->display != NULL);          packet_set_interactive(s->display != NULL);
 #ifdef USE_PIPES  
         /* We are the parent.  Close the child sides of the pipes. */  
         close(pin[0]);  
         close(pout[1]);  
         close(perr[1]);  
   
         if (compat20) {  
                 if (s->is_subsystem) {  
                         close(perr[0]);  
                         perr[0] = -1;  
                 }  
                 session_set_fds(s, pin[1], pout[0], perr[0]);  
         } else {  
                 /* Enter the interactive session. */  
                 server_loop(pid, pin[1], pout[0], perr[0]);  
                 /* server_loop has closed pin[1], pout[0], and perr[0]. */  
         }  
 #else /* USE_PIPES */  
         /* We are the parent.  Close the child sides of the socket pairs. */          /* We are the parent.  Close the child sides of the socket pairs. */
         close(inout[0]);          close(inout[0]);
         close(err[0]);          close(err[0]);
Line 482 
Line 454 
                 server_loop(pid, inout[1], inout[1], err[1]);                  server_loop(pid, inout[1], inout[1], err[1]);
                 /* server_loop has closed inout[1] and err[1]. */                  /* server_loop has closed inout[1] and err[1]. */
         }          }
 #endif /* USE_PIPES */  
 }  }
   
 /*  /*
Line 572 
Line 543 
 void  void
 do_exec(Session *s, const char *command)  do_exec(Session *s, const char *command)
 {  {
         if (forced_command) {          if (options.adm_forced_command) {
                 original_command = command;                  original_command = command;
                   command = options.adm_forced_command;
                   debug("Forced command (config) '%.900s'", command);
           } else if (forced_command) {
                   original_command = command;
                 command = forced_command;                  command = forced_command;
                 debug("Forced command '%.900s'", command);                  debug("Forced command (key option) '%.900s'", command);
         }          }
   
 #ifdef GSSAPI  #ifdef GSSAPI
Line 619 
Line 594 
         fromlen = sizeof(from);          fromlen = sizeof(from);
         if (packet_connection_is_on_socket()) {          if (packet_connection_is_on_socket()) {
                 if (getpeername(packet_get_connection_in(),                  if (getpeername(packet_get_connection_in(),
                     (struct sockaddr *) & from, &fromlen) < 0) {                      (struct sockaddr *)&from, &fromlen) < 0) {
                         debug("getpeername: %.100s", strerror(errno));                          debug("getpeername: %.100s", strerror(errno));
                         cleanup_exit(255);                          cleanup_exit(255);
                 }                  }
Line 721 
Line 696 
                         if (envsize >= 1000)                          if (envsize >= 1000)
                                 fatal("child_set_env: too many env vars");                                  fatal("child_set_env: too many env vars");
                         envsize += 50;                          envsize += 50;
                         env = (*envp) = xrealloc(env, envsize * sizeof(char *));                          env = (*envp) = xrealloc(env, envsize, sizeof(char *));
                         *envsizep = envsize;                          *envsizep = envsize;
                 }                  }
                 /* Need to set the NULL pointer at end of array beyond the new slot. */                  /* Need to set the NULL pointer at end of array beyond the new slot. */
Line 1195 
Line 1170 
                 do_rc_files(s, shell);                  do_rc_files(s, shell);
   
         /* restore SIGPIPE for child */          /* restore SIGPIPE for child */
         signal(SIGPIPE,  SIG_DFL);          signal(SIGPIPE, SIG_DFL);
   
         if (options.use_login) {          if (options.use_login) {
                 launch_login(pw, hostname);                  launch_login(pw, hostname);
Line 1459 
Line 1434 
         struct stat st;          struct stat st;
         u_int len;          u_int len;
         int success = 0;          int success = 0;
         char *cmd, *subsys = packet_get_string(&len);          char *prog, *cmd, *subsys = packet_get_string(&len);
         u_int i;          u_int i;
   
         packet_check_eom();          packet_check_eom();
Line 1467 
Line 1442 
   
         for (i = 0; i < options.num_subsystems; i++) {          for (i = 0; i < options.num_subsystems; i++) {
                 if (strcmp(subsys, options.subsystem_name[i]) == 0) {                  if (strcmp(subsys, options.subsystem_name[i]) == 0) {
                         cmd = options.subsystem_command[i];                          prog = options.subsystem_command[i];
                         if (stat(cmd, &st) < 0) {                          cmd = options.subsystem_args[i];
                                 error("subsystem: cannot stat %s: %s", cmd,                          if (stat(prog, &st) < 0) {
                                   error("subsystem: cannot stat %s: %s", prog,
                                     strerror(errno));                                      strerror(errno));
                                 break;                                  break;
                         }                          }
Line 1566 
Line 1542 
         for (i = 0; i < options.num_accept_env; i++) {          for (i = 0; i < options.num_accept_env; i++) {
                 if (match_pattern(name, options.accept_env[i])) {                  if (match_pattern(name, options.accept_env[i])) {
                         debug2("Setting env %d: %s=%s", s->num_env, name, val);                          debug2("Setting env %d: %s=%s", s->num_env, name, val);
                         s->env = xrealloc(s->env, sizeof(*s->env) *                          s->env = xrealloc(s->env, s->num_env + 1,
                             (s->num_env + 1));                              sizeof(*s->env));
                         s->env[s->num_env].name = name;                          s->env[s->num_env].name = name;
                         s->env[s->num_env].val = val;                          s->env[s->num_env].val = val;
                         s->num_env++;                          s->num_env++;
Line 1808 
Line 1784 
   
         /* disconnect channel */          /* disconnect channel */
         debug("session_exit_message: release channel %d", s->chanid);          debug("session_exit_message: release channel %d", s->chanid);
         s->pid = 0;  
   
         /*          /*
          * Adjust cleanup callback attachment to send close messages when           * Adjust cleanup callback attachment to send close messages when
          * the channel gets EOF. The session will be then be closed           * the channel gets EOF. The session will be then be closed
          * by session_close_by_channel when the childs close their fds.           * by session_close_by_channel when the childs close their fds.
          */           */
         channel_register_cleanup(c->self, session_close_by_channel, 1);          channel_register_cleanup(c->self, session_close_by_channel, 1);
Line 1848 
Line 1823 
         if (s->auth_proto)          if (s->auth_proto)
                 xfree(s->auth_proto);                  xfree(s->auth_proto);
         s->used = 0;          s->used = 0;
         for (i = 0; i < s->num_env; i++) {          if (s->env != NULL) {
                 xfree(s->env[i].name);                  for (i = 0; i < s->num_env; i++) {
                 xfree(s->env[i].val);                          xfree(s->env[i].name);
         }                          xfree(s->env[i].val);
         if (s->env != NULL)                  }
                 xfree(s->env);                  xfree(s->env);
           }
         session_proctitle(s);          session_proctitle(s);
 }  }
   
Line 1870 
Line 1846 
                 session_exit_message(s, status);                  session_exit_message(s, status);
         if (s->ttyfd != -1)          if (s->ttyfd != -1)
                 session_pty_cleanup(s);                  session_pty_cleanup(s);
           s->pid = 0;
 }  }
   
 /*  /*
Line 2044 
Line 2021 
                 return;                  return;
         called = 1;          called = 1;
   
         if (authctxt == NULL)          if (authctxt == NULL || !authctxt->authenticated)
                 return;                  return;
 #ifdef KRB5  #ifdef KRB5
         if (options.kerberos_ticket_cleanup &&          if (options.kerberos_ticket_cleanup &&

Legend:
Removed from v.1.186.2.1  
changed lines
  Added in v.1.186.2.2