]> andersk Git - openssh.git/blobdiff - session.c
- stevesk@cvs.openbsd.org 2001/06/25 20:26:37
[openssh.git] / session.c
index 49db53d1d5121694df8d2e619417b58dbe0395b9..7d0e0723ce285be3026e1b742bf427131da0bb52 100644 (file)
--- a/session.c
+++ b/session.c
@@ -9,7 +9,7 @@
  * called by a name other than "ssh" or "Secure Shell".
  *
  * SSH2 support by Markus Friedl.
- * Copyright (c) 2000 Markus Friedl.  All rights reserved.
+ * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -33,7 +33,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: session.c,v 1.87 2001/06/12 21:21:29 markus Exp $");
+RCSID("$OpenBSD: session.c,v 1.95 2001/06/25 08:25:39 markus Exp $");
 
 #include "ssh.h"
 #include "ssh1.h"
@@ -120,24 +120,22 @@ struct Session {
 /* func */
 
 Session *session_new(void);
-void   session_set_fds(Session *s, int fdin, int fdout, int fderr);
-void   session_pty_cleanup(void *session);
-int    session_pty_req(Session *s);
-void   session_proctitle(Session *s);
-int    session_setup_x11fwd(Session *s);
-void   session_close(Session *s);
-void   do_exec_pty(Session *s, const char *command);
-void   do_exec_no_pty(Session *s, const char *command);
-void   do_login(Session *s, const char *command);
-#ifdef LOGIN_NEEDS_UTMPX
-void   do_pre_login(Session *s);
-#endif
-void   do_child(Session *s, const char *command);
+void  session_set_fds(Session *, int, int, int);
+static void   session_pty_cleanup(void *);
+void  session_proctitle(Session *);
+int   session_setup_x11fwd(Session *);
+void  do_exec_pty(Session *, const char *);
+void  do_exec_no_pty(Session *, const char *);
+void  do_exec(Session *, const char *);
+void  do_login(Session *, const char *);
+void  do_child(Session *, const char *);
 void   do_motd(void);
-int    check_quietlogin(Session *s, const char *command);
 
-void   do_authenticated1(Authctxt *authctxt);
-void   do_authenticated2(Authctxt *authctxt);
+static void do_authenticated1(Authctxt *);
+static void do_authenticated2(Authctxt *);
+static void session_close(Session *);
+static int session_pty_req(Session *);
 
 /* import */
 extern ServerOptions options;
@@ -149,7 +147,7 @@ extern int startup_pipe;
 extern void destroy_sensitive_data(void);
 
 /* original command from peer. */
-char *original_command = NULL;
+const char *original_command = NULL;
 
 /* data */
 #define MAX_SESSIONS 10
@@ -208,7 +206,7 @@ do_authenticated(Authctxt *authctxt)
  * terminals are allocated, X11, TCP/IP, and authentication agent forwardings
  * are requested, etc.
  */
-void
+static void
 do_authenticated1(Authctxt *authctxt)
 {
        Session *s;
@@ -308,22 +306,12 @@ do_authenticated1(Authctxt *authctxt)
                        if (type == SSH_CMSG_EXEC_CMD) {
                                command = packet_get_string(&dlen);
                                debug("Exec command '%.500s'", command);
-                               packet_integrity_check(plen, 4 + dlen, type);
+                               do_exec(s, command);
+                               xfree(command);
                        } else {
-                               command = NULL;
-                               packet_integrity_check(plen, 0, type);
+                               do_exec(s, NULL);
                        }
-                       if (forced_command != NULL) {
-                               original_command = command;
-                               command = forced_command;
-                               debug("Forced command '%.500s'", forced_command);
-                       }
-                       if (s->ttyfd != -1)
-                               do_exec_pty(s, command);
-                       else
-                               do_exec_no_pty(s, command);
-                       if (command != NULL)
-                               xfree(command);
+                       packet_done();
                        session_close(s);
                        return;
 
@@ -376,6 +364,7 @@ do_exec_no_pty(Session *s, const char *command)
        session_proctitle(s);
 
 #if defined(USE_PAM)
+       do_pam_session(s->pw->pw_name, NULL);
        do_pam_setcred(1);
 #endif /* USE_PAM */
 
@@ -598,6 +587,51 @@ do_pre_login(Session *s)
 }
 #endif
 
+/*
+ * This is called to fork and execute a command.  If another command is
+ * to be forced, execute that instead.
+ */
+void
+do_exec(Session *s, const char *command)
+{
+       if (forced_command) {
+               original_command = command;
+               command = forced_command;
+               debug("Forced command '%.900s'", command);
+       }
+
+       if (s->ttyfd != -1)
+               do_exec_pty(s, command);
+       else
+               do_exec_no_pty(s, command);
+
+       original_command = NULL;
+}
+
+/*
+ * Check for quiet login, either .hushlogin or command given.
+ */
+static int
+check_quietlogin(Session *s, const char *command)
+{
+       char buf[256];
+       struct passwd * pw = s->pw;
+       struct stat st;
+
+       /* Return 1 if .hushlogin exists or a command given. */
+       if (command != NULL)
+               return 1;
+       snprintf(buf, sizeof(buf), "%.200s/.hushlogin", pw->pw_dir);
+#ifdef HAVE_LOGIN_CAP
+       if (login_getcapbool(lc, "hushlogin", 0) || stat(buf, &st) >= 0)
+               return 1;
+#else
+       if (stat(buf, &st) >= 0)
+               return 1;
+#endif
+       return 0;
+}
+
 /* administrative, login(1)-like work */
 void
 do_login(Session *s, const char *command)
@@ -696,36 +730,11 @@ do_motd(void)
        }
 }
 
