summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--auth.h1
-rw-r--r--auth1.c8
-rw-r--r--auth2.c10
-rw-r--r--monitor.c32
-rw-r--r--monitor.h2
-rw-r--r--monitor_wrap.c22
-rw-r--r--monitor_wrap.h3
-rw-r--r--openbsd-compat/port-linux.c27
-rw-r--r--openbsd-compat/port-linux.h4
-rw-r--r--platform.c4
-rw-r--r--platform.h2
-rw-r--r--session.c10
-rw-r--r--session.h2
-rw-r--r--sshd.c2
-rw-r--r--sshpty.c4
-rw-r--r--sshpty.h2
16 files changed, 104 insertions, 31 deletions
diff --git a/auth.h b/auth.h
index 124e59743..79e4ea53a 100644
--- a/auth.h
+++ b/auth.h
@@ -59,6 +59,7 @@ struct Authctxt {
59 char *service; 59 char *service;
60 struct passwd *pw; /* set if 'valid' */ 60 struct passwd *pw; /* set if 'valid' */
61 char *style; 61 char *style;
62 char *role;
62 void *kbdintctxt; 63 void *kbdintctxt;
63 char *info; /* Extra info for next auth_log */ 64 char *info; /* Extra info for next auth_log */
64#ifdef BSD_AUTH 65#ifdef BSD_AUTH
diff --git a/auth1.c b/auth1.c
index 0f870b3b6..c70739080 100644
--- a/auth1.c
+++ b/auth1.c
@@ -380,7 +380,7 @@ void
380do_authentication(Authctxt *authctxt) 380do_authentication(Authctxt *authctxt)
381{ 381{
382 u_int ulen; 382 u_int ulen;
383 char *user, *style = NULL; 383 char *user, *style = NULL, *role = NULL;
384 384
385 /* Get the name of the user that we wish to log in as. */ 385 /* Get the name of the user that we wish to log in as. */
386 packet_read_expect(SSH_CMSG_USER); 386 packet_read_expect(SSH_CMSG_USER);
@@ -389,11 +389,17 @@ do_authentication(Authctxt *authctxt)
389 user = packet_get_cstring(&ulen); 389 user = packet_get_cstring(&ulen);
390 packet_check_eom(); 390 packet_check_eom();
391 391
392 if ((role = strchr(user, '/')) != NULL)
393 *role++ = '\0';
394
392 if ((style = strchr(user, ':')) != NULL) 395 if ((style = strchr(user, ':')) != NULL)
393 *style++ = '\0'; 396 *style++ = '\0';
397 else if (role && (style = strchr(role, ':')) != NULL)
398 *style++ = '\0';
394 399
395 authctxt->user = user; 400 authctxt->user = user;
396 authctxt->style = style; 401 authctxt->style = style;
402 authctxt->role = role;
397 403
398 /* Verify that the user is a valid user. */ 404 /* Verify that the user is a valid user. */
399 if ((authctxt->pw = PRIVSEP(getpwnamallow(user))) != NULL) 405 if ((authctxt->pw = PRIVSEP(getpwnamallow(user))) != NULL)
diff --git a/auth2.c b/auth2.c
index fbe3e1bac..70f29250d 100644
--- a/auth2.c
+++ b/auth2.c
@@ -216,7 +216,7 @@ input_userauth_request(int type, u_int32_t seq, void *ctxt)
216{ 216{
217 Authctxt *authctxt = ctxt; 217 Authctxt *authctxt = ctxt;
218 Authmethod *m = NULL; 218 Authmethod *m = NULL;
219 char *user, *service, *method, *style = NULL; 219 char *user, *service, *method, *style = NULL, *role = NULL;
220 int authenticated = 0; 220 int authenticated = 0;
221 221
222 if (authctxt == NULL) 222 if (authctxt == NULL)
@@ -228,8 +228,13 @@ input_userauth_request(int type, u_int32_t seq, void *ctxt)
228 debug("userauth-request for user %s service %s method %s", user, service, method); 228 debug("userauth-request for user %s service %s method %s", user, service, method);
229 debug("attempt %d failures %d", authctxt->attempt, authctxt->failures); 229 debug("attempt %d failures %d", authctxt->attempt, authctxt->failures);
230 230
231 if ((role = strchr(user, '/')) != NULL)
232 *role++ = 0;
233
231 if ((style = strchr(user, ':')) != NULL) 234 if ((style = strchr(user, ':')) != NULL)
232 *style++ = 0; 235 *style++ = 0;
236 else if (role && (style = strchr(role, ':')) != NULL)
237 *style++ = '\0';
233 238
234 if (authctxt->attempt++ == 0) { 239 if (authctxt->attempt++ == 0) {
235 /* setup auth context */ 240 /* setup auth context */
@@ -253,8 +258,9 @@ input_userauth_request(int type, u_int32_t seq, void *ctxt)
253 use_privsep ? " [net]" : ""); 258 use_privsep ? " [net]" : "");
254 authctxt->service = xstrdup(service); 259 authctxt->service = xstrdup(service);
255 authctxt->style = style ? xstrdup(style) : NULL; 260 authctxt->style = style ? xstrdup(style) : NULL;
261 authctxt->role = role ? xstrdup(role) : NULL;
256 if (use_privsep) 262 if (use_privsep)
257 mm_inform_authserv(service, style); 263 mm_inform_authserv(service, style, role);
258 userauth_banner(); 264 userauth_banner();
259 if (auth2_setup_methods_lists(authctxt) != 0) 265 if (auth2_setup_methods_lists(authctxt) != 0)
260 packet_disconnect("no authentication methods enabled"); 266 packet_disconnect("no authentication methods enabled");
diff --git a/monitor.c b/monitor.c
index 291881493..11eac63c2 100644
--- a/monitor.c
+++ b/monitor.c
@@ -145,6 +145,7 @@ int mm_answer_sign(int, Buffer *);
145int mm_answer_pwnamallow(int, Buffer *); 145int mm_answer_pwnamallow(int, Buffer *);
146int mm_answer_auth2_read_banner(int, Buffer *); 146int mm_answer_auth2_read_banner(int, Buffer *);
147int mm_answer_authserv(int, Buffer *); 147int mm_answer_authserv(int, Buffer *);
148int mm_answer_authrole(int, Buffer *);
148int mm_answer_authpassword(int, Buffer *); 149int mm_answer_authpassword(int, Buffer *);
149int mm_answer_bsdauthquery(int, Buffer *); 150int mm_answer_bsdauthquery(int, Buffer *);
150int mm_answer_bsdauthrespond(int, Buffer *); 151int mm_answer_bsdauthrespond(int, Buffer *);
@@ -221,6 +222,7 @@ struct mon_table mon_dispatch_proto20[] = {
221 {MONITOR_REQ_SIGN, MON_ONCE, mm_answer_sign}, 222 {MONITOR_REQ_SIGN, MON_ONCE, mm_answer_sign},
222 {MONITOR_REQ_PWNAM, MON_ONCE, mm_answer_pwnamallow}, 223 {MONITOR_REQ_PWNAM, MON_ONCE, mm_answer_pwnamallow},
223 {MONITOR_REQ_AUTHSERV, MON_ONCE, mm_answer_authserv}, 224 {MONITOR_REQ_AUTHSERV, MON_ONCE, mm_answer_authserv},
225 {MONITOR_REQ_AUTHROLE, MON_ONCE, mm_answer_authrole},
224 {MONITOR_REQ_AUTH2_READ_BANNER, MON_ONCE, mm_answer_auth2_read_banner}, 226 {MONITOR_REQ_AUTH2_READ_BANNER, MON_ONCE, mm_answer_auth2_read_banner},
225 {MONITOR_REQ_AUTHPASSWORD, MON_AUTH, mm_answer_authpassword}, 227 {MONITOR_REQ_AUTHPASSWORD, MON_AUTH, mm_answer_authpassword},
226#ifdef USE_PAM 228#ifdef USE_PAM
@@ -822,6 +824,7 @@ mm_answer_pwnamallow(int sock, Buffer *m)
822 else { 824 else {
823 /* Allow service/style information on the auth context */ 825 /* Allow service/style information on the auth context */
824 monitor_permit(mon_dispatch, MONITOR_REQ_AUTHSERV, 1); 826 monitor_permit(mon_dispatch, MONITOR_REQ_AUTHSERV, 1);
827 monitor_permit(mon_dispatch, MONITOR_REQ_AUTHROLE, 1);
825 monitor_permit(mon_dispatch, MONITOR_REQ_AUTH2_READ_BANNER, 1); 828 monitor_permit(mon_dispatch, MONITOR_REQ_AUTH2_READ_BANNER, 1);
826 } 829 }
827#ifdef USE_PAM 830#ifdef USE_PAM
@@ -852,14 +855,37 @@ mm_answer_authserv(int sock, Buffer *m)
852 855
853 authctxt->service = buffer_get_string(m, NULL); 856 authctxt->service = buffer_get_string(m, NULL);
854 authctxt->style = buffer_get_string(m, NULL); 857 authctxt->style = buffer_get_string(m, NULL);
855 debug3("%s: service=%s, style=%s", 858 authctxt->role = buffer_get_string(m, NULL);
856 __func__, authctxt->service, authctxt->style); 859 debug3("%s: service=%s, style=%s, role=%s",
860 __func__, authctxt->service, authctxt->style, authctxt->role);
857 861
858 if (strlen(authctxt->style) == 0) { 862 if (strlen(authctxt->style) == 0) {
859 free(authctxt->style); 863 free(authctxt->style);
860 authctxt->style = NULL; 864 authctxt->style = NULL;
861 } 865 }
862 866
867 if (strlen(authctxt->role) == 0) {
868 free(authctxt->role);
869 authctxt->role = NULL;
870 }
871
872 return (0);
873}
874
875int
876mm_answer_authrole(int sock, Buffer *m)
877{
878 monitor_permit_authentications(1);
879
880 authctxt->role = buffer_get_string(m, NULL);
881 debug3("%s: role=%s",
882 __func__, authctxt->role);
883
884 if (strlen(authctxt->role) == 0) {
885 free(authctxt->role);
886 authctxt->role = NULL;
887 }
888
863 return (0); 889 return (0);
864} 890}
865 891
@@ -1464,7 +1490,7 @@ mm_answer_pty(int sock, Buffer *m)
1464 res = pty_allocate(&s->ptyfd, &s->ttyfd, s->tty, sizeof(s->tty)); 1490 res = pty_allocate(&s->ptyfd, &s->ttyfd, s->tty, sizeof(s->tty));
1465 if (res == 0) 1491 if (res == 0)
1466 goto error; 1492 goto error;
1467 pty_setowner(authctxt->pw, s->tty); 1493 pty_setowner(authctxt->pw, s->tty, authctxt->role);
1468 1494
1469 buffer_put_int(m, 1); 1495 buffer_put_int(m, 1);
1470 buffer_put_cstring(m, s->tty); 1496 buffer_put_cstring(m, s->tty);
diff --git a/monitor.h b/monitor.h
index 7f32b0c0c..4d5e8fabe 100644
--- a/monitor.h
+++ b/monitor.h
@@ -68,6 +68,8 @@ enum monitor_reqtype {
68 MONITOR_REQ_GSSSIGN = 150, MONITOR_ANS_GSSSIGN = 151, 68 MONITOR_REQ_GSSSIGN = 150, MONITOR_ANS_GSSSIGN = 151,
69 MONITOR_REQ_GSSUPCREDS = 152, MONITOR_ANS_GSSUPCREDS = 153, 69 MONITOR_REQ_GSSUPCREDS = 152, MONITOR_ANS_GSSUPCREDS = 153,
70 70
71 MONITOR_REQ_AUTHROLE = 154,
72
71}; 73};
72 74
73struct mm_master; 75struct mm_master;
diff --git a/monitor_wrap.c b/monitor_wrap.c
index 60b987dce..f75dc9d71 100644
--- a/monitor_wrap.c
+++ b/monitor_wrap.c
@@ -318,10 +318,10 @@ mm_auth2_read_banner(void)
318 return (banner); 318 return (banner);
319} 319}
320 320
321/* Inform the privileged process about service and style */ 321/* Inform the privileged process about service, style, and role */
322 322
323void 323void
324mm_inform_authserv(char *service, char *style) 324mm_inform_authserv(char *service, char *style, char *role)
325{ 325{
326 Buffer m; 326 Buffer m;
327 327
@@ -330,12 +330,30 @@ mm_inform_authserv(char *service, char *style)
330 buffer_init(&m); 330 buffer_init(&m);
331 buffer_put_cstring(&m, service); 331 buffer_put_cstring(&m, service);
332 buffer_put_cstring(&m, style ? style : ""); 332 buffer_put_cstring(&m, style ? style : "");
333 buffer_put_cstring(&m, role ? role : "");
333 334
334 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUTHSERV, &m); 335 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUTHSERV, &m);
335 336
336 buffer_free(&m); 337 buffer_free(&m);
337} 338}
338 339
340/* Inform the privileged process about role */
341
342void
343mm_inform_authrole(char *role)
344{
345 Buffer m;
346
347 debug3("%s entering", __func__);
348
349 buffer_init(&m);
350 buffer_put_cstring(&m, role ? role : "");
351
352 mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUTHROLE, &m);
353
354 buffer_free(&m);
355}
356
339/* Do the password authentication */ 357/* Do the password authentication */
340int 358int
341mm_auth_password(Authctxt *authctxt, char *password) 359mm_auth_password(Authctxt *authctxt, char *password)
diff --git a/monitor_wrap.h b/monitor_wrap.h
index a4e9d24b3..9c2ee49ba 100644
--- a/monitor_wrap.h
+++ b/monitor_wrap.h
@@ -41,7 +41,8 @@ void mm_log_handler(LogLevel, const char *, void *);
41int mm_is_monitor(void); 41int mm_is_monitor(void);
42DH *mm_choose_dh(int, int, int); 42DH *mm_choose_dh(int, int, int);
43int mm_key_sign(Key *, u_char **, u_int *, u_char *, u_int); 43int mm_key_sign(Key *, u_char **, u_int *, u_char *, u_int);
44void mm_inform_authserv(char *, char *); 44void mm_inform_authserv(char *, char *, char *);
45void mm_inform_authrole(char *);
45struct passwd *mm_getpwnamallow(const char *); 46struct passwd *mm_getpwnamallow(const char *);
46char *mm_auth2_read_banner(void); 47char *mm_auth2_read_banner(void);
47int mm_auth_password(struct Authctxt *, char *); 48int mm_auth_password(struct Authctxt *, char *);
diff --git a/openbsd-compat/port-linux.c b/openbsd-compat/port-linux.c
index 4637a7a3e..de6ad3fd7 100644
--- a/openbsd-compat/port-linux.c
+++ b/openbsd-compat/port-linux.c
@@ -29,6 +29,12 @@
29#include <string.h> 29#include <string.h>
30#include <stdio.h> 30#include <stdio.h>
31 31
32#ifdef WITH_SELINUX
33#include "key.h"
34#include "hostfile.h"
35#include "auth.h"
36#endif
37
32#include "log.h" 38#include "log.h"
33#include "xmalloc.h" 39#include "xmalloc.h"
34#include "port-linux.h" 40#include "port-linux.h"
@@ -58,7 +64,7 @@ ssh_selinux_enabled(void)
58 64
59/* Return the default security context for the given username */ 65/* Return the default security context for the given username */
60static security_context_t 66static security_context_t
61ssh_selinux_getctxbyname(char *pwname) 67ssh_selinux_getctxbyname(char *pwname, const char *role)
62{ 68{
63 security_context_t sc = NULL; 69 security_context_t sc = NULL;
64 char *sename = NULL, *lvl = NULL; 70 char *sename = NULL, *lvl = NULL;
@@ -73,9 +79,16 @@ ssh_selinux_getctxbyname(char *pwname)
73#endif 79#endif
74 80
75#ifdef HAVE_GET_DEFAULT_CONTEXT_WITH_LEVEL 81#ifdef HAVE_GET_DEFAULT_CONTEXT_WITH_LEVEL
76 r = get_default_context_with_level(sename, lvl, NULL, &sc); 82 if (role != NULL && role[0])
83 r = get_default_context_with_rolelevel(sename, role, lvl, NULL,
84 &sc);
85 else
86 r = get_default_context_with_level(sename, lvl, NULL, &sc);
77#else 87#else
78 r = get_default_context(sename, NULL, &sc); 88 if (role != NULL && role[0])
89 r = get_default_context_with_role(sename, role, NULL, &sc);
90 else
91 r = get_default_context(sename, NULL, &sc);
79#endif 92#endif
80 93
81 if (r != 0) { 94 if (r != 0) {
@@ -105,7 +118,7 @@ ssh_selinux_getctxbyname(char *pwname)
105 118
106/* Set the execution context to the default for the specified user */ 119/* Set the execution context to the default for the specified user */
107void 120void
108ssh_selinux_setup_exec_context(char *pwname) 121ssh_selinux_setup_exec_context(char *pwname, const char *role)
109{ 122{
110 security_context_t user_ctx = NULL; 123 security_context_t user_ctx = NULL;
111 124
@@ -114,7 +127,7 @@ ssh_selinux_setup_exec_context(char *pwname)
114 127
115 debug3("%s: setting execution context", __func__); 128 debug3("%s: setting execution context", __func__);
116 129
117 user_ctx = ssh_selinux_getctxbyname(pwname); 130 user_ctx = ssh_selinux_getctxbyname(pwname, role);
118 if (setexeccon(user_ctx) != 0) { 131 if (setexeccon(user_ctx) != 0) {
119 switch (security_getenforce()) { 132 switch (security_getenforce()) {
120 case -1: 133 case -1:
@@ -136,7 +149,7 @@ ssh_selinux_setup_exec_context(char *pwname)
136 149
137/* Set the TTY context for the specified user */ 150/* Set the TTY context for the specified user */
138void 151void
139ssh_selinux_setup_pty(char *pwname, const char *tty) 152ssh_selinux_setup_pty(char *pwname, const char *tty, const char *role)
140{ 153{
141 security_context_t new_tty_ctx = NULL; 154 security_context_t new_tty_ctx = NULL;
142 security_context_t user_ctx = NULL; 155 security_context_t user_ctx = NULL;
@@ -147,7 +160,7 @@ ssh_selinux_setup_pty(char *pwname, const char *tty)
147 160
148 debug3("%s: setting TTY context on %s", __func__, tty); 161 debug3("%s: setting TTY context on %s", __func__, tty);
149 162
150 user_ctx = ssh_selinux_getctxbyname(pwname); 163 user_ctx = ssh_selinux_getctxbyname(pwname, role);
151 164
152 /* XXX: should these calls fatal() upon failure in enforcing mode? */ 165 /* XXX: should these calls fatal() upon failure in enforcing mode? */
153 166
diff --git a/openbsd-compat/port-linux.h b/openbsd-compat/port-linux.h
index e3d1004aa..80ce13ad9 100644
--- a/openbsd-compat/port-linux.h
+++ b/openbsd-compat/port-linux.h
@@ -21,8 +21,8 @@
21 21
22#ifdef WITH_SELINUX 22#ifdef WITH_SELINUX
23int ssh_selinux_enabled(void); 23int ssh_selinux_enabled(void);
24void ssh_selinux_setup_pty(char *, const char *); 24void ssh_selinux_setup_pty(char *, const char *, const char *);
25void ssh_selinux_setup_exec_context(char *); 25void ssh_selinux_setup_exec_context(char *, const char *);
26void ssh_selinux_change_context(const char *); 26void ssh_selinux_change_context(const char *);
27void ssh_selinux_setfscreatecon(const char *); 27void ssh_selinux_setfscreatecon(const char *);
28#endif 28#endif
diff --git a/platform.c b/platform.c
index 30fc60909..4aab9a9cd 100644
--- a/platform.c
+++ b/platform.c
@@ -142,7 +142,7 @@ platform_setusercontext(struct passwd *pw)
142 * called if sshd is running as root. 142 * called if sshd is running as root.
143 */ 143 */
144void 144void
145platform_setusercontext_post_groups(struct passwd *pw) 145platform_setusercontext_post_groups(struct passwd *pw, const char *role)
146{ 146{
147#if !defined(HAVE_LOGIN_CAP) && defined(USE_PAM) 147#if !defined(HAVE_LOGIN_CAP) && defined(USE_PAM)
148 /* 148 /*
@@ -183,7 +183,7 @@ platform_setusercontext_post_groups(struct passwd *pw)
183 } 183 }
184#endif /* HAVE_SETPCRED */ 184#endif /* HAVE_SETPCRED */
185#ifdef WITH_SELINUX 185#ifdef WITH_SELINUX
186 ssh_selinux_setup_exec_context(pw->pw_name); 186 ssh_selinux_setup_exec_context(pw->pw_name, role);
187#endif 187#endif
188} 188}
189 189
diff --git a/platform.h b/platform.h
index 1c7a45d8f..436ae7c4f 100644
--- a/platform.h
+++ b/platform.h
@@ -27,7 +27,7 @@ void platform_post_fork_parent(pid_t child_pid);
27void platform_post_fork_child(void); 27void platform_post_fork_child(void);
28int platform_privileged_uidswap(void); 28int platform_privileged_uidswap(void);
29void platform_setusercontext(struct passwd *); 29void platform_setusercontext(struct passwd *);
30void platform_setusercontext_post_groups(struct passwd *); 30void platform_setusercontext_post_groups(struct passwd *, const char *);
31char *platform_get_krb5_client(const char *); 31char *platform_get_krb5_client(const char *);
32char *platform_krb5_get_principal_name(const char *); 32char *platform_krb5_get_principal_name(const char *);
33int platform_sys_dir_uid(uid_t); 33int platform_sys_dir_uid(uid_t);
diff --git a/session.c b/session.c
index 2bcf8185c..6848df42f 100644
--- a/session.c
+++ b/session.c
@@ -1502,7 +1502,7 @@ safely_chroot(const char *path, uid_t uid)
1502 1502
1503/* Set login name, uid, gid, and groups. */ 1503/* Set login name, uid, gid, and groups. */
1504void 1504void
1505do_setusercontext(struct passwd *pw) 1505do_setusercontext(struct passwd *pw, const char *role)
1506{ 1506{
1507 char *chroot_path, *tmp; 1507 char *chroot_path, *tmp;
1508 1508
@@ -1530,7 +1530,7 @@ do_setusercontext(struct passwd *pw)
1530 endgrent(); 1530 endgrent();
1531#endif 1531#endif
1532 1532
1533 platform_setusercontext_post_groups(pw); 1533 platform_setusercontext_post_groups(pw, role);
1534 1534
1535 if (options.chroot_directory != NULL && 1535 if (options.chroot_directory != NULL &&
1536 strcasecmp(options.chroot_directory, "none") != 0) { 1536 strcasecmp(options.chroot_directory, "none") != 0) {
@@ -1679,7 +1679,7 @@ do_child(Session *s, const char *command)
1679 1679
1680 /* Force a password change */ 1680 /* Force a password change */
1681 if (s->authctxt->force_pwchange) { 1681 if (s->authctxt->force_pwchange) {
1682 do_setusercontext(pw); 1682 do_setusercontext(pw, s->authctxt->role);
1683 child_close_fds(); 1683 child_close_fds();
1684 do_pwchange(s); 1684 do_pwchange(s);
1685 exit(1); 1685 exit(1);
@@ -1706,7 +1706,7 @@ do_child(Session *s, const char *command)
1706 /* When PAM is enabled we rely on it to do the nologin check */ 1706 /* When PAM is enabled we rely on it to do the nologin check */
1707 if (!options.use_pam) 1707 if (!options.use_pam)
1708 do_nologin(pw); 1708 do_nologin(pw);
1709 do_setusercontext(pw); 1709 do_setusercontext(pw, s->authctxt->role);
1710 /* 1710 /*
1711 * PAM session modules in do_setusercontext may have 1711 * PAM session modules in do_setusercontext may have
1712 * generated messages, so if this in an interactive 1712 * generated messages, so if this in an interactive
@@ -2117,7 +2117,7 @@ session_pty_req(Session *s)
2117 tty_parse_modes(s->ttyfd, &n_bytes); 2117 tty_parse_modes(s->ttyfd, &n_bytes);
2118 2118
2119 if (!use_privsep) 2119 if (!use_privsep)
2120 pty_setowner(s->pw, s->tty); 2120 pty_setowner(s->pw, s->tty, s->authctxt->role);
2121 2121
2122 /* Set window size from the packet. */ 2122 /* Set window size from the packet. */
2123 pty_change_window_size(s->ptyfd, s->row, s->col, s->xpixel, s->ypixel); 2123 pty_change_window_size(s->ptyfd, s->row, s->col, s->xpixel, s->ypixel);
diff --git a/session.h b/session.h
index 6a2f35e41..ef6593c34 100644
--- a/session.h
+++ b/session.h
@@ -77,7 +77,7 @@ void session_pty_cleanup2(Session *);
77Session *session_new(void); 77Session *session_new(void);
78Session *session_by_tty(char *); 78Session *session_by_tty(char *);
79void session_close(Session *); 79void session_close(Session *);
80void do_setusercontext(struct passwd *); 80void do_setusercontext(struct passwd *, const char *);
81void child_set_env(char ***envp, u_int *envsizep, const char *name, 81void child_set_env(char ***envp, u_int *envsizep, const char *name,
82 const char *value); 82 const char *value);
83 83
diff --git a/sshd.c b/sshd.c
index d787fea7b..e343d902f 100644
--- a/sshd.c
+++ b/sshd.c
@@ -769,7 +769,7 @@ privsep_postauth(Authctxt *authctxt)
769 explicit_bzero(rnd, sizeof(rnd)); 769 explicit_bzero(rnd, sizeof(rnd));
770 770
771 /* Drop privileges */ 771 /* Drop privileges */
772 do_setusercontext(authctxt->pw); 772 do_setusercontext(authctxt->pw, authctxt->role);
773 773
774 skip: 774 skip:
775 /* It is safe now to apply the key state */ 775 /* It is safe now to apply the key state */
diff --git a/sshpty.c b/sshpty.c
index bbbc0fefe..8cc26a249 100644
--- a/sshpty.c
+++ b/sshpty.c
@@ -200,7 +200,7 @@ pty_change_window_size(int ptyfd, u_int row, u_int col,
200} 200}
201 201
202void 202void
203pty_setowner(struct passwd *pw, const char *tty) 203pty_setowner(struct passwd *pw, const char *tty, const char *role)
204{ 204{
205 struct group *grp; 205 struct group *grp;
206 gid_t gid; 206 gid_t gid;
@@ -227,7 +227,7 @@ pty_setowner(struct passwd *pw, const char *tty)
227 strerror(errno)); 227 strerror(errno));
228 228
229#ifdef WITH_SELINUX 229#ifdef WITH_SELINUX
230 ssh_selinux_setup_pty(pw->pw_name, tty); 230 ssh_selinux_setup_pty(pw->pw_name, tty, role);
231#endif 231#endif
232 232
233 if (st.st_uid != pw->pw_uid || st.st_gid != gid) { 233 if (st.st_uid != pw->pw_uid || st.st_gid != gid) {
diff --git a/sshpty.h b/sshpty.h
index cfa322480..edf24365f 100644
--- a/sshpty.h
+++ b/sshpty.h
@@ -24,4 +24,4 @@ int pty_allocate(int *, int *, char *, size_t);
24void pty_release(const char *); 24void pty_release(const char *);
25void pty_make_controlling_tty(int *, const char *); 25void pty_make_controlling_tty(int *, const char *);
26void pty_change_window_size(int, u_int, u_int, u_int, u_int); 26void pty_change_window_size(int, u_int, u_int, u_int, u_int);
27void pty_setowner(struct passwd *, const char *); 27void pty_setowner(struct passwd *, const char *, const char *);