diff options
Diffstat (limited to 'session.c')
-rw-r--r-- | session.c | 52 |
1 files changed, 51 insertions, 1 deletions
@@ -33,7 +33,7 @@ | |||
33 | */ | 33 | */ |
34 | 34 | ||
35 | #include "includes.h" | 35 | #include "includes.h" |
36 | RCSID("$OpenBSD: session.c,v 1.172 2004/01/30 09:48:57 markus Exp $"); | 36 | RCSID("$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 | ||
1834 | static int | 1839 | static int |
1840 | session_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 | |||
1874 | static int | ||
1835 | session_auth_agent_req(Session *s) | 1875 | session_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) | |||
2017 | void | 2059 | void |
2018 | session_close(Session *s) | 2060 | session_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 | ||