Mercurial > dropbear
annotate cli-tcpfwd.c @ 1065:23103e1e9548
Fix error handling for dbclient async connect
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Tue, 03 Mar 2015 20:53:00 +0800 |
parents | 0da8ba489c23 |
children | c45d65392c1a |
rev | line source |
---|---|
74
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
1 /* |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
2 * Dropbear SSH |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
3 * |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
4 * Copyright (c) 2002,2003 Matt Johnston |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
5 * All rights reserved. |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
6 * |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
7 * Permission is hereby granted, free of charge, to any person obtaining a copy |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
8 * of this software and associated documentation files (the "Software"), to deal |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
9 * in the Software without restriction, including without limitation the rights |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
11 * copies of the Software, and to permit persons to whom the Software is |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
12 * furnished to do so, subject to the following conditions: |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
13 * |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
14 * The above copyright notice and this permission notice shall be included in |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
15 * all copies or substantial portions of the Software. |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
16 * |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
23 * SOFTWARE. */ |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
70
diff
changeset
|
24 |
62 | 25 #include "includes.h" |
26 #include "options.h" | |
64 | 27 #include "dbutil.h" |
28 #include "tcpfwd.h" | |
62 | 29 #include "channel.h" |
64 | 30 #include "runopts.h" |
31 #include "session.h" | |
32 #include "ssh.h" | |
1032
0da8ba489c23
Move generic network routines to netio.c
Matt Johnston <matt@ucc.asn.au>
parents:
1025
diff
changeset
|
33 #include "netio.h" |
62 | 34 |
156
8c2b3506f112
Rearrange preprocessor parts so that compilation with various options
Matt Johnston <matt@ucc.asn.au>
parents:
108
diff
changeset
|
35 #ifdef ENABLE_CLI_REMOTETCPFWD |
64 | 36 static int newtcpforwarded(struct Channel * channel); |
37 | |
38 const struct ChanType cli_chan_tcpremote = { | |
39 1, /* sepfds */ | |
40 "forwarded-tcpip", | |
41 newtcpforwarded, | |
42 NULL, | |
43 NULL, | |
44 NULL | |
45 }; | |
156
8c2b3506f112
Rearrange preprocessor parts so that compilation with various options
Matt Johnston <matt@ucc.asn.au>
parents:
108
diff
changeset
|
46 #endif |
8c2b3506f112
Rearrange preprocessor parts so that compilation with various options
Matt Johnston <matt@ucc.asn.au>
parents:
108
diff
changeset
|
47 |
8c2b3506f112
Rearrange preprocessor parts so that compilation with various options
Matt Johnston <matt@ucc.asn.au>
parents:
108
diff
changeset
|
48 #ifdef ENABLE_CLI_LOCALTCPFWD |
578
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
49 static int cli_localtcp(const char* listenaddr, |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
50 unsigned int listenport, |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
51 const char* remoteaddr, |
156
8c2b3506f112
Rearrange preprocessor parts so that compilation with various options
Matt Johnston <matt@ucc.asn.au>
parents:
108
diff
changeset
|
52 unsigned int remoteport); |
62 | 53 static const struct ChanType cli_chan_tcplocal = { |
54 1, /* sepfds */ | |
55 "direct-tcpip", | |
941
5daedffd0769
Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents:
899
diff
changeset
|
56 tcp_prio_inithandler, |
62 | 57 NULL, |
64 | 58 NULL, |
62 | 59 NULL |
60 }; | |
156
8c2b3506f112
Rearrange preprocessor parts so that compilation with various options
Matt Johnston <matt@ucc.asn.au>
parents:
108
diff
changeset
|
61 #endif |
62 | 62 |
156
8c2b3506f112
Rearrange preprocessor parts so that compilation with various options
Matt Johnston <matt@ucc.asn.au>
parents:
108
diff
changeset
|
63 #ifdef ENABLE_CLI_LOCALTCPFWD |
63
dcc43965928f
- A nice cleaner structure for tcp (acceptor) forwarding.
Matt Johnston <matt@ucc.asn.au>
parents:
62
diff
changeset
|
64 void setup_localtcp() { |
551
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
65 m_list_elem *iter; |
64 | 66 int ret; |
67 | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
156
diff
changeset
|
68 TRACE(("enter setup_localtcp")) |
66
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
69 |
551
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
70 for (iter = cli_opts.localfwds->first; iter; iter = iter->next) { |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
71 struct TCPFwdEntry * fwd = (struct TCPFwdEntry*)iter->item; |
578
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
72 ret = cli_localtcp( |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
73 fwd->listenaddr, |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
74 fwd->listenport, |
551
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
75 fwd->connectaddr, |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
76 fwd->connectport); |
64 | 77 if (ret == DROPBEAR_FAILURE) { |
578
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
78 dropbear_log(LOG_WARNING, "Failed local port forward %s:%d:%s:%d", |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
79 fwd->listenaddr, |
551
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
80 fwd->listenport, |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
81 fwd->connectaddr, |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
82 fwd->connectport); |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
83 } |
64 | 84 } |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
156
diff
changeset
|
85 TRACE(("leave setup_localtcp")) |
62 | 86 |
63
dcc43965928f
- A nice cleaner structure for tcp (acceptor) forwarding.
Matt Johnston <matt@ucc.asn.au>
parents:
62
diff
changeset
|
87 } |
62 | 88 |
578
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
89 static int cli_localtcp(const char* listenaddr, |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
90 unsigned int listenport, |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
91 const char* remoteaddr, |
63
dcc43965928f
- A nice cleaner structure for tcp (acceptor) forwarding.
Matt Johnston <matt@ucc.asn.au>
parents:
62
diff
changeset
|
92 unsigned int remoteport) { |
62 | 93 |
94 struct TCPListener* tcpinfo = NULL; | |
64 | 95 int ret; |
96 | |
97 TRACE(("enter cli_localtcp: %d %s %d", listenport, remoteaddr, | |
98 remoteport)); | |
62 | 99 |
184
ca55377e4f7e
- allocate correct buffer size for channel info, rather than sizeof(pointer).
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
100 tcpinfo = (struct TCPListener*)m_malloc(sizeof(struct TCPListener)); |
258
306499676384
* add -g (dbclient) and -a (dropbear) options for allowing non-local
Matt Johnston <matt@ucc.asn.au>
parents:
253
diff
changeset
|
101 |
108
10f4d3319780
- added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents:
74
diff
changeset
|
102 tcpinfo->sendaddr = m_strdup(remoteaddr); |
63
dcc43965928f
- A nice cleaner structure for tcp (acceptor) forwarding.
Matt Johnston <matt@ucc.asn.au>
parents:
62
diff
changeset
|
103 tcpinfo->sendport = remoteport; |
258
306499676384
* add -g (dbclient) and -a (dropbear) options for allowing non-local
Matt Johnston <matt@ucc.asn.au>
parents:
253
diff
changeset
|
104 |
578
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
105 if (listenaddr) |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
106 { |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
107 tcpinfo->listenaddr = m_strdup(listenaddr); |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
108 } |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
109 else |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
110 { |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
111 if (opts.listen_fwd_all) { |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
112 tcpinfo->listenaddr = m_strdup(""); |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
113 } else { |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
114 tcpinfo->listenaddr = m_strdup("localhost"); |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
115 } |
258
306499676384
* add -g (dbclient) and -a (dropbear) options for allowing non-local
Matt Johnston <matt@ucc.asn.au>
parents:
253
diff
changeset
|
116 } |
63
dcc43965928f
- A nice cleaner structure for tcp (acceptor) forwarding.
Matt Johnston <matt@ucc.asn.au>
parents:
62
diff
changeset
|
117 tcpinfo->listenport = listenport; |
258
306499676384
* add -g (dbclient) and -a (dropbear) options for allowing non-local
Matt Johnston <matt@ucc.asn.au>
parents:
253
diff
changeset
|
118 |
62 | 119 tcpinfo->chantype = &cli_chan_tcplocal; |
259
c049490e43fe
* fix -L forwarding on the client, broke last rev
Matt Johnston <matt@ucc.asn.au>
parents:
258
diff
changeset
|
120 tcpinfo->tcp_type = direct; |
62 | 121 |
122 ret = listen_tcpfwd(tcpinfo); | |
123 | |
124 if (ret == DROPBEAR_FAILURE) { | |
125 m_free(tcpinfo); | |
126 } | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
156
diff
changeset
|
127 TRACE(("leave cli_localtcp: %d", ret)) |
62 | 128 return ret; |
129 } | |
156
8c2b3506f112
Rearrange preprocessor parts so that compilation with various options
Matt Johnston <matt@ucc.asn.au>
parents:
108
diff
changeset
|
130 #endif /* ENABLE_CLI_LOCALTCPFWD */ |
64 | 131 |
156
8c2b3506f112
Rearrange preprocessor parts so that compilation with various options
Matt Johnston <matt@ucc.asn.au>
parents:
108
diff
changeset
|
132 #ifdef ENABLE_CLI_REMOTETCPFWD |
578
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
133 static void send_msg_global_request_remotetcp(const char *addr, int port) { |
64 | 134 |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
156
diff
changeset
|
135 TRACE(("enter send_msg_global_request_remotetcp")) |
64 | 136 |
137 CHECKCLEARTOWRITE(); | |
138 buf_putbyte(ses.writepayload, SSH_MSG_GLOBAL_REQUEST); | |
139 buf_putstring(ses.writepayload, "tcpip-forward", 13); | |
505
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
140 buf_putbyte(ses.writepayload, 1); /* want_reply */ |
578
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
141 buf_putstring(ses.writepayload, addr, strlen(addr)); |
64 | 142 buf_putint(ses.writepayload, port); |
143 | |
144 encrypt_packet(); | |
145 | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
156
diff
changeset
|
146 TRACE(("leave send_msg_global_request_remotetcp")) |
64 | 147 } |
148 | |
505
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
149 /* The only global success/failure messages are for remotetcp. |
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
150 * Since there isn't any identifier in these messages, we have to rely on them |
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
151 * being in the same order as we sent the requests. This is the ordering |
631
af304deacb4c
Print the server allocated port when using dbclient -R 0:....
Matt Johnston <matt@ucc.asn.au>
parents:
591
diff
changeset
|
152 * of the cli_opts.remotefwds list. |
af304deacb4c
Print the server allocated port when using dbclient -R 0:....
Matt Johnston <matt@ucc.asn.au>
parents:
591
diff
changeset
|
153 * If the requested remote port is 0 the listen port will be |
af304deacb4c
Print the server allocated port when using dbclient -R 0:....
Matt Johnston <matt@ucc.asn.au>
parents:
591
diff
changeset
|
154 * dynamically allocated by the server and the port number will be returned |
af304deacb4c
Print the server allocated port when using dbclient -R 0:....
Matt Johnston <matt@ucc.asn.au>
parents:
591
diff
changeset
|
155 * to client and the port number reported to the user. */ |
505
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
156 void cli_recv_msg_request_success() { |
631
af304deacb4c
Print the server allocated port when using dbclient -R 0:....
Matt Johnston <matt@ucc.asn.au>
parents:
591
diff
changeset
|
157 /* We just mark off that we have received the reply, |
505
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
158 * so that we can report failure for later ones. */ |
551
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
159 m_list_elem * iter = NULL; |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
160 for (iter = cli_opts.remotefwds->first; iter; iter = iter->next) { |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
161 struct TCPFwdEntry *fwd = (struct TCPFwdEntry*)iter->item; |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
162 if (!fwd->have_reply) { |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
163 fwd->have_reply = 1; |
631
af304deacb4c
Print the server allocated port when using dbclient -R 0:....
Matt Johnston <matt@ucc.asn.au>
parents:
591
diff
changeset
|
164 if (fwd->listenport == 0) { |
899
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
165 /* The server should let us know which port was allocated if we requested port 0 */ |
631
af304deacb4c
Print the server allocated port when using dbclient -R 0:....
Matt Johnston <matt@ucc.asn.au>
parents:
591
diff
changeset
|
166 int allocport = buf_getint(ses.payload); |
af304deacb4c
Print the server allocated port when using dbclient -R 0:....
Matt Johnston <matt@ucc.asn.au>
parents:
591
diff
changeset
|
167 if (allocport > 0) { |
899
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
168 fwd->listenport = allocport; |
631
af304deacb4c
Print the server allocated port when using dbclient -R 0:....
Matt Johnston <matt@ucc.asn.au>
parents:
591
diff
changeset
|
169 dropbear_log(LOG_INFO, "Allocated port %d for remote forward to %s:%d", |
af304deacb4c
Print the server allocated port when using dbclient -R 0:....
Matt Johnston <matt@ucc.asn.au>
parents:
591
diff
changeset
|
170 allocport, fwd->connectaddr, fwd->connectport); |
af304deacb4c
Print the server allocated port when using dbclient -R 0:....
Matt Johnston <matt@ucc.asn.au>
parents:
591
diff
changeset
|
171 } |
af304deacb4c
Print the server allocated port when using dbclient -R 0:....
Matt Johnston <matt@ucc.asn.au>
parents:
591
diff
changeset
|
172 } |
505
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
173 return; |
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
174 } |
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
175 } |
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
176 } |
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
177 |
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
178 void cli_recv_msg_request_failure() { |
551
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
179 m_list_elem *iter; |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
180 for (iter = cli_opts.remotefwds->first; iter; iter = iter->next) { |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
181 struct TCPFwdEntry *fwd = (struct TCPFwdEntry*)iter->item; |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
182 if (!fwd->have_reply) { |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
183 fwd->have_reply = 1; |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
184 dropbear_log(LOG_WARNING, "Remote TCP forward request failed (port %d -> %s:%d)", fwd->listenport, fwd->connectaddr, fwd->connectport); |
505
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
185 return; |
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
186 } |
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
187 } |
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
188 } |
805e557fdff7
Report errors if a remote request fails
Matt Johnston <matt@ucc.asn.au>
parents:
259
diff
changeset
|
189 |
64 | 190 void setup_remotetcp() { |
551
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
191 m_list_elem *iter; |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
156
diff
changeset
|
192 TRACE(("enter setup_remotetcp")) |
66
38c3146aa23d
Some more sanity-checking of args, and just warn and ignore OpenSSH args
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
193 |
551
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
194 for (iter = cli_opts.remotefwds->first; iter; iter = iter->next) { |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
195 struct TCPFwdEntry *fwd = (struct TCPFwdEntry*)iter->item; |
578
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
196 if (!fwd->listenaddr) |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
197 { |
857 | 198 /* we store the addresses so that we can compare them |
199 when the server sends them back */ | |
578
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
200 if (opts.listen_fwd_all) { |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
201 fwd->listenaddr = m_strdup(""); |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
202 } else { |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
203 fwd->listenaddr = m_strdup("localhost"); |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
204 } |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
205 } |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
206 send_msg_global_request_remotetcp(fwd->listenaddr, fwd->listenport); |
64 | 207 } |
208 | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
156
diff
changeset
|
209 TRACE(("leave setup_remotetcp")) |
64 | 210 } |
211 | |
212 static int newtcpforwarded(struct Channel * channel) { | |
213 | |
578
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
214 char *origaddr = NULL; |
64 | 215 unsigned int origport; |
551
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
216 m_list_elem * iter = NULL; |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
217 struct TCPFwdEntry *fwd; |
64 | 218 char portstring[NI_MAXSERV]; |
70
b0316ce64e4b
Merging in the changes from 0.41-0.43 main Dropbear tree
Matt Johnston <matt@ucc.asn.au>
parents:
66
diff
changeset
|
219 int err = SSH_OPEN_ADMINISTRATIVELY_PROHIBITED; |
64 | 220 |
578
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
221 origaddr = buf_getstring(ses.payload, NULL); |
64 | 222 origport = buf_getint(ses.payload); |
223 | |
899
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
224 /* Find which port corresponds. First try and match address as well as port, |
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
225 in case they want to forward different ports separately ... */ |
551
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
226 for (iter = cli_opts.remotefwds->first; iter; iter = iter->next) { |
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
227 fwd = (struct TCPFwdEntry*)iter->item; |
578
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
228 if (origport == fwd->listenport |
899
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
229 && strcmp(origaddr, fwd->listenaddr) == 0) { |
64 | 230 break; |
231 } | |
232 } | |
233 | |
899
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
234 if (!iter) |
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
235 { |
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
236 /* ... otherwise try to generically match the only forwarded port |
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
237 without address (also handles ::1 vs 127.0.0.1 vs localhost case). |
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
238 rfc4254 is vague about the definition of "address that was connected" */ |
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
239 for (iter = cli_opts.remotefwds->first; iter; iter = iter->next) { |
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
240 fwd = (struct TCPFwdEntry*)iter->item; |
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
241 if (origport == fwd->listenport) { |
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
242 break; |
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
243 } |
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
244 } |
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
245 } |
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
246 |
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
247 |
64 | 248 if (iter == NULL) { |
249 /* We didn't request forwarding on that port */ | |
899
115f8a3c2d5a
- Fix dbclient with port 0 for server-allocated
Matt Johnston <matt@ucc.asn.au>
parents:
857
diff
changeset
|
250 cleantext(origaddr); |
578
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
251 dropbear_log(LOG_INFO, "Server sent unrequested forward from \"%s:%d\"", |
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
252 origaddr, origport); |
64 | 253 goto out; |
254 } | |
255 | |
551
c3f2ec71e3d4
New standard linked list to use, rather than adhoc SignKeyList or TCPFwdList
Matt Johnston <matt@ucc.asn.au>
parents:
505
diff
changeset
|
256 snprintf(portstring, sizeof(portstring), "%d", fwd->connectport); |
1025 | 257 channel->conn_pending = connect_remote(fwd->connectaddr, portstring, channel_connect_done, channel); |
941
5daedffd0769
Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents:
899
diff
changeset
|
258 |
5daedffd0769
Set tcp priority as follows:
Matt Johnston <matt@ucc.asn.au>
parents:
899
diff
changeset
|
259 channel->prio = DROPBEAR_CHANNEL_PRIO_UNKNOWABLE; |
64 | 260 |
70
b0316ce64e4b
Merging in the changes from 0.41-0.43 main Dropbear tree
Matt Johnston <matt@ucc.asn.au>
parents:
66
diff
changeset
|
261 err = SSH_OPEN_IN_PROGRESS; |
64 | 262 |
263 out: | |
578
44f486b72427
- tcpfwd bindaddr support against trunk. needs merging.
Matt Johnston <matt@ucc.asn.au>
parents:
551
diff
changeset
|
264 m_free(origaddr); |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
156
diff
changeset
|
265 TRACE(("leave newtcpdirect: err %d", err)) |
70
b0316ce64e4b
Merging in the changes from 0.41-0.43 main Dropbear tree
Matt Johnston <matt@ucc.asn.au>
parents:
66
diff
changeset
|
266 return err; |
64 | 267 } |
156
8c2b3506f112
Rearrange preprocessor parts so that compilation with various options
Matt Johnston <matt@ucc.asn.au>
parents:
108
diff
changeset
|
268 #endif /* ENABLE_CLI_REMOTETCPFWD */ |