summaryrefslogtreecommitdiffstats
path: root/crypto/openssh/session.c
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2004-10-28 16:11:31 +0000
committerdes <des@FreeBSD.org>2004-10-28 16:11:31 +0000
commita744ec13ade7d70128cd82393862d02c1f712f6a (patch)
tree2b93d7eeb78a97c2cc9e93d61346f39150ed165f /crypto/openssh/session.c
parentca12ec184bb7b4d1d0ff5dc213f5da06de091b8c (diff)
downloadFreeBSD-src-a744ec13ade7d70128cd82393862d02c1f712f6a.zip
FreeBSD-src-a744ec13ade7d70128cd82393862d02c1f712f6a.tar.gz
Resolve conflicts
Diffstat (limited to 'crypto/openssh/session.c')
-rw-r--r--crypto/openssh/session.c118
1 files changed, 82 insertions, 36 deletions
diff --git a/crypto/openssh/session.c b/crypto/openssh/session.c
index 3f9049f..cbc8db1 100644
--- a/crypto/openssh/session.c
+++ b/crypto/openssh/session.c
@@ -33,7 +33,7 @@
*/
#include "includes.h"
-RCSID("$OpenBSD: session.c,v 1.172 2004/01/30 09:48:57 markus Exp $");
+RCSID("$OpenBSD: session.c,v 1.180 2004/07/28 09:40:29 markus Exp $");
RCSID("$FreeBSD$");
#include "ssh.h"
@@ -43,7 +43,7 @@ RCSID("$FreeBSD$");
#include "sshpty.h"
#include "packet.h"
#include "buffer.h"
-#include "mpaux.h"
+#include "match.h"
#include "uidswap.h"
#include "compat.h"
#include "channels.h"
@@ -197,12 +197,11 @@ auth_input_request_forwarding(struct passwd * pw)
static void
display_loginmsg(void)
{
- if (buffer_len(&loginmsg) > 0) {
- buffer_append(&loginmsg, "\0", 1);
- printf("%s\n", (char *)buffer_ptr(&loginmsg));
- buffer_clear(&loginmsg);
- }
- fflush(stdout);
+ if (buffer_len(&loginmsg) > 0) {
+ buffer_append(&loginmsg, "\0", 1);
+ printf("%s", (char *)buffer_ptr(&loginmsg));
+ buffer_clear(&loginmsg);
+ }
}
void
@@ -266,7 +265,7 @@ do_authenticated1(Authctxt *authctxt)
compression_level = packet_get_int();
packet_check_eom();
if (compression_level < 1 || compression_level > 9) {
- packet_send_debug("Received illegal compression level %d.",
+ packet_send_debug("Received invalid compression level %d.",
compression_level);
break;
}
@@ -482,7 +481,11 @@ do_exec_no_pty(Session *s, const char *command)
close(perr[1]);
if (compat20) {
- session_set_fds(s, pin[1], pout[0], s->is_subsystem ? -1 : perr[0]);
+ 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]);
@@ -673,14 +676,19 @@ do_exec(Session *s, const char *command)
do_exec_no_pty(s, command);
original_command = NULL;
-}
+ /*
+ * Clear loginmsg: it's the child's responsibility to display
+ * it to the user, otherwise multiple sessions may accumulate
+ * multiple copies of the login messages.
+ */
+ buffer_clear(&loginmsg);
+}
/* administrative, login(1)-like work */
void
do_login(Session *s, const char *command)
{
- char *time_string;
socklen_t fromlen;
struct sockaddr_storage from;
struct passwd * pw = s->pw;
@@ -725,19 +733,6 @@ do_login(Session *s, const char *command)
display_loginmsg();
-#ifndef NO_SSH_LASTLOG
- if (options.print_lastlog && s->last_login_time != 0) {
- time_string = ctime(&s->last_login_time);
- if (strchr(time_string, '\n'))
- *strchr(time_string, '\n') = 0;
- if (strcmp(s->hostname, "") == 0)
- printf("Last login: %s\r\n", time_string);
- else
- printf("Last login: %s from %s\r\n", time_string,
- s->hostname);
- }
-#endif /* NO_SSH_LASTLOG */
-
do_motd();
}
@@ -1022,6 +1017,10 @@ do_setup_env(Session *s, const char *shell)
if (!options.use_login) {
/* Set basic environment. */
+ for (i = 0; i < s->num_env; i++)
+ child_set_env(&env, &envsize, s->env[i].name,
+ s->env[i].val);
+
child_set_env(&env, &envsize, "USER", pw->pw_name);
child_set_env(&env, &envsize, "LOGNAME", pw->pw_name);
#ifdef _AIX
@@ -1341,9 +1340,10 @@ do_setusercontext(struct passwd *pw)
static void
do_pwchange(Session *s)
{
+ fflush(NULL);
fprintf(stderr, "WARNING: Your password has expired.\n");
if (s->ttyfd != -1) {
- fprintf(stderr,
+ fprintf(stderr,
"You must change your password now and login again!\n");
execl(_PATH_PASSWD_PROG, "passwd", (char *)NULL);
perror("passwd");
@@ -1457,6 +1457,13 @@ do_child(Session *s, const char *command)
#else /* HAVE_OSF_SIA */
do_nologin(pw);
do_setusercontext(pw);
+ /*
+ * PAM session modules in do_setusercontext may have
+ * generated messages, so if this in an interactive
+ * login then display them too.
+ */
+ if (command == NULL)
+ display_loginmsg();
#endif /* HAVE_OSF_SIA */
}
@@ -1726,12 +1733,6 @@ session_pty_req(Session *s)
packet_disconnect("Protocol error: you already have a pty.");
return 0;
}
- /* Get the time and hostname when the user last logged in. */
- if (options.print_lastlog) {
- s->hostname[0] = '\0';
- s->last_login_time = get_last_login_time(s->pw->pw_uid,
- s->pw->pw_name, s->hostname, sizeof(s->hostname));
- }
s->term = packet_get_string(&len);
@@ -1858,9 +1859,8 @@ session_exec_req(Session *s)
static int
session_break_req(Session *s)
{
- u_int break_length;
- break_length = packet_get_int(); /* ignored */
+ packet_get_int(); /* ignored */
packet_check_eom();
if (s->ttyfd == -1 ||
@@ -1870,6 +1870,41 @@ session_break_req(Session *s)
}
static int
+session_env_req(Session *s)
+{
+ char *name, *val;
+ u_int name_len, val_len, i;
+
+ name = packet_get_string(&name_len);
+ val = packet_get_string(&val_len);
+ packet_check_eom();
+
+ /* Don't set too many environment variables */
+ if (s->num_env > 128) {
+ debug2("Ignoring env request %s: too many env vars", name);
+ goto fail;
+ }
+
+ 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[s->num_env].name = name;
+ s->env[s->num_env].val = val;
+ s->num_env++;
+ return (1);
+ }
+ }
+ debug2("Ignoring env request %s: disallowed name", name);
+
+ fail:
+ xfree(name);
+ xfree(val);
+ return (0);
+}
+
+static int
session_auth_agent_req(Session *s)
{
static int called = 0;
@@ -1916,13 +1951,16 @@ session_input_channel_req(Channel *c, const char *rtype)
success = session_auth_agent_req(s);
} else if (strcmp(rtype, "subsystem") == 0) {
success = session_subsystem_req(s);
- } else if (strcmp(rtype, "break") == 0) {
- success = session_break_req(s);
+ } else if (strcmp(rtype, "env") == 0) {
+ success = session_env_req(s);
}
}
if (strcmp(rtype, "window-change") == 0) {
success = session_window_change_req(s);
+ } else if (strcmp(rtype, "break") == 0) {
+ success = session_break_req(s);
}
+
return success;
}
@@ -2055,6 +2093,8 @@ session_exit_message(Session *s, int status)
void
session_close(Session *s)
{
+ int i;
+
debug("session_close: session %d pid %ld", s->self, (long)s->pid);
if (s->ttyfd != -1)
session_pty_cleanup(s);
@@ -2069,6 +2109,12 @@ session_close(Session *s)
if (s->auth_proto)
xfree(s->auth_proto);
s->used = 0;
+ for (i = 0; i < s->num_env; i++) {
+ xfree(s->env[i].name);
+ xfree(s->env[i].val);
+ }
+ if (s->env != NULL)
+ xfree(s->env);
session_proctitle(s);
}
OpenPOWER on IntegriCloud