]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream commit
authordjm@openbsd.org <djm@openbsd.org>
Wed, 4 Jan 2017 05:37:40 +0000 (05:37 +0000)
committerDamien Miller <djm@mindrot.org>
Mon, 30 Jan 2017 00:05:18 +0000 (11:05 +1100)
unbreak Unix domain socket forwarding for root; ok
markus@

Upstream-ID: 6649c76eb7a3fa15409373295ca71badf56920a2

serverloop.c

index c4e4699da68c48fbbee10bb8df02885dd96d24b0..bdb944fa3bf25c2ef164477efa2f2b5cae8f4327 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: serverloop.c,v 1.189 2016/12/14 00:36:34 djm Exp $ */
+/* $OpenBSD: serverloop.c,v 1.190 2017/01/04 05:37:40 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -468,6 +468,10 @@ server_request_direct_streamlocal(void)
        Channel *c = NULL;
        char *target, *originator;
        u_short originator_port;
+       struct passwd *pw = the_authctxt->pw;
+
+       if (pw == NULL || !the_authctxt->valid)
+               fatal("server_input_global_request: no/invalid user");
 
        target = packet_get_string(NULL);
        originator = packet_get_string(NULL);
@@ -480,7 +484,7 @@ server_request_direct_streamlocal(void)
        /* XXX fine grained permissions */
        if ((options.allow_streamlocal_forwarding & FORWARD_LOCAL) != 0 &&
            !no_port_forwarding_flag && !options.disable_forwarding &&
-           use_privsep) {
+           (pw->pw_uid == 0 || use_privsep)) {
                c = channel_connect_to_path(target,
                    "direct-streamlocal@openssh.com", "direct-streamlocal");
        } else {
@@ -702,6 +706,10 @@ server_input_global_request(int type, u_int32_t seq, void *ctxt)
        int want_reply;
        int r, success = 0, allocated_listen_port = 0;
        struct sshbuf *resp = NULL;
+       struct passwd *pw = the_authctxt->pw;
+
+       if (pw == NULL || !the_authctxt->valid)
+               fatal("server_input_global_request: no/invalid user");
 
        rtype = packet_get_string(NULL);
        want_reply = packet_get_char();
@@ -709,12 +717,8 @@ server_input_global_request(int type, u_int32_t seq, void *ctxt)
 
        /* -R style forwarding */
        if (strcmp(rtype, "tcpip-forward") == 0) {
-               struct passwd *pw;
                struct Forward fwd;
 
-               pw = the_authctxt->pw;
-               if (pw == NULL || !the_authctxt->valid)
-                       fatal("server_input_global_request: no/invalid user");
                memset(&fwd, 0, sizeof(fwd));
                fwd.listen_host = packet_get_string(NULL);
                fwd.listen_port = (u_short)packet_get_int();
@@ -762,9 +766,10 @@ server_input_global_request(int type, u_int32_t seq, void *ctxt)
                /* check permissions */
                if ((options.allow_streamlocal_forwarding & FORWARD_REMOTE) == 0
                    || no_port_forwarding_flag || options.disable_forwarding ||
-                   !use_privsep) {
+                   (pw->pw_uid != 0 && !use_privsep)) {
                        success = 0;
-                       packet_send_debug("Server has disabled port forwarding.");
+                       packet_send_debug("Server has disabled "
+                           "streamlocal forwarding.");
                } else {
                        /* Start listening on the socket */
                        success = channel_setup_remote_fwd_listener(