-
-/*
- * Check for quiet login, either .hushlogin or command given.
- */
-int
-check_quietlogin(Session *s, const char *command)
-{
-       char buf[256];
-       struct passwd * pw = s->pw;
-       struct stat st;
-
-       /* Return 1 if .hushlogin exists or a command given. */
-       if (command != NULL)
-               return 1;
-       snprintf(buf, sizeof(buf), "%.200s/.hushlogin", pw->pw_dir);
-#ifdef HAVE_LOGIN_CAP
-       if (login_getcapbool(lc, "hushlogin", 0) || stat(buf, &st) >= 0)
-               return 1;
-#else
-       if (stat(buf, &st) >= 0)
-               return 1;
-#endif
-       return 0;
-}
-
 /*
  * Sets the value of the given variable in the environment.  If the variable
  * already exists, its value is overriden.
  */
-void
+static void
 child_set_env(char ***envp, u_int *envsizep, const char *name,
              const char *value)
 {
@@ -766,7 +775,7 @@ child_set_env(char ***envp, u_int *envsizep, const char *name,
  * Otherwise, it must consist of empty lines, comments (line starts with '#')
  * and assignments of the form name=value.  No other forms are allowed.
  */
-void
+static void
 read_environment_file(char ***env, u_int *envsize,
                      const char *filename)
 {
@@ -805,7 +814,7 @@ read_environment_file(char ***env, u_int *envsize,
 /*
  * Sets any environment variables which have been specified by PAM
  */
-void do_pam_environment(char ***env, int *envsize)
+void do_pam_environment(char ***env, u_int *envsize)
 {
        char *equals, var_name[512], var_val[512];
        char **pam_env;
@@ -834,7 +843,7 @@ void do_pam_environment(char ***env, int *envsize)
 #endif /* USE_PAM */
 
 #ifdef HAVE_CYGWIN
-void copy_environment(char ***env, int *envsize)
+void copy_environment(char ***env, u_int *envsize)
 {
        char *equals, var_name[512], var_val[512];
        int i;
@@ -1475,7 +1484,7 @@ session_new(void)
        return NULL;
 }
 
-void
+static void
 session_dump(void)
 {
        int i;
@@ -1507,7 +1516,7 @@ session_open(int chanid)
        return 1;
 }
 
-Session *
+static Session *
 session_by_channel(int id)
 {
        int i;
@@ -1523,7 +1532,7 @@ session_by_channel(int id)
        return NULL;
 }
 
-Session *
+static Session *
 session_by_pid(pid_t pid)
 {
        int i;
@@ -1538,7 +1547,7 @@ session_by_pid(pid_t pid)
        return NULL;
 }
 
-int
+static int
 session_window_change_req(Session *s)
 {
        s->col = packet_get_int();
@@ -1550,7 +1559,7 @@ session_window_change_req(Session *s)
        return 1;
 }
 
-int
+static int
 session_pty_req(Session *s)
 {
        u_int len;
@@ -1615,7 +1624,7 @@ session_pty_req(Session *s)
        return 1;
 }
 
-int
+static int
 session_subsystem_req(Session *s)
 {
        u_int len;
@@ -1642,7 +1651,7 @@ session_subsystem_req(Session *s)
        return success;
 }
 
-int
+static int
 session_x11_req(Session *s)
 {
        int success;
@@ -1663,40 +1672,26 @@ session_x11_req(Session *s)
        return success;
 }
 
-int
+static int
 session_shell_req(Session *s)
 {
-       /* if forced_command == NULL, the shell is execed */
-       char *shell = forced_command;
        packet_done();
-       if (s->ttyfd == -1)
-               do_exec_no_pty(s, shell);
-       else
-               do_exec_pty(s, shell);
+       do_exec(s, NULL);
        return 1;
 }
 
-int
+static int
 session_exec_req(Session *s)
 {
        u_int len;
        char *command = packet_get_string(&len);
        packet_done();
-       if (forced_command) {
-               original_command = command;
-               command = forced_command;
-               debug("Forced command '%.500s'", forced_command);
-       }
-       if (s->ttyfd == -1)
-               do_exec_no_pty(s, command);
-       else
-               do_exec_pty(s, command);
-       if (forced_command == NULL)
-               xfree(command);
+       do_exec(s, command);
+       xfree(command);
        return 1;
 }
 
-int
+static int
 session_auth_agent_req(Session *s)
 {
        static int called = 0;
@@ -1789,7 +1784,7 @@ session_set_fds(Session *s, int fdin, int fdout, int fderr)
  * Function to perform pty cleanup. Also called if we get aborted abnormally
  * (e.g., due to a dropped connection).
  */
-void
+static void
 session_pty_cleanup(void *session)
 {
        Session *s = session;
@@ -1819,7 +1814,7 @@ session_pty_cleanup(void *session)
                error("close(s->ptymaster): %s", strerror(errno));
 }
 
-void
+static void
 session_exit_message(Session *s, int status)
 {
        Channel *c;
@@ -1868,7 +1863,7 @@ session_exit_message(Session *s, int status)
        s->chanid = -1;
 }
 
-void
+static void
 session_close(Session *s)
 {
        debug("session_close: session %d pid %d", s->self, s->pid);
@@ -1893,7 +1888,7 @@ session_close_by_pid(pid_t pid, int status)
 {
        Session *s = session_by_pid(pid);
        if (s == NULL) {
-               debug("session_close_by_pid: no session for pid %d", s->pid);
+               debug("session_close_by_pid: no session for pid %d", pid);
                return;
        }
        if (s->chanid != -1)
@@ -1929,7 +1924,7 @@ session_close_by_channel(int id, void *arg)
        }
 }
 
-char *
+static char *
 session_tty_list(void)
 {
        static char buf[1024];
@@ -1960,7 +1955,6 @@ session_proctitle(Session *s)
 int
 session_setup_x11fwd(Session *s)
 {
-       int fd;
        struct stat st;
 
        if (no_x11_forwarding_flag) {
@@ -1976,6 +1970,11 @@ session_setup_x11fwd(Session *s)
                packet_send_debug("No xauth program; cannot forward with spoofing.");
                return 0;
        }
+       if (options.use_login) {
+               packet_send_debug("X11 forwarding disabled; "
+                   "not compatible with UseLogin=yes.");
+               return 0;
+       }
        if (s->display != NULL) {
                debug("X11 display already set.");
                return 0;
@@ -1988,7 +1987,7 @@ session_setup_x11fwd(Session *s)
        return 1;
 }
 
-void
+static void
 do_authenticated2(Authctxt *authctxt)
 {
        server_loop2();
This page took 0.289714 seconds and 4 git commands to generate.