[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.42 and 1.42.2.2

version 1.42, 2000/10/27 07:32:18 version 1.42.2.2, 2001/02/19 17:19:21
Line 35 
Line 35 
 #include "includes.h"  #include "includes.h"
 RCSID("$OpenBSD$");  RCSID("$OpenBSD$");
   
 #include "xmalloc.h"  
 #include "ssh.h"  #include "ssh.h"
   #include "ssh1.h"
   #include "ssh2.h"
   #include "xmalloc.h"
 #include "pty.h"  #include "pty.h"
 #include "packet.h"  #include "packet.h"
 #include "buffer.h"  #include "buffer.h"
 #include "mpaux.h"  #include "mpaux.h"
 #include "servconf.h"  
 #include "uidswap.h"  #include "uidswap.h"
 #include "compat.h"  #include "compat.h"
 #include "channels.h"  #include "channels.h"
 #include "nchan.h"  #include "nchan.h"
   
 #include "bufaux.h"  #include "bufaux.h"
 #include "ssh2.h"  
 #include "auth.h"  #include "auth.h"
 #include "auth-options.h"  #include "auth-options.h"
   #include "pathnames.h"
   #include "log.h"
   #include "servconf.h"
   #include "login.h"
   #include "serverloop.h"
   #include "canohost.h"
   #include "session.h"
   
 #ifdef HAVE_LOGIN_CAP  #ifdef HAVE_LOGIN_CAP
 #include <login_cap.h>  #include <login_cap.h>
Line 101 
Line 107 
 extern char *__progname;  extern char *__progname;
 extern int log_stderr;  extern int log_stderr;
 extern int debug_flag;  extern int debug_flag;
 extern unsigned int utmp_len;  extern u_int utmp_len;
   
 extern int startup_pipe;  extern int startup_pipe;
   
Line 109 
Line 115 
 static char *xauthfile;  static char *xauthfile;
   
 /* original command from peer. */  /* original command from peer. */
 char *original_command = NULL;  char *original_command = NULL;
   
 /* data */  /* data */
 #define MAX_SESSIONS 10  #define MAX_SESSIONS 10
Line 177 
Line 183 
         char *command;          char *command;
         int n_bytes;          int n_bytes;
         int plen;          int plen;
         unsigned int proto_len, data_len, dlen;          u_int proto_len, data_len, dlen;
   
         /*          /*
          * Cancel the alarm we set to limit the time taken for           * Cancel the alarm we set to limit the time taken for
Line 301 
Line 307 
   
                         s->auth_proto = packet_get_string(&proto_len);                          s->auth_proto = packet_get_string(&proto_len);
                         s->auth_data = packet_get_string(&data_len);                          s->auth_data = packet_get_string(&data_len);
                         packet_integrity_check(plen, 4 + proto_len + 4 + data_len + 4, type);  
   
                         if (packet_get_protocol_flags() & SSH_PROTOFLAG_SCREEN_NUMBER)                          if (packet_get_protocol_flags() & SSH_PROTOFLAG_SCREEN_NUMBER) {
                                   debug2("SSH_PROTOFLAG_SCREEN_NUMBER == true");
                                   packet_integrity_check(plen,
                                       4 + proto_len + 4 + data_len + 4, type);
                                 s->screen = packet_get_int();                                  s->screen = packet_get_int();
                         else                          } else {
                                   debug2("SSH_PROTOFLAG_SCREEN_NUMBER == false");
                                   packet_integrity_check(plen,
                                       4 + proto_len + 4 + data_len, type);
                                 s->screen = 0;                                  s->screen = 0;
                           }
                         s->display = x11_create_display_inet(s->screen, options.x11_display_offset);                          s->display = x11_create_display_inet(s->screen, options.x11_display_offset);
   
                         if (s->display == NULL)                          if (s->display == NULL)
Line 364 
Line 376 
   
                 case SSH_CMSG_EXEC_SHELL:                  case SSH_CMSG_EXEC_SHELL:
                 case SSH_CMSG_EXEC_CMD:                  case SSH_CMSG_EXEC_CMD:
                         /* Set interactive/non-interactive mode. */  
                         packet_set_interactive(have_pty || s->display != NULL,  
                             options.keepalives);  
   
                         if (type == SSH_CMSG_EXEC_CMD) {                          if (type == SSH_CMSG_EXEC_CMD) {
                                 command = packet_get_string(&dlen);                                  command = packet_get_string(&dlen);
                                 debug("Exec command '%.500s'", command);                                  debug("Exec command '%.500s'", command);
Line 497 
Line 505 
         if (pid < 0)          if (pid < 0)
                 packet_disconnect("fork failed: %.100s", strerror(errno));                  packet_disconnect("fork failed: %.100s", strerror(errno));
         s->pid = pid;          s->pid = pid;
           /* Set interactive/non-interactive mode. */
           packet_set_interactive(s->display != NULL);
 #ifdef USE_PIPES  #ifdef USE_PIPES
         /* We are the parent.  Close the child sides of the pipes. */          /* We are the parent.  Close the child sides of the pipes. */
         close(pin[0]);          close(pin[0]);
Line 603 
Line 613 
         s->ptymaster = ptymaster;          s->ptymaster = ptymaster;
   
         /* Enter interactive session. */          /* Enter interactive session. */
           packet_set_interactive(1);
         if (compat20) {          if (compat20) {
                 session_set_fds(s, ptyfd, fdout, -1);                  session_set_fds(s, ptyfd, fdout, -1);
         } else {          } else {
Line 617 
Line 628 
 {  {
         static const char *remote = "";          static const char *remote = "";
         if (utmp_len > 0)          if (utmp_len > 0)
                 remote = get_canonical_hostname();                  remote = get_canonical_hostname(options.reverse_mapping_check);
         if (utmp_len == 0 || strlen(remote) > utmp_len)          if (utmp_len == 0 || strlen(remote) > utmp_len)
                 remote = get_remote_ipaddr();                  remote = get_remote_ipaddr();
         return remote;          return remote;
Line 700 
Line 711 
  * already exists, its value is overriden.   * already exists, its value is overriden.
  */   */
 void  void
 child_set_env(char ***envp, unsigned int *envsizep, const char *name,  child_set_env(char ***envp, u_int *envsizep, const char *name,
               const char *value)                const char *value)
 {  {
         unsigned int i, namelen;          u_int i, namelen;
         char **env;          char **env;
   
         /*          /*
Line 741 
Line 752 
  * and assignments of the form name=value.  No other forms are allowed.   * and assignments of the form name=value.  No other forms are allowed.
  */   */
 void  void
 read_environment_file(char ***env, unsigned int *envsize,  read_environment_file(char ***env, u_int *envsize,
                       const char *filename)                        const char *filename)
 {  {
         FILE *f;          FILE *f;
Line 789 
Line 800 
         char buf[256];          char buf[256];
         char cmd[1024];          char cmd[1024];
         FILE *f = NULL;          FILE *f = NULL;
         unsigned int envsize, i;          u_int envsize, i;
         char **env;          char **env;
         extern char **environ;          extern char **environ;
         struct stat st;          struct stat st;
Line 826 
Line 837 
                             (LOGIN_SETALL & ~LOGIN_SETPATH)) < 0) {                              (LOGIN_SETALL & ~LOGIN_SETPATH)) < 0) {
                                 perror("unable to set user context");                                  perror("unable to set user context");
                                 exit(1);                                  exit(1);
   
                         }                          }
 #else  #else
                         if (setlogin(pw->pw_name) < 0)                          if (setlogin(pw->pw_name) < 0)
Line 1012 
Line 1023 
          * in this order).           * in this order).
          */           */
         if (!options.use_login) {          if (!options.use_login) {
                 if (stat(SSH_USER_RC, &st) >= 0) {                  if (stat(_PATH_SSH_USER_RC, &st) >= 0) {
                         if (debug_flag)                          if (debug_flag)
                                 fprintf(stderr, "Running /bin/sh %s\n", SSH_USER_RC);                                  fprintf(stderr, "Running %s %s\n", _PATH_BSHELL, _PATH_SSH_USER_RC);
   
                         f = popen("/bin/sh " SSH_USER_RC, "w");                          f = popen(_PATH_BSHELL " " _PATH_SSH_USER_RC, "w");
                         if (f) {                          if (f) {
                                 if (auth_proto != NULL && auth_data != NULL)                                  if (auth_proto != NULL && auth_data != NULL)
                                         fprintf(f, "%s %s\n", auth_proto, auth_data);                                          fprintf(f, "%s %s\n", auth_proto, auth_data);
                                 pclose(f);                                  pclose(f);
                         } else                          } else
                                 fprintf(stderr, "Could not run %s\n", SSH_USER_RC);                                  fprintf(stderr, "Could not run %s\n", _PATH_SSH_USER_RC);
                 } else if (stat(SSH_SYSTEM_RC, &st) >= 0) {                  } else if (stat(_PATH_SSH_SYSTEM_RC, &st) >= 0) {
                         if (debug_flag)                          if (debug_flag)
                                 fprintf(stderr, "Running /bin/sh %s\n", SSH_SYSTEM_RC);                                  fprintf(stderr, "Running %s %s\n", _PATH_BSHELL, _PATH_SSH_SYSTEM_RC);
   
                         f = popen("/bin/sh " SSH_SYSTEM_RC, "w");                          f = popen(_PATH_BSHELL " " _PATH_SSH_SYSTEM_RC, "w");
                         if (f) {                          if (f) {
                                 if (auth_proto != NULL && auth_data != NULL)                                  if (auth_proto != NULL && auth_data != NULL)
                                         fprintf(f, "%s %s\n", auth_proto, auth_data);                                          fprintf(f, "%s %s\n", auth_proto, auth_data);
                                 pclose(f);                                  pclose(f);
                         } else                          } else
                                 fprintf(stderr, "Could not run %s\n", SSH_SYSTEM_RC);                                  fprintf(stderr, "Could not run %s\n", _PATH_SSH_SYSTEM_RC);
                 } else if (options.xauth_location != NULL) {                  } else if (options.xauth_location != NULL) {
                         /* Add authority data to .Xauthority if appropriate. */                          /* Add authority data to .Xauthority if appropriate. */
                         if (auth_proto != NULL && auth_data != NULL) {                          if (auth_proto != NULL && auth_data != NULL) {
Line 1055 
Line 1066 
                                 if (f) {                                  if (f) {
                                         fprintf(f, "add %s %s %s\n", display,                                          fprintf(f, "add %s %s %s\n", display,
                                             auth_proto, auth_data);                                              auth_proto, auth_data);
                                         if (screen != NULL)                                          if (screen != NULL)
                                                 fprintf(f, "add %.*s/unix%s %s %s\n",                                                  fprintf(f, "add %.*s/unix%s %s %s\n",
                                                     (int)(screen-display), display,                                                      (int)(screen-display), display,
                                                     screen, auth_proto, auth_data);                                                      screen, auth_proto, auth_data);
Line 1201 
Line 1212 
         }          }
         s->pw = auth_get_user();          s->pw = auth_get_user();
         if (s->pw == NULL)          if (s->pw == NULL)
                 fatal("no user for session %i", s->self);                  fatal("no user for session %d", s->self);
         debug("session_open: session %d: link with channel %d", s->self, chanid);          debug("session_open: session %d: link with channel %d", s->self, chanid);
         s->chanid = chanid;          s->chanid = chanid;
         return 1;          return 1;
Line 1253 
Line 1264 
 int  int
 session_pty_req(Session *s)  session_pty_req(Session *s)
 {  {
         unsigned int len;          u_int len;
         char *term_modes;       /* encoded terminal modes */          char *term_modes;       /* encoded terminal modes */
   
         if (no_pty_flag)          if (no_pty_flag)
Line 1302 
Line 1313 
 int  int
 session_subsystem_req(Session *s)  session_subsystem_req(Session *s)
 {  {
         unsigned int len;          u_int len;
         int success = 0;          int success = 0;
         char *subsys = packet_get_string(&len);          char *subsys = packet_get_string(&len);
         int i;          int i;
Line 1398 
Line 1409 
 int  int
 session_exec_req(Session *s)  session_exec_req(Session *s)
 {  {
         unsigned int len;          u_int len;
         char *command = packet_get_string(&len);          char *command = packet_get_string(&len);
         packet_done();          packet_done();
         if (forced_command) {          if (forced_command) {
Line 1416 
Line 1427 
         return 1;          return 1;
 }  }
   
   int
   session_auth_agent_req(Session *s)
   {
           static int called = 0;
           packet_done();
           if (no_agent_forwarding_flag) {
                   debug("session_auth_agent_req: no_agent_forwarding_flag");
                   return 0;
           }
           if (called) {
                   return 0;
           } else {
                   called = 1;
                   return auth_input_request_forwarding(s->pw);
           }
   }
   
 void  void
 session_input_channel_req(int id, void *arg)  session_input_channel_req(int id, void *arg)
 {  {
         unsigned int len;          u_int len;
         int reply;          int reply;
         int success = 0;          int success = 0;
         char *rtype;          char *rtype;
Line 1452 
Line 1480 
                         success =  session_pty_req(s);                          success =  session_pty_req(s);
                 } else if (strcmp(rtype, "x11-req") == 0) {                  } else if (strcmp(rtype, "x11-req") == 0) {
                         success = session_x11_req(s);                          success = session_x11_req(s);
                   } else if (strcmp(rtype, "auth-agent-req@openssh.com") == 0) {
                           success = session_auth_agent_req(s);
                 } else if (strcmp(rtype, "subsystem") == 0) {                  } else if (strcmp(rtype, "subsystem") == 0) {
                         success = session_subsystem_req(s);                          success = session_subsystem_req(s);
                 }                  }
Line 1492 
Line 1522 
         if (s == NULL || s->ttyfd == -1)          if (s == NULL || s->ttyfd == -1)
                 return;                  return;
   
         debug("session_pty_cleanup: session %i release %s", s->self, s->tty);          debug("session_pty_cleanup: session %d release %s", s->self, s->tty);
   
         /* Cancel the cleanup function. */          /* Cancel the cleanup function. */
         fatal_remove_cleanup(pty_cleanup_proc, (void *)s);          fatal_remove_cleanup(pty_cleanup_proc, (void *)s);
Line 1650 
Line 1680 
 }  }
   
 void  void
 do_authenticated2(void)  do_authenticated2(Authctxt *authctxt)
 {  {
         struct passwd *pw;  
   
         /*          /*
          * Cancel the alarm we set to limit the time taken for           * Cancel the alarm we set to limit the time taken for
          * authentication.           * authentication.
Line 1664 
Line 1692 
                 startup_pipe = -1;                  startup_pipe = -1;
         }          }
 #ifdef HAVE_LOGIN_CAP  #ifdef HAVE_LOGIN_CAP
         pw = auth_get_user();          if ((lc = login_getclass(authctxt->pw->pw_class)) == NULL) {
         if ((lc = login_getclass(pw->pw_class)) == NULL) {  
                 error("unable to get login class");                  error("unable to get login class");
                 return;                  return;
         }          }

Legend:
Removed from v.1.42  
changed lines
  Added in v.1.42.2.2