]> andersk Git - openssh.git/blobdiff - session.c
- stevesk@cvs.openbsd.org 2006/07/06 17:36:37
[openssh.git] / session.c
index 7863aa15fd3455fbaa4604a956bc365f47d8e1cc..9115c5aa1553d6af240f021d370d60827211a785 100644 (file)
--- a/session.c
+++ b/session.c
@@ -1,3 +1,4 @@
+/* $OpenBSD: session.c,v 1.206 2006/07/06 16:03:53 stevesk Exp $ */
 /*
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
  *                    All rights reserved
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: session.c,v 1.188 2005/10/30 08:52:17 djm Exp $");
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#include <sys/wait.h>
+#include <sys/un.h>
+
+#include <grp.h>
+#ifdef HAVE_PATHS_H
+#include <paths.h>
+#endif
+#include <pwd.h>
+#include <signal.h>
+#include <arpa/inet.h>
 
 #include "ssh.h"
 #include "ssh1.h"
@@ -175,7 +190,7 @@ auth_input_request_forwarding(struct passwd * pw)
        sunaddr.sun_family = AF_UNIX;
        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));
 
        /* Restore the privileged uid. */
@@ -209,15 +224,6 @@ do_authenticated(Authctxt *authctxt)
 {
        setproctitle("%s", authctxt->pw->pw_name);
 
-       /*
-        * Cancel the alarm we set to limit the time taken for
-        * authentication.
-        */
-       alarm(0);
-       if (startup_pipe != -1) {
-               close(startup_pipe);
-               startup_pipe = -1;
-       }
        /* setup the channel layer */
        if (!no_port_forwarding_flag && options.allow_tcp_forwarding)
                channel_permit_all_opens();
@@ -641,7 +647,7 @@ do_pre_login(Session *s)
        fromlen = sizeof(from);
        if (packet_connection_is_on_socket()) {
                if (getpeername(packet_get_connection_in(),
-                   (struct sockaddr *) & from, &fromlen) < 0) {
+                   (struct sockaddr *)&from, &fromlen) < 0) {
                        debug("getpeername: %.100s", strerror(errno));
                        cleanup_exit(255);
                }
@@ -835,7 +841,7 @@ child_set_env(char ***envp, u_int *envsizep, const char *name,
                        if (envsize >= 1000)
                                fatal("child_set_env: too many env vars");
                        envsize += 50;
-                       env = (*envp) = xrealloc(env, envsize * sizeof(char *));
+                       env = (*envp) = xrealloc(env, envsize, sizeof(char *));
                        *envsizep = envsize;
                }
                /* Need to set the NULL pointer at end of array beyond the new slot. */
@@ -981,7 +987,7 @@ do_setup_env(Session *s, const char *shell)
 
        /* Initialize the environment. */
        envsize = 100;
-       env = xmalloc(envsize * sizeof(char *));
+       env = xcalloc(envsize, sizeof(char *));
        env[0] = NULL;
 
 #ifdef HAVE_CYGWIN
@@ -1349,6 +1355,10 @@ do_setusercontext(struct passwd *pw)
 #endif
        if (getuid() != pw->pw_uid || geteuid() != pw->pw_uid)
                fatal("Failed to set uids to %u.", (u_int) pw->pw_uid);
+
+#ifdef WITH_SELINUX
+       ssh_selinux_setup_exec_context(pw->pw_name);
+#endif
 }
 
 static void
@@ -1832,7 +1842,7 @@ session_subsystem_req(Session *s)
        struct stat st;
        u_int len;
        int success = 0;
-       char *cmd, *subsys = packet_get_string(&len);
+       char *prog, *cmd, *subsys = packet_get_string(&len);
        u_int i;
 
        packet_check_eom();
@@ -1840,9 +1850,10 @@ session_subsystem_req(Session *s)
 
        for (i = 0; i < options.num_subsystems; i++) {
                if (strcmp(subsys, options.subsystem_name[i]) == 0) {
-                       cmd = options.subsystem_command[i];
-                       if (stat(cmd, &st) < 0) {
-                               error("subsystem: cannot stat %s: %s", cmd,
+                       prog = options.subsystem_command[i];
+                       cmd = options.subsystem_args[i];
+                       if (stat(prog, &st) < 0) {
+                               error("subsystem: cannot stat %s: %s", prog,
                                    strerror(errno));
                                break;
                        }
@@ -1869,7 +1880,7 @@ session_x11_req(Session *s)
 
        if (s->auth_proto != NULL || s->auth_data != NULL) {
                error("session_x11_req: session %d: "
-                   "x11 fowarding already active", s->self);
+                   "x11 forwarding already active", s->self);
                return 0;
        }
        s->single_connection = packet_get_char();
@@ -1939,8 +1950,8 @@ session_env_req(Session *s)
        for (i = 0; i < options.num_accept_env; i++) {
                if (match_pattern(name, options.accept_env[i])) {
                        debug2("Setting env %d: %s=%s", s->num_env, name, val);
-                       s->env = xrealloc(s->env, sizeof(*s->env) *
-                           (s->num_env + 1));
+                       s->env = xrealloc(s->env, s->num_env + 1,
+                           sizeof(*s->env));
                        s->env[s->num_env].name = name;
                        s->env[s->num_env].val = val;
                        s->num_env++;
@@ -2101,7 +2112,7 @@ session_close_x11(int id)
 {
        Channel *c;
 
-       if ((c = channel_lookup(id)) == NULL) {
+       if ((c = channel_by_id(id)) == NULL) {
                debug("session_close_x11: x11 channel %d missing", id);
        } else {
                /* Detach X11 listener */
@@ -2185,11 +2196,10 @@ session_exit_message(Session *s, int status)
 
        /* disconnect channel */
        debug("session_exit_message: release channel %d", s->chanid);
-       s->pid = 0;
 
        /*
         * 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.
         */
        channel_register_cleanup(c->self, session_close_by_channel, 1);
@@ -2247,6 +2257,7 @@ session_close_by_pid(pid_t pid, int status)
                session_exit_message(s, status);
        if (s->ttyfd != -1)
                session_pty_cleanup(s);
+       s->pid = 0;
 }
 
 /*
This page took 0.041774 seconds and 4 git commands to generate.