summaryrefslogtreecommitdiff
path: root/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'session.c')
-rw-r--r--session.c52
1 files changed, 51 insertions, 1 deletions
diff --git a/session.c b/session.c
index 55db2ffd2..da11e5549 100644
--- a/session.c
+++ b/session.c
@@ -33,7 +33,7 @@
33 */ 33 */
34 34
35#include "includes.h" 35#include "includes.h"
36RCSID("$OpenBSD: session.c,v 1.172 2004/01/30 09:48:57 markus Exp $"); 36RCSID("$OpenBSD: session.c,v 1.173 2004/04/27 09:46:37 djm Exp $");
37 37
38#include "ssh.h" 38#include "ssh.h"
39#include "ssh1.h" 39#include "ssh1.h"
@@ -42,6 +42,7 @@ RCSID("$OpenBSD: session.c,v 1.172 2004/01/30 09:48:57 markus Exp $");
42#include "sshpty.h" 42#include "sshpty.h"
43#include "packet.h" 43#include "packet.h"
44#include "buffer.h" 44#include "buffer.h"
45#include "match.h"
45#include "mpaux.h" 46#include "mpaux.h"
46#include "uidswap.h" 47#include "uidswap.h"
47#include "compat.h" 48#include "compat.h"
@@ -996,6 +997,10 @@ do_setup_env(Session *s, const char *shell)
996 997
997 if (!options.use_login) { 998 if (!options.use_login) {
998 /* Set basic environment. */ 999 /* Set basic environment. */
1000 for (i = 0; i < s->num_env; i++)
1001 child_set_env(&env, &envsize, s->env[i].name,
1002 s->env[i].val);
1003
999 child_set_env(&env, &envsize, "USER", pw->pw_name); 1004 child_set_env(&env, &envsize, "USER", pw->pw_name);
1000 child_set_env(&env, &envsize, "LOGNAME", pw->pw_name); 1005 child_set_env(&env, &envsize, "LOGNAME", pw->pw_name);
1001#ifdef _AIX 1006#ifdef _AIX
@@ -1832,6 +1837,41 @@ session_break_req(Session *s)
1832} 1837}
1833 1838
1834static int 1839static int
1840session_env_req(Session *s)
1841{
1842 char *name, *val;
1843 u_int name_len, val_len, i;
1844
1845 name = packet_get_string(&name_len);
1846 val = packet_get_string(&val_len);
1847 packet_check_eom();
1848
1849 /* Don't set too many environment variables */
1850 if (s->num_env > 128) {
1851 debug2("Ignoring env request %s: too many env vars", name);
1852 goto fail;
1853 }
1854
1855 for (i = 0; i < options.num_accept_env; i++) {
1856 if (match_pattern(name, options.accept_env[i])) {
1857 debug2("Setting env %d: %s=%s", s->num_env, name, val);
1858 s->env = xrealloc(s->env, sizeof(*s->env) *
1859 (s->num_env + 1));
1860 s->env[s->num_env].name = name;
1861 s->env[s->num_env].val = val;
1862 s->num_env++;
1863 return (1);
1864 }
1865 }
1866 debug2("Ignoring env request %s: disallowed name", name);
1867
1868 fail:
1869 xfree(name);
1870 xfree(val);
1871 return (0);
1872}
1873
1874static int
1835session_auth_agent_req(Session *s) 1875session_auth_agent_req(Session *s)
1836{ 1876{
1837 static int called = 0; 1877 static int called = 0;
@@ -1880,6 +1920,8 @@ session_input_channel_req(Channel *c, const char *rtype)
1880 success = session_subsystem_req(s); 1920 success = session_subsystem_req(s);
1881 } else if (strcmp(rtype, "break") == 0) { 1921 } else if (strcmp(rtype, "break") == 0) {
1882 success = session_break_req(s); 1922 success = session_break_req(s);
1923 } else if (strcmp(rtype, "env") == 0) {
1924 success = session_env_req(s);
1883 } 1925 }
1884 } 1926 }
1885 if (strcmp(rtype, "window-change") == 0) { 1927 if (strcmp(rtype, "window-change") == 0) {
@@ -2017,6 +2059,8 @@ session_exit_message(Session *s, int status)
2017void 2059void
2018session_close(Session *s) 2060session_close(Session *s)
2019{ 2061{
2062 int i;
2063
2020 debug("session_close: session %d pid %ld", s->self, (long)s->pid); 2064 debug("session_close: session %d pid %ld", s->self, (long)s->pid);
2021 if (s->ttyfd != -1) 2065 if (s->ttyfd != -1)
2022 session_pty_cleanup(s); 2066 session_pty_cleanup(s);
@@ -2031,6 +2075,12 @@ session_close(Session *s)
2031 if (s->auth_proto) 2075 if (s->auth_proto)
2032 xfree(s->auth_proto); 2076 xfree(s->auth_proto);
2033 s->used = 0; 2077 s->used = 0;
2078 for (i = 0; i < s->num_env; i++) {
2079 xfree(s->env[i].name);
2080 xfree(s->env[i].val);
2081 }
2082 if (s->env != NULL)
2083 xfree(s->env);
2034 session_proctitle(s); 2084 session_proctitle(s);
2035} 2085}
2036 2086