annotate svr-x11fwd.c @ 447:278805938dcf

Patch from Nicolai Ehemann to try binding before going to the background, so that if it exits early (because something's already listening etc) then it will return an exitcode of 1.
author Matt Johnston <matt@ucc.asn.au>
date Thu, 19 Jul 2007 15:54:18 +0000
parents 161557a9dde8
children 740e782679be 52a644e7b8e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1 /*
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
2 * Dropbear - a SSH2 server
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
3 *
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
4 * Copyright (c) 2002,2003 Matt Johnston
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
5 * All rights reserved.
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
6 *
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
8 * of this software and associated documentation files (the "Software"), to deal
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
9 * in the Software without restriction, including without limitation the rights
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
11 * copies of the Software, and to permit persons to whom the Software is
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
12 * furnished to do so, subject to the following conditions:
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
13 *
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
14 * The above copyright notice and this permission notice shall be included in
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
15 * all copies or substantial portions of the Software.
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
16 *
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
23 * SOFTWARE. */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
24
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
25 #include "includes.h"
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
26
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
27 #ifndef DISABLE_X11FWD
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
28 #include "x11fwd.h"
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
29 #include "session.h"
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
30 #include "ssh.h"
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
31 #include "dbutil.h"
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
32 #include "chansession.h"
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
33 #include "channel.h"
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
34 #include "packet.h"
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
35 #include "buffer.h"
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
36
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
37 #define X11BASEPORT 6000
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
38 #define X11BINDBASE 6010
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
39
62
20563735e8b5 just checkpointing
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
40 static void x11accept(struct Listener* listener, int sock);
10
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
41 static int bindport(int fd);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
42 static int send_msg_channel_open_x11(int fd, struct sockaddr_in* addr);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
43
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
44 /* called as a request for a session channel, sets up listening X11 */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
45 /* returns DROPBEAR_SUCCESS or DROPBEAR_FAILURE */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
46 int x11req(struct ChanSess * chansess) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
47
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
48 int fd;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
49
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
50 /* we already have an x11 connection */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
51 if (chansess->x11listener != NULL) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
52 return DROPBEAR_FAILURE;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
53 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
54
179
161557a9dde8 * fix longstanding bug with connections being closed on failure to
Matt Johnston <matt@ucc.asn.au>
parents: 165
diff changeset
55 chansess->x11singleconn = buf_getbool(ses.payload);
10
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
56 chansess->x11authprot = buf_getstring(ses.payload, NULL);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
57 chansess->x11authcookie = buf_getstring(ses.payload, NULL);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
58 chansess->x11screennum = buf_getint(ses.payload);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
59
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
60 /* create listening socket */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
61 fd = socket(PF_INET, SOCK_STREAM, 0);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
62 if (fd < 0) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
63 goto fail;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
64 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
65
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
66 /* allocate port and bind */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
67 chansess->x11port = bindport(fd);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
68 if (chansess->x11port < 0) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
69 goto fail;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
70 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
71
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
72 /* listen */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
73 if (listen(fd, 20) < 0) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
74 goto fail;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
75 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
76
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
77 /* set non-blocking */
109
2e9d1f29c50f merge of 50be59810e462f9f44f55e421227d6aa0b31982b
Matt Johnston <matt@ucc.asn.au>
parents: 95
diff changeset
78 setnonblocking(fd);
10
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
79
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
80 /* listener code will handle the socket now.
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
81 * No cleanup handler needed, since listener_remove only happens
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
82 * from our cleanup anyway */
62
20563735e8b5 just checkpointing
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
83 chansess->x11listener = new_listener( &fd, 1, 0, chansess, x11accept, NULL);
10
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
84 if (chansess->x11listener == NULL) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
85 goto fail;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
86 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
87
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
88 return DROPBEAR_SUCCESS;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
89
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
90 fail:
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
91 /* cleanup */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
92 m_free(chansess->x11authprot);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
93 m_free(chansess->x11authcookie);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
94 close(fd);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
95
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
96 return DROPBEAR_FAILURE;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
97 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
98
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
99 /* accepts a new X11 socket */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
100 /* returns DROPBEAR_FAILURE or DROPBEAR_SUCCESS */
62
20563735e8b5 just checkpointing
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
101 static void x11accept(struct Listener* listener, int sock) {
10
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
102
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
103 int fd;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
104 struct sockaddr_in addr;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
105 int len;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
106 int ret;
13
db2c8e6fb284 Fixed stupid agentfwd error (using the listening FD, not the accepted on. gah)
Matt Johnston <matt@ucc.asn.au>
parents: 12
diff changeset
107 struct ChanSess * chansess = (struct ChanSess *)(listener->typedata);
10
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
108
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
109 len = sizeof(addr);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
110
62
20563735e8b5 just checkpointing
Matt Johnston <matt@ucc.asn.au>
parents: 13
diff changeset
111 fd = accept(sock, (struct sockaddr*)&addr, &len);
10
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
112 if (fd < 0) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
113 return;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
114 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
115
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
116 /* if single-connection we close it up */
13
db2c8e6fb284 Fixed stupid agentfwd error (using the listening FD, not the accepted on. gah)
Matt Johnston <matt@ucc.asn.au>
parents: 12
diff changeset
117 if (chansess->x11singleconn) {
db2c8e6fb284 Fixed stupid agentfwd error (using the listening FD, not the accepted on. gah)
Matt Johnston <matt@ucc.asn.au>
parents: 12
diff changeset
118 x11cleanup(chansess);
10
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
119 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
120
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
121 ret = send_msg_channel_open_x11(fd, &addr);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
122 if (ret == DROPBEAR_FAILURE) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
123 close(fd);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
124 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
125 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
126
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
127 /* This is called after switching to the user, and sets up the xauth
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
128 * and environment variables. */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
129 void x11setauth(struct ChanSess *chansess) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
130
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
131 char display[20]; /* space for "localhost:12345.123" */
70
b0316ce64e4b Merging in the changes from 0.41-0.43 main Dropbear tree
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
132 FILE * authprog = NULL;
10
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
133 int val;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
134
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
135 if (chansess->x11listener == NULL) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
136 return;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
137 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
138
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
139 /* create the DISPLAY string */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
140 val = snprintf(display, sizeof(display), "localhost:%d.%d",
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
141 chansess->x11port - X11BASEPORT, chansess->x11screennum);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
142 if (val < 0 || val >= (int)sizeof(display)) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
143 /* string was truncated */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
144 return;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
145 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
146
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
147 addnewvar("DISPLAY", display);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
148
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
149 /* create the xauth string */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
150 val = snprintf(display, sizeof(display), "unix:%d.%d",
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
151 chansess->x11port - X11BASEPORT, chansess->x11screennum);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
152 if (val < 0 || val >= (int)sizeof(display)) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
153 /* string was truncated */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
154 return;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
155 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
156
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
157 /* popen is a nice function - code is strongly based on OpenSSH's */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
158 authprog = popen(XAUTH_COMMAND, "w");
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
159 if (authprog) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
160 fprintf(authprog, "add %s %s %s\n",
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
161 display, chansess->x11authprot, chansess->x11authcookie);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
162 pclose(authprog);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
163 } else {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
164 fprintf(stderr, "Failed to run %s\n", XAUTH_COMMAND);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
165 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
166 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
167
13
db2c8e6fb284 Fixed stupid agentfwd error (using the listening FD, not the accepted on. gah)
Matt Johnston <matt@ucc.asn.au>
parents: 12
diff changeset
168 void x11cleanup(struct ChanSess *chansess) {
10
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
169
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
170 m_free(chansess->x11authprot);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
171 m_free(chansess->x11authcookie);
95
b855bf63766c Don't try to remove non-eixtant listeners
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
172
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 109
diff changeset
173 TRACE(("chansess %s", chansess))
95
b855bf63766c Don't try to remove non-eixtant listeners
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
174 if (chansess->x11listener != NULL) {
b855bf63766c Don't try to remove non-eixtant listeners
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
175 remove_listener(chansess->x11listener);
b855bf63766c Don't try to remove non-eixtant listeners
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
176 chansess->x11listener = NULL;
b855bf63766c Don't try to remove non-eixtant listeners
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
177 }
10
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
178 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
179
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
180 static const struct ChanType chan_x11 = {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
181 0, /* sepfds */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
182 "x11",
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
183 NULL, /* inithandler */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
184 NULL, /* checkclose */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
185 NULL, /* reqhandler */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
186 NULL /* closehandler */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
187 };
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
188
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
189
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
190 static int send_msg_channel_open_x11(int fd, struct sockaddr_in* addr) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
191
70
b0316ce64e4b Merging in the changes from 0.41-0.43 main Dropbear tree
Matt Johnston <matt@ucc.asn.au>
parents: 62
diff changeset
192 char* ipstring = NULL;
10
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
193
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
194 if (send_msg_channel_open_init(fd, &chan_x11) == DROPBEAR_SUCCESS) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
195 ipstring = inet_ntoa(addr->sin_addr);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
196 buf_putstring(ses.writepayload, ipstring, strlen(ipstring));
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
197 buf_putint(ses.writepayload, addr->sin_port);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
198
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
199 encrypt_packet();
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
200 return DROPBEAR_SUCCESS;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
201 } else {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
202 return DROPBEAR_FAILURE;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
203 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
204
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
205 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
206
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
207 /* returns the port bound to, or -1 on failure.
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
208 * Will attempt to bind to a port X11BINDBASE (6010 usually) or upwards */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
209 static int bindport(int fd) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
210
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
211 struct sockaddr_in addr;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
212 uint16_t port;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
213
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
214 memset((void*)&addr, 0x0, sizeof(addr));
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
215 addr.sin_family = AF_INET;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
216 addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
217
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
218 /* if we can't find one in 2000 ports free, something's wrong */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
219 for (port = X11BINDBASE; port < X11BINDBASE + 2000; port++) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
220 addr.sin_port = htons(port);
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
221 if (bind(fd, (struct sockaddr*)&addr,
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
222 sizeof(struct sockaddr_in)) == 0) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
223 /* success */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
224 return port;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
225 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
226 if (errno == EADDRINUSE) {
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
227 /* try the next port */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
228 continue;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
229 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
230 /* otherwise it was an error we don't know about */
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
231 dropbear_log(LOG_DEBUG, "failed to bind x11 socket");
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
232 break;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
233 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
234 return -1;
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
235 }
0f7d69d31b9d - renaming x11fwd.c to svr-x11fwd.c, to testing monotone
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
236 #endif /* DROPBEAR_X11FWD */