~ubuntu-branches/ubuntu/trusty/dante/trusty-proposed

« back to all changes in this revision

Viewing changes to lib/msproxy_clientprotocol.c

  • Committer: Bazaar Package Importer
  • Author(s): Adrian Bridgett
  • Date: 2002-04-07 12:45:55 UTC
  • Revision ID: james.westby@ubuntu.com-20020407124555-qke8rt2tdor0naz2
Tags: upstream-1.1.11.12p1
ImportĀ upstreamĀ versionĀ 1.1.11.12p1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 1997, 1998, 1999, 2000, 2001
 
3
 *      Inferno Nettverk A/S, Norway.  All rights reserved.
 
4
 *
 
5
 * Redistribution and use in source and binary forms, with or without
 
6
 * modification, are permitted provided that the following conditions
 
7
 * are met:
 
8
 * 1. The above copyright notice, this list of conditions and the following
 
9
 *    disclaimer must appear in all copies of the software, derivative works
 
10
 *    or modified versions, and any portions thereof, aswell as in all
 
11
 *    supporting documentation.
 
12
 * 2. All advertising materials mentioning features or use of this software
 
13
 *    must display the following acknowledgement:
 
14
 *      This product includes software developed by
 
15
 *      Inferno Nettverk A/S, Norway.
 
16
 * 3. The name of the author may not be used to endorse or promote products
 
17
 *    derived from this software without specific prior written permission.
 
18
 *
 
19
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 
20
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 
21
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 
22
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 
23
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
24
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 
25
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 
26
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
27
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 
28
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
29
 *
 
30
 * Inferno Nettverk A/S requests users of this software to return to
 
31
 *
 
32
 *  Software Distribution Coordinator  or  sdc@inet.no
 
33
 *  Inferno Nettverk A/S
 
34
 *  Oslo Research Park
 
35
 *  Gaustadallļæ½en 21
 
36
 *  NO-0349 Oslo
 
37
 *  Norway
 
38
 *
 
39
 * any improvements or extensions that they make and grant Inferno Nettverk A/S
 
40
 * the rights to redistribute these changes.
 
41
 *
 
42
 */
 
43
 
 
44
/*
 
45
 * This code is terrible so hopefully it will match the protocol.
 
46
 */
 
47
 
 
48
#include "common.h"
 
49
 
 
50
static const char rcsid[] =
 
51
"$Id: msproxy_clientprotocol.c,v 1.29 2001/12/12 14:42:12 karls Exp $";
 
52
 
 
53
static char executable[] = "TELNET.EXE";
 
54
static struct sigaction oldsigio;
 
55
 
 
56
__BEGIN_DECLS
 
57
 
 
58
static int
 
59
msproxy_connect __P((int s, int control, struct socks_t *packet));
 
60
 
 
61
static int
 
62
msproxy_bind __P((int s, int control, struct socks_t *packet));
 
63
 
 
64
static char *
 
65
mem2response __P((struct msproxy_response_t *res, char *mem, size_t len));
 
66
 
 
67
static char *
 
68
request2mem __P((const struct msproxy_request_t *req, char *mem));
 
69
 
 
70
static void
 
71
msproxy_sessionsend __P((void));
 
72
/*
 
73
 * Terminates all msproxy sessions.
 
74
 */
 
75
 
 
76
static void
 
77
msproxy_sessionend __P((int s, struct msproxy_state_t *msproxy));
 
78
/*
 
79
 * ends the session negotiated with "s" and having state "msproxy".
 
80
 */
 
81
 
 
82
static void
 
83
msproxy_keepalive __P((int signal));
 
84
/*
 
85
 * Sends a keepalive packet on behalf of all established sessions.
 
86
 */
 
87
 
 
88
static void
 
89
sigio __P((int sig));
 
90
 
 
91
__END_DECLS
 
92
 
 
93
int
 
94
msproxy_init(void)
 
95
{
 
96
        const char *function = "msproxy_init()";
 
97
        struct itimerval timerval;
 
98
        struct sigaction sigact, oldsigact;
 
99
 
 
100
        if (atexit(msproxy_sessionsend) != 0) {
 
101
                swarn("%s: atexit()", function);
 
102
                return -1;
 
103
        }
 
104
 
 
105
        if (sigaction(SIGALRM, NULL, &oldsigact) != 0) {
 
106
                swarn("%s: sigaction(SIGALRM)", function);
 
107
                return -1;
 
108
        }
 
109
 
 
110
        /* XXX */
 
111
        if (oldsigact.sa_handler != SIG_DFL
 
112
        &&  oldsigact.sa_handler != SIG_IGN) {
 
113
                swarnx("%s: could not install signalhandler for SIGALRM, already set",
 
114
                function);
 
115
                return 0;       /* will probably timeout, don't consider it fatal for now. */
 
116
        }
 
117
 
 
118
        sigemptyset(&sigact.sa_mask);
 
119
        sigact.sa_flags = SA_RESTART;
 
120
        sigact.sa_handler       = msproxy_keepalive;
 
121
        if (sigaction(SIGALRM, &sigact, NULL) != 0) {
 
122
                swarn("%s: sigaction(SIGALRM)", function);
 
123
                return -1;
 
124
        }
 
125
 
 
126
        timerval.it_value.tv_sec        = MSPROXY_PINGINTERVAL;
 
127
        timerval.it_value.tv_usec       = 0;
 
128
        timerval.it_interval = timerval.it_value;
 
129
 
 
130
        if (setitimer(ITIMER_REAL, &timerval, NULL) != 0) {
 
131
                swarn("%s: setitimer()", function);
 
132
                return -1;
 
133
        }
 
134
 
 
135
        srand((unsigned int)time(NULL) * getpid());
 
136
 
 
137
        return 0;
 
138
}
 
139
 
 
140
int
 
141
msproxy_negotiate(s, control, packet)
 
142
        int s;
 
143
        int control;
 
144
        struct socks_t *packet;
 
145
{
 
146
        const char *function = "msproxy_negotiate()";
 
147
        char string[MAXSOCKADDRSTRING];
 
148
        struct msproxy_request_t req;
 
149
        struct msproxy_response_t res;
 
150
        int p;
 
151
 
 
152
        slog(LOG_DEBUG, "%s: packet #1", function);
 
153
 
 
154
        bzero(&req, sizeof(req));
 
155
        req.clientid    = htonl(0x0a000000);
 
156
        req.command             = htons(MSPROXY_HELLO);
 
157
 
 
158
        /* in case we don't get something more sensible. */
 
159
        packet->res.version     = packet->req.version;
 
160
        packet->res.reply               = MSPROXY_FAILURE;
 
161
 
 
162
        switch (packet->req.command) {
 
163
                case SOCKS_BIND:
 
164
#if 1
 
165
                        req.packet._1.magic5            = htons(0x4800);
 
166
                        req.packet._1.magic10   = htons(0x1400);
 
167
                        req.packet._1.magic15   = htons(0x0400);
 
168
                        req.packet._1.magic20   = htons(0x5704);
 
169
                        req.packet._1.magic25   = htons(0x0004);
 
170
                        req.packet._1.magic30   = htons(0x0100);
 
171
                        req.packet._1.magic35   = htons(0x4a02);
 
172
                        req.packet._1.magic40   = htons(0x3000);
 
173
                        req.packet._1.magic45   = htons(0x4100);
 
174
                        req.packet._1.magic50   = htons(0x3900);
 
175
#endif
 
176
                        break;
 
177
 
 
178
                case SOCKS_CONNECT:
 
179
#if 0
 
180
                        req.packet._1.magic5            = htons(0x4b00);
 
181
                        req.packet._1.magic10   = htons(0x1400);
 
182
                        req.packet._1.magic15   = htons(0x0400);
 
183
                        req.packet._1.magic20   = htons(0x5704);
 
184
                        req.packet._1.magic25   = htons(0x0004);
 
185
                        req.packet._1.magic30   = htons(0x0100);
 
186
                        req.packet._1.magic35   = htons(0x4a02);
 
187
                        req.packet._1.magic40   = htons(0x3000);
 
188
                        req.packet._1.magic45   = htons(0x4400);
 
189
                        req.packet._1.magic50   = htons(0x3900);
 
190
#endif
 
191
                        break;
 
192
 
 
193
                case SOCKS_UDPASSOCIATE:
 
194
                        SERRX(packet->req.command);
 
195
                        /* NOTREACHED */
 
196
 
 
197
                default:
 
198
                        SERRX(packet->req.command);
 
199
        }
 
200
 
 
201
        if (socks_getusername(&packet->gw.host, req.username, sizeof(req.username))
 
202
        == NULL)
 
203
                return -1;
 
204
 
 
205
        *req.unknown = NUL;
 
206
 
 
207
        strncpy(req.executable, executable, sizeof(req.executable) - 1);
 
208
        req.executable[sizeof(req.executable) - 1] = NUL;
 
209
 
 
210
        *req.clienthost = NUL;
 
211
 
 
212
#if 0
 
213
        strncpy(req.clienthost, "foo", sizeof(req.clienthost) - 1);
 
214
        req.clienthost[sizeof(req.clienthost) - 1] = NUL;
 
215
#endif
 
216
 
 
217
        if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
 
218
                return -1;
 
219
 
 
220
        if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
 
221
                return -1;
 
222
 
 
223
        if (strcmp(res.RWSP, "RWSP") != 0)
 
224
                serrx(EXIT_FAILURE, "expected \"RWSP\", got \"%s\"",
 
225
                str2vis(res.RWSP, sizeof(res.RWSP)));
 
226
 
 
227
        if (ntohs(res.command) >> 8 != 0x10)
 
228
                serrx(EXIT_FAILURE, "expected res.command = 10??, is %x",
 
229
                ntohs(res.command));
 
230
 
 
231
        packet->state.msproxy.controladdr.sin_family                    = AF_INET;
 
232
        packet->state.msproxy.controladdr.sin_port                      = res.packet._1.udpport;
 
233
        packet->state.msproxy.controladdr.sin_addr.s_addr       = res.packet._1.udpaddr;
 
234
 
 
235
        packet->state.msproxy.clientid  = htonl(rand());
 
236
        packet->state.msproxy.serverid  = res.serverid;
 
237
 
 
238
        slog(LOG_DEBUG, "%s: clientid: 0x%x, serverid: 0x%0x",
 
239
        function, packet->state.msproxy.clientid, packet->state.msproxy.serverid);
 
240
 
 
241
        /* LINTED pointer casts may be troublesome */
 
242
        slog(LOG_DEBUG, "%s: msproxy controladdress: %s",
 
243
        function,
 
244
        sockaddr2string((struct sockaddr *)&packet->state.msproxy.controladdr,
 
245
        string, sizeof(string)));
 
246
 
 
247
 
 
248
        slog(LOG_DEBUG, "%s: packet #2", function);
 
249
 
 
250
        /* almost identical. */
 
251
        req.clientid    = packet->state.msproxy.clientid;
 
252
        req.serverid    = packet->state.msproxy.serverid;
 
253
 
 
254
        if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
 
255
                return -1;
 
256
 
 
257
        if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
 
258
                return -1;
 
259
 
 
260
        if (res.serverid != packet->state.msproxy.serverid)
 
261
                serrx(EXIT_FAILURE, "expected serverid = 0x%x, is 0x%x",
 
262
                packet->state.msproxy.serverid, res.serverid);
 
263
 
 
264
        if (res.sequence != 0x01)
 
265
                serrx(EXIT_FAILURE, "expected res.sequence = 0x%x, is 0x%x",
 
266
                0x01, res.sequence);
 
267
 
 
268
        if (ntohs(res.command) != MSPROXY_USERINFO_ACK)
 
269
                serrx(EXIT_FAILURE, "expected res.command = 0x%x, is 0x%x",
 
270
                MSPROXY_USERINFO_ACK, ntohs(res.command));
 
271
 
 
272
        switch (packet->req.command) {
 
273
                case SOCKS_BIND:
 
274
                        p = msproxy_bind(s, control, packet);
 
275
                        break;
 
276
 
 
277
                case SOCKS_CONNECT:
 
278
                        p = msproxy_connect(s, control, packet);
 
279
                        break;
 
280
 
 
281
                case SOCKS_UDPASSOCIATE:
 
282
                default:
 
283
                        SERRX(packet->req.command);
 
284
        }
 
285
 
 
286
        return p;
 
287
}
 
288
 
 
289
static int
 
290
msproxy_connect(s, control, packet)
 
291
        int s;
 
292
        int control;
 
293
        struct socks_t *packet;
 
294
{
 
295
        const char *function = "msproxy_connect()";
 
296
        char string[MAXSOCKSHOSTSTRING];
 
297
        struct msproxy_request_t req;
 
298
        struct msproxy_response_t res;
 
299
        struct sockaddr_in addr;
 
300
        socklen_t len;
 
301
 
 
302
        slog(LOG_DEBUG, function);
 
303
 
 
304
#if 0
 
305
 
 
306
        bzero(&req, sizeof(req));
 
307
        req.clientid            = packet->state.msproxy.clientid;
 
308
        req.serverid            = packet->state.msproxy.serverid;
 
309
        req.command                     = htons(MSPROXY_SOMETHING);
 
310
        memcpy(req.packet._3.NTLMSSP, "NTLMSSP", sizeof("NTLMSSP"));
 
311
        req.packet._3.bindaddr  = htonl(0x02000000);
 
312
        req.packet._3.magic5            = htons(0x0100);
 
313
        req.packet._3.magic10   = htons(0x9682);
 
314
#if 0
 
315
        req.packet._3.magic50   = htons(0x3000);
 
316
        req.packet._3.magic55   = htons(0x3000);
 
317
#endif
 
318
 
 
319
        if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
 
320
                return -1;
 
321
 
 
322
        if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
 
323
                return -1;
 
324
 
 
325
        if (res.serverid != packet->state.msproxy.serverid)
 
326
                serrx(EXIT_FAILURE, "expected serverid = 0x%x, is 0x%x",
 
327
                packet->state.msproxy.serverid, res.serverid);
 
328
 
 
329
        if (ntohs(res.command) != MSPROXY_SOMETHING_1_ACK)
 
330
                serrx(EXIT_FAILURE, "expected res.command = 0x%x, is 0x%x",
 
331
                MSPROXY_SOMETHING_1_ACK, ntohs(res.command));
 
332
 
 
333
        slog(LOG_DEBUG, "%s: ntdomain: \"%s\"", function, res.packet._3.ntdomain);
 
334
 
 
335
 
 
336
        slog(LOG_DEBUG, "%s: packet #4", function);
 
337
 
 
338
        bzero(&req, sizeof(req));
 
339
        req.clientid            = packet->state.msproxy.clientid;
 
340
        req.serverid            = packet->state.msproxy.serverid;
 
341
        req.command                     = htons(MSPROXY_SOMETHING_2);
 
342
#if 0
 
343
        memcpy(req.packet._4.NTLMSSP, "NTLMSSP", sizeof("NTLMSSP"));
 
344
        req.packet._4.magic3                    = htons(0x0200);
 
345
        req.packet._4.magic5                    = htons(0x0300);
 
346
        req.packet._4.magic10           = htons(0x1800);
 
347
        req.packet._4.magic15           = htons(0x1800);
 
348
        req.packet._4.magic20           = htons(0x4900);
 
349
        req.packet._4.magic30           = htons(0x6100);
 
350
        req.packet._4.magic35           = htons(0x0800);
 
351
        req.packet._4.magic40           = htons(0x0800);
 
352
        req.packet._4.magic45           = htons(0x3400);
 
353
        req.packet._4.magic50           = htons(0x0700);
 
354
        req.packet._4.magic55           = htons(0x0700);
 
355
        req.packet._4.magic60           = htons(0x3c00);
 
356
        req.packet._4.magic65           = htons(0x0600);
 
357
        req.packet._4.magic70           = htons(0x0600);
 
358
        req.packet._4.magic75           = htons(0x4300);
 
359
#endif
 
360
 
 
361
        if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
 
362
                return -1;
 
363
 
 
364
        if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
 
365
                return -1;
 
366
 
 
367
        if (res.serverid != packet->state.msproxy.serverid)
 
368
                serrx(EXIT_FAILURE, "expected res.serverid = 0x%x, is 0x%x",
 
369
                packet->state.msproxy.serverid, res.serverid);
 
370
 
 
371
        if (res.clientack != 0x01)
 
372
                serrx(EXIT_FAILURE, "expected res.clientack = 0x%x, is 0x%x",
 
373
                0x01, res.clientack);
 
374
 
 
375
        if (ntohs(res.command) >> 8 != 0x47)
 
376
                serrx(EXIT_FAILURE, "expected res.command = 47??, is 0x%x",
 
377
                ntohs(res.command));
 
378
#endif
 
379
 
 
380
        switch (packet->req.host.atype) {
 
381
                case SOCKS_ADDR_IPV4:
 
382
                        /* LINTED pointer casts may be troublesome */
 
383
                        sockshost2sockaddr(&packet->req.host, (struct sockaddr *)&addr);
 
384
                        break;
 
385
 
 
386
                case SOCKS_ADDR_DOMAIN:
 
387
                        slog(LOG_DEBUG, "%s: resolve packet", function);
 
388
 
 
389
                        bzero(&req, sizeof(req));
 
390
                        req.clientid    = packet->state.msproxy.clientid;
 
391
                        req.serverid    = packet->state.msproxy.serverid;
 
392
 
 
393
                        req.command     = htons(MSPROXY_RESOLVE);
 
394
                        req.packet.resolve.hostlength
 
395
                        = (unsigned char)(strlen(packet->req.host.addr.domain) + 1);
 
396
                        memcpy(&req.packet.resolve.host, packet->req.host.addr.domain,
 
397
                        (size_t)req.packet.resolve.hostlength);
 
398
 
 
399
                        if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
 
400
                                return -1;
 
401
 
 
402
                        if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
 
403
                                return -1;
 
404
 
 
405
                        if (ntohs(res.command) != MSPROXY_RESOLVE_ACK)
 
406
                                serrx(EXIT_FAILURE, "expected res.command = 0x%x, is 0x%x",
 
407
                                MSPROXY_RESOLVE_ACK, ntohs(res.command));
 
408
 
 
409
                        addr.sin_addr.s_addr = res.packet.resolve.hostaddr;
 
410
                        slog(LOG_DEBUG, "%s: IP address of %s: %s",
 
411
                        function, packet->req.host.addr.domain, inet_ntoa(addr.sin_addr));
 
412
 
 
413
                        break;
 
414
 
 
415
                default:
 
416
                        SERRX(packet->req.host.atype);
 
417
        }
 
418
 
 
419
 
 
420
        slog(LOG_DEBUG, "%s: packet #5", function);
 
421
 
 
422
        bzero(&req, sizeof(req));
 
423
        req.clientid    = packet->state.msproxy.clientid;
 
424
        req.serverid    = packet->state.msproxy.serverid;
 
425
        req.command             = htons(MSPROXY_CONNECT);
 
426
        req.packet._5.magic6            = htons(0x0200);
 
427
        req.packet._5.destport  = packet->req.host.port;
 
428
        req.packet._5.destaddr  = addr.sin_addr.s_addr;
 
429
 
 
430
        /*
 
431
         * need to tell server what port we will connect from, so if socket
 
432
         * is not bound, bind it.
 
433
         */
 
434
 
 
435
        len = sizeof(addr);
 
436
        /* LINTED pointer casts may be troublesome */
 
437
        if (getsockname(s, (struct sockaddr *)&addr, &len) != 0)
 
438
                return -1;
 
439
 
 
440
        if (!ADDRISBOUND(addr)) {
 
441
                /*
 
442
                 * Don't have any specific preference for what address to bind and
 
443
                 * proxyserver only expects to be told port.
 
444
                 */
 
445
 
 
446
                addr.sin_addr.s_addr = htonl(INADDR_ANY);
 
447
                /* LINTED pointer casts may be troublesome */
 
448
                if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) != 0)
 
449
                        return -1;
 
450
 
 
451
                len = sizeof(addr);
 
452
                /* LINTED pointer casts may be troublesome */
 
453
                if (getsockname(s, (struct sockaddr *)&addr, &len) != 0)
 
454
                        return -1;
 
455
        }
 
456
        req.packet._5.srcport = addr.sin_port;
 
457
 
 
458
        if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
 
459
                return -1;
 
460
 
 
461
        if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
 
462
                return -1;
 
463
 
 
464
        if (ntohs(res.command) != MSPROXY_CONNECT_ACK) {
 
465
                swarnx("expected res.command = 0x%x, is 0x%x",
 
466
                MSPROXY_CONNECT_ACK, ntohs(res.command));
 
467
                packet->res.reply = MSPROXY_NOTALLOWED;
 
468
                return -1;
 
469
        }
 
470
 
 
471
        packet->res.host.atype                                  = SOCKS_ADDR_IPV4;
 
472
        packet->res.host.port                                   = res.packet._5.clientport;
 
473
        packet->res.host.addr.ipv4.s_addr       = res.packet._5.clientaddr;
 
474
 
 
475
        if (socks_connect(s, &packet->res.host) != 0) {
 
476
                swarn("%s: failed to connect to %s",
 
477
                function, sockshost2string(&packet->res.host, string, sizeof(string)));
 
478
                return -1;
 
479
        }
 
480
        else
 
481
                slog(LOG_DEBUG, "%s: connected to %s",
 
482
                function, sockshost2string(&packet->res.host, string, sizeof(string)));
 
483
 
 
484
        packet->res.host.atype                                  = SOCKS_ADDR_IPV4;
 
485
        packet->res.host.port                                   = res.packet._5.clientport;
 
486
        packet->res.host.addr.ipv4.s_addr       = res.packet._5.clientaddr;
 
487
 
 
488
        /* LINTED pointer casts may be troublesome */
 
489
        slog(LOG_DEBUG, "%s: server will use as source address: %s",
 
490
        function, sockshost2string(&packet->res.host, string, sizeof(string)));
 
491
 
 
492
 
 
493
        slog(LOG_DEBUG, "%s: packet #6", function);
 
494
 
 
495
        bzero(&req, sizeof(req));
 
496
        req.clientid    = packet->state.msproxy.clientid;
 
497
        req.serverid    = packet->state.msproxy.serverid;
 
498
        req.command             = htons(MSPROXY_CONNECTED);
 
499
 
 
500
        if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
 
501
                return -1;
 
502
 
 
503
 
 
504
        /* make response look sensible. */
 
505
        packet->res.version                                             = packet->req.version;
 
506
        packet->res.reply                                                       = MSPROXY_SUCCESS;
 
507
        packet->res.flag                                                        = 0;
 
508
        packet->res.auth                                                        = NULL;
 
509
 
 
510
        return 0;
 
511
}
 
512
 
 
513
static int
 
514
msproxy_bind(s, control, packet)
 
515
        int s;
 
516
        int control;
 
517
        struct socks_t *packet;
 
518
{
 
519
        const char *function = "msproxy_bind()";
 
520
        char string[MAXSOCKSHOSTSTRING];
 
521
        struct msproxy_request_t req;
 
522
        struct msproxy_response_t res;
 
523
        struct sockaddr_in addr;
 
524
        socklen_t len;
 
525
 
 
526
        slog(LOG_DEBUG, function);
 
527
 
 
528
        bzero(&req, sizeof(req));
 
529
        req.clientid            = packet->state.msproxy.clientid;
 
530
        req.serverid            = packet->state.msproxy.serverid;
 
531
        req.command                     = htons(MSPROXY_BIND);
 
532
        req.packet._3.magic2            = htons(0x0100);
 
533
        req.packet._3.bindaddr  = packet->req.host.addr.ipv4.s_addr;
 
534
        req.packet._3.bindport  = packet->req.host.port;
 
535
        req.packet._3.magic3            = htons(0x0200);
 
536
        len = sizeof(addr);
 
537
        /* LINTED pointer casts may be troublesome */
 
538
        if (getsockname(s, (struct sockaddr *)&addr, &len) != 0)
 
539
                return -1;
 
540
        req.packet._3.boundport = addr.sin_port;
 
541
 
 
542
        if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
 
543
                return -1;
 
544
 
 
545
        if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
 
546
                return -1;
 
547
 
 
548
        if (res.serverid != packet->state.msproxy.serverid)
 
549
                serrx(EXIT_FAILURE, "expected serverid = 0x%x, is 0x%x",
 
550
                packet->state.msproxy.serverid, res.serverid);
 
551
 
 
552
        if (ntohs(res.command) != MSPROXY_BIND_ACK) {
 
553
                swarnx("expected res.command = 0x%x, is 0x%x",
 
554
                MSPROXY_BIND_ACK, ntohs(res.command));
 
555
                packet->res.reply = MSPROXY_NOTALLOWED;
 
556
                return -1;
 
557
        }
 
558
 
 
559
        packet->state.msproxy.bindid = res.packet._3.magic10;
 
560
        packet->res.host.atype                                  = SOCKS_ADDR_IPV4;
 
561
        packet->res.host.port                                   = res.packet._3.boundport;
 
562
        packet->res.host.addr.ipv4.s_addr       = res.packet._3.boundaddr;
 
563
 
 
564
        slog(LOG_DEBUG, "%s: server bound for us: %s",
 
565
        function, sockshost2string(&packet->res.host, string, sizeof(string)));
 
566
 
 
567
        slog(LOG_DEBUG, "%s: packet #4", function);
 
568
 
 
569
        bzero(&req, sizeof(req));
 
570
        req.clientid    = packet->state.msproxy.clientid;
 
571
        req.serverid    = packet->state.msproxy.serverid;
 
572
        req.command             = htons(MSPROXY_BIND2);
 
573
        req.packet._4.magic1            = htons(0x0100);
 
574
        req.packet._4.magic2            = packet->state.msproxy.bindid;
 
575
        req.packet._4.magic3            = htons(0x0500);
 
576
        memcpy(req.packet._4.pad3 + 2, &addr.sin_port, sizeof(addr.sin_port));
 
577
        req.packet._4.magic4            = htons(0x0200);
 
578
        req.packet._4.boundport = addr.sin_port;
 
579
 
 
580
        if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
 
581
                return -1;
 
582
 
 
583
        if (recv_mspresponse(control, &packet->state.msproxy, &res) == -1)
 
584
                return -1;
 
585
 
 
586
        if (res.serverid != packet->state.msproxy.serverid)
 
587
                serrx(EXIT_FAILURE, "expected res.serverid = 0x%x, is 0x%x",
 
588
                packet->state.msproxy.serverid, res.serverid);
 
589
 
 
590
        if (res.clientack != 0x01)
 
591
                serrx(EXIT_FAILURE, "expected res.clientack = 0x%x, is 0x%x",
 
592
                0x01, res.clientack);
 
593
 
 
594
        if (ntohs(res.command) != MSPROXY_BIND2_ACK) {
 
595
                swarnx("expected res.command = %x, is 0x%x",
 
596
                MSPROXY_BIND2_ACK, ntohs(res.command));
 
597
                return -1;
 
598
        }
 
599
 
 
600
 
 
601
        slog(LOG_DEBUG, "%s: packet #5", function);
 
602
 
 
603
        bzero(&req, sizeof(req));
 
604
        req.clientid    = packet->state.msproxy.clientid;
 
605
        req.serverid    = packet->state.msproxy.serverid;
 
606
        req.command             = htons(MSPROXY_LISTEN);
 
607
        req.packet._5.magic6            = htons(0x0200);
 
608
        req.packet._5.destport  = packet->res.host.port;
 
609
        req.packet._5.destaddr  = packet->res.host.addr.ipv4.s_addr;
 
610
 
 
611
        if (send_msprequest(control, &packet->state.msproxy, &req) == -1)
 
612
                return -1;
 
613
 
 
614
        /*
 
615
         * When the server accepts the client, it will send us a new
 
616
         * controlpacket.  That will be caught in sigio().
 
617
         */
 
618
 
 
619
        slog(LOG_DEBUG, "%s: waiting for forwarded connection...", function);
 
620
 
 
621
        /* make response look sensible. */
 
622
        packet->res.version                                             = packet->req.version;
 
623
        packet->res.reply                                                       = MSPROXY_SUCCESS;
 
624
        packet->res.flag                                                        = 0;
 
625
        packet->res.auth                                                        = NULL;
 
626
 
 
627
        return 0;
 
628
}
 
629
 
 
630
int
 
631
msproxy_sigio(s)
 
632
        int s;
 
633
{
 
634
        const char *function = "msproxy_sigio()";
 
635
        static int init;
 
636
        const int errno_s = errno;
 
637
        struct socksfd_t *socksfd;
 
638
        int p;
 
639
 
 
640
        /*
 
641
         * The msproxy protocol sends a udp packet which we must ack
 
642
         * before it will connect to us.  We set up the controlsocket
 
643
         * for signaldriven i/o so we can ack it asynchronously.
 
644
         *
 
645
         */
 
646
 
 
647
        SASSERTX(socks_addrisok((unsigned int)s));
 
648
        socksfd = socks_getaddr((unsigned int)s);
 
649
        SASSERTX(socksfd->state.version == MSPROXY_V2);
 
650
 
 
651
        if (!init) { /* could be smarter about this... */
 
652
                struct sigaction sigact;
 
653
 
 
654
                sigemptyset(&sigact.sa_mask);
 
655
                sigact.sa_flags = SA_RESTART;
 
656
                sigact.sa_handler       = sigio;
 
657
                if (sigaction(SIGIO, &sigact, &oldsigio) != 0)
 
658
                        return -1;
 
659
 
 
660
                init = 1;
 
661
        }
 
662
 
 
663
        if (fcntl(socksfd->control, F_SETOWN, getpid()) == -1)
 
664
                return -1;
 
665
 
 
666
        p = 1;
 
667
        if (ioctl(socksfd->control, FIOASYNC, &p) == -1)
 
668
                return -1;
 
669
 
 
670
        slog(LOG_DEBUG, "%s: set up sigio for %d", function, socksfd->control);
 
671
 
 
672
        errno = errno_s;
 
673
        return 0;
 
674
}
 
675
 
 
676
/* ARGSUSED */
 
677
static void
 
678
sigio(sig)
 
679
        int sig;
 
680
{
 
681
        const char *function = "sigio()";
 
682
        const int errno_s = errno;
 
683
        char string[MAXSOCKSHOSTSTRING];
 
684
        int i, max, dset;
 
685
        struct socksfd_t *socksfd;
 
686
        fd_set rset;
 
687
        struct timeval timeout;
 
688
        int dbits;
 
689
 
 
690
        slog(LOG_DEBUG, function);
 
691
 
 
692
        /*
 
693
         * Find the socket we were signalled for.
 
694
         */
 
695
 
 
696
        dbits = -1;
 
697
        FD_ZERO(&rset);
 
698
 
 
699
        for (i = 0, max = getdtablesize(); i < max; ++i) {
 
700
                if ((socksfd = socks_getaddr((unsigned int)i)) == NULL)
 
701
                        continue;
 
702
 
 
703
                if (socksfd->state.command != SOCKS_BIND
 
704
                ||  socksfd->state.version != MSPROXY_V2
 
705
                || !socksfd->state.inprogress)
 
706
                        continue;
 
707
 
 
708
                if (!socks_addrisok((unsigned int)i))
 
709
                        continue;
 
710
 
 
711
                SASSERTX(fdisopen(socksfd->control));
 
712
 
 
713
                FD_SET(socksfd->control, &rset);
 
714
                dbits = MAX(dbits, socksfd->control);
 
715
        }
 
716
 
 
717
        if (dbits == -1) {
 
718
                if (oldsigio.sa_handler != NULL)
 
719
                        oldsigio.sa_handler(sig);
 
720
                return; /* old signal handler. */
 
721
        }
 
722
 
 
723
        dset = 0;
 
724
        do {
 
725
                fd_set newrset;
 
726
                timeout.tv_sec          = 0;
 
727
                timeout.tv_usec = 0;
 
728
 
 
729
                newrset = rset;
 
730
                switch (selectn(dbits + 1, &newrset, NULL, NULL, &timeout)) {
 
731
                        case -1:
 
732
                                SERR(-1);
 
733
                                /* NOTREACHED */
 
734
 
 
735
                        case 0:
 
736
                                dset = 0;
 
737
                                slog(LOG_DEBUG, "%s: no descriptors readable", function);
 
738
                                if (oldsigio.sa_handler != NULL)
 
739
                                        oldsigio.sa_handler(sig);
 
740
                                break;
 
741
 
 
742
                        default: {
 
743
                                dset = 1;
 
744
                                for (i = 0, max = getdtablesize(); i < max; ++i) {
 
745
                                        if ((socksfd = socks_getaddr((unsigned int)i)) == NULL)
 
746
                                                continue;
 
747
 
 
748
                                        if (FD_ISSET(socksfd->control, &newrset)) {
 
749
                                                struct sockshost_t host;
 
750
                                                struct msproxy_request_t req;
 
751
                                                struct msproxy_response_t res;
 
752
                                                int p;
 
753
 
 
754
                                                SASSERTX(socksfd->state.command == SOCKS_BIND
 
755
                                                &&                      socksfd->state.version == MSPROXY_V2
 
756
                                                &&                      socksfd->state.inprogress);
 
757
 
 
758
                                                slog(LOG_DEBUG, "%s: attempting to receive bind info...",
 
759
                                                function);
 
760
 
 
761
                                                FD_CLR(socksfd->control, &newrset);
 
762
 
 
763
                                                if (recv_mspresponse(socksfd->control,
 
764
                                                &socksfd->state.msproxy, &res) == -1)
 
765
                                                        continue;
 
766
 
 
767
                                                if (ntohs(res.command) != MSPROXY_BINDINFO) {
 
768
                                                        swarnx("%s: expected res.command = %x, is 0x%x",
 
769
                                                        function, MSPROXY_BINDINFO, ntohs(res.command));
 
770
                                                        continue;
 
771
                                                }
 
772
 
 
773
                                                /* no need for more signals on this socket. */
 
774
                                                p = 0;
 
775
                                                if (ioctl(socksfd->control, FIOASYNC, &p) == -1) {
 
776
                                                        swarn("%s: ioctl(socksfd->control)", function);
 
777
                                                        continue;
 
778
                                                }
 
779
 
 
780
                                                slog(LOG_DEBUG, "%s: turned off sigio for %d",
 
781
                                                function, socksfd->control);
 
782
 
 
783
                                                /*
 
784
                                                 * if we asked server to bind INADDR_ANY, we don't know
 
785
                                                 * what address it bound until now.
 
786
                                                 */
 
787
                                                host.atype                                      = SOCKS_ADDR_IPV4;
 
788
                                                host.port                                       = res.packet._5.boundport;
 
789
                                                host.addr.ipv4.s_addr   = res.packet._5.boundaddr;
 
790
                                                sockshost2sockaddr(&host, &socksfd->remote);
 
791
 
 
792
                                                slog(LOG_DEBUG, "%s: server bound address %s",
 
793
                                                function, sockshost2string(&host, string, sizeof(string)));
 
794
 
 
795
                                                host.atype                                      = SOCKS_ADDR_IPV4;
 
796
                                                host.port                                       = res.packet._5.clientport;
 
797
                                                host.addr.ipv4.s_addr   = res.packet._5.clientaddr;
 
798
                                                sockshost2sockaddr(&host, &socksfd->forus.accepted);
 
799
 
 
800
                                                slog(LOG_DEBUG, "%s: server accepted: %s",
 
801
                                                function, sockshost2string(&host, string, sizeof(string)));
 
802
 
 
803
                                                slog(LOG_DEBUG, "%s: server will connect to us from port %d",
 
804
                                                function, ntohs(res.packet._5.serverport));
 
805
 
 
806
                                                /* LINTED pointer casts may be troublesome */
 
807
                                                TOIN(&socksfd->reply)->sin_port = res.packet._5.serverport;
 
808
 
 
809
                                                slog(LOG_DEBUG, "%s: packet #6", function);
 
810
 
 
811
                                                bzero(&req, sizeof(req));
 
812
                                                req.clientid    = socksfd->state.msproxy.clientid;
 
813
                                                req.serverid    = socksfd->state.msproxy.serverid;
 
814
                                                req.command             = htons(MSPROXY_BINDINFO_ACK);
 
815
                                                req.packet._6.magic1                    = res.packet._5.magic1;
 
816
                                                req.packet._6.magic5                    = htons(0x0100);
 
817
                                                req.packet._6.magic10           = socksfd->state.msproxy.bindid;
 
818
                                                req.packet._6.magic15           = htons(0x0100);
 
819
                                                req.packet._6.magic16           = socksfd->state.msproxy.bindid;
 
820
                                                req.packet._6.magic20           = htons(0x0200);
 
821
                                                req.packet._6.clientport        = res.packet._5.clientport;
 
822
                                                req.packet._6.clientaddr        = res.packet._5.clientaddr;
 
823
                                                req.packet._6.magic30           = res.packet._5.magic10;
 
824
                                                req.packet._6.magic35           = res.packet._5.magic15;
 
825
                                                req.packet._6.serverport        = res.packet._5.serverport;
 
826
                                                req.packet._6.srcport           = res.packet._5.srcport;
 
827
                                                req.packet._6.boundport         = res.packet._5.boundport;
 
828
                                                req.packet._6.boundaddr         = res.packet._5.boundaddr;
 
829
 
 
830
                                                if (send_msprequest(socksfd->control, &socksfd->state.msproxy,
 
831
                                                &req) == -1)
 
832
                                                        continue;
 
833
 
 
834
                                                if (recv_mspresponse(socksfd->control,
 
835
                                                &socksfd->state.msproxy, &res) == -1)
 
836
                                                        continue;
 
837
 
 
838
                                                /* all done.  Can accept(). */
 
839
                                                socksfd->state.inprogress = 0;
 
840
                                        }
 
841
                                }
 
842
                        }
 
843
                }
 
844
        } while (dset != 0);
 
845
 
 
846
        errno = errno_s;
 
847
}
 
848
 
 
849
 
 
850
int
 
851
recv_mspresponse(s, state, response)
 
852
        int s;
 
853
        struct msproxy_state_t *state;
 
854
        struct msproxy_response_t *response;
 
855
{
 
856
        const char *function = "recv_mspresponse()";
 
857
        /* CONSTCOND */
 
858
        char responsemem[MAX(sizeof(*response), 1024)];
 
859
        ssize_t r;
 
860
 
 
861
        /* CONSTCOND */
 
862
        while (1) {
 
863
                if ((r = read(s, responsemem, sizeof(responsemem))) < MSPROXY_MINLENGTH) {
 
864
                        swarn("%s: expected to read atleast %d, read %d",
 
865
                        function, MSPROXY_MINLENGTH, r);
 
866
                        return -1;
 
867
                }
 
868
 
 
869
                if (mem2response(response, responsemem, (size_t)r) == NULL) {
 
870
                        swarnx("%s: bad response from server", function);
 
871
                        return -1;
 
872
                }
 
873
 
 
874
                if (state->seq_recv > 0) {
 
875
                        if (response->sequence == state->seq_recv + 1)
 
876
                                break; /* all ok. */
 
877
                        else if (response->sequence < state->seq_recv) {
 
878
                                /*
 
879
                                 * sequence number less that last, sometimes this happens too,
 
880
                                 * don't know why.
 
881
                                 */
 
882
                                slog(LOG_DEBUG, "%s: sequence (%d) < seq_recv (%d)",
 
883
                                function, response->sequence, state->seq_recv);
 
884
                                break;
 
885
                        }
 
886
                        else if (response->sequence == state->seq_recv) {
 
887
                                slog(LOG_DEBUG, "%s: seq_recv: %d, dup response, seqnumber: 0x%x",
 
888
                                function, state->seq_recv, response->sequence);
 
889
 
 
890
                                if (response->clientack == state->seq_sent) {
 
891
                                        slog(LOG_DEBUG,
 
892
                                        "%s: ack matches last sent though, hoping it's a new one...",
 
893
                                        function);
 
894
                                        break;
 
895
                                }
 
896
                        }
 
897
                        else if (response->sequence > state->seq_recv) {
 
898
                                slog(LOG_DEBUG, "%s: sequence (%d) > seq_recv (%d)",
 
899
                                function, response->sequence, state->seq_recv);
 
900
                                break;
 
901
                        }
 
902
                }
 
903
                else
 
904
                        break; /* not started incrementing yet. */
 
905
        }
 
906
 
 
907
        state->seq_recv = response->sequence;
 
908
 
 
909
        return r;
 
910
}
 
911
 
 
912
 
 
913
int
 
914
send_msprequest(s, state, request)
 
915
        int s;
 
916
        struct msproxy_state_t *state;
 
917
        struct msproxy_request_t *request;
 
918
{
 
919
        const char *function = "send_msprequest()";
 
920
        ssize_t w;
 
921
        char requestmem[sizeof(struct msproxy_request_t)], *p;
 
922
 
 
923
        request->magic25 = htonl(MSPROXY_VERSION);
 
924
        request->serverack = state->seq_recv;
 
925
        /* don't start incrementing sequence until we are acking packet #2. */
 
926
        request->sequence
 
927
        = (unsigned char)(request->serverack >= 2 ? state->seq_sent + 1 : 0);
 
928
 
 
929
        memcpy(request->RWSP, "RWSP", sizeof(request->RWSP));
 
930
 
 
931
        p = request2mem(request, requestmem);
 
932
 
 
933
        /* all requests must be atleast MSPROXY_MINLENGTH it seems. */
 
934
        if (p - requestmem < MSPROXY_MINLENGTH) {
 
935
                bzero(p, (size_t)(MSPROXY_MINLENGTH - (p - requestmem)));
 
936
                p = requestmem + MSPROXY_MINLENGTH;
 
937
        }
 
938
 
 
939
        if ((w = write(s, requestmem, (size_t)(p - requestmem)))
 
940
        != (ssize_t)(p - requestmem)) {
 
941
                swarn("%s: write()", function);
 
942
                return -1;
 
943
        }
 
944
        state->seq_sent = request->sequence;
 
945
 
 
946
        return w;
 
947
}
 
948
 
 
949
static char *
 
950
mem2response(res, mem, len)
 
951
        struct msproxy_response_t *res;
 
952
        char *mem;
 
953
        size_t len;
 
954
{
 
955
        const char *function = "mem2response()";
 
956
 
 
957
        if (len < sizeof(res->packetid))
 
958
                return NULL;
 
959
        memcpy(&res->packetid, mem, sizeof(res->packetid));
 
960
        mem += sizeof(res->packetid);
 
961
        len -= sizeof(res->packetid);
 
962
 
 
963
        if (len < sizeof(res->magic5))
 
964
                return NULL;
 
965
        memcpy(&res->magic5, mem, sizeof(res->magic5));
 
966
        mem += sizeof(res->magic5);
 
967
        len -= sizeof(res->magic5);
 
968
 
 
969
        if (len < sizeof(res->serverid))
 
970
                return NULL;
 
971
        memcpy(&res->serverid, mem, sizeof(res->serverid));
 
972
        mem += sizeof(res->serverid);
 
973
        len -= sizeof(res->serverid);
 
974
 
 
975
        if (len < sizeof(res->clientack))
 
976
                return NULL;
 
977
        memcpy(&res->clientack, mem, sizeof(res->clientack));
 
978
        mem += sizeof(res->clientack);
 
979
        len -= sizeof(res->clientack);
 
980
 
 
981
        if (len < sizeof(res->pad5))
 
982
                return NULL;
 
983
        memcpy(res->pad5, mem, sizeof(res->pad5));
 
984
        mem += sizeof(res->pad5);
 
985
        len -= sizeof(res->pad5);
 
986
 
 
987
        if (len < sizeof(res->sequence))
 
988
                return NULL;
 
989
        memcpy(&res->sequence, mem, sizeof(res->sequence));
 
990
        mem += sizeof(res->sequence);
 
991
        len -= sizeof(res->sequence);
 
992
 
 
993
        if (len < sizeof(res->pad10))
 
994
                return NULL;
 
995
        memcpy(res->pad10, mem, sizeof(res->pad10));
 
996
        mem += sizeof(res->pad10);
 
997
        len -= sizeof(res->pad10);
 
998
 
 
999
        if (len < sizeof(res->RWSP))
 
1000
                return NULL;
 
1001
        memcpy(res->RWSP, mem, sizeof(res->RWSP));
 
1002
        mem += sizeof(res->RWSP);
 
1003
        len -= sizeof(res->RWSP);
 
1004
 
 
1005
        if (len < sizeof(res->pad15))
 
1006
                return NULL;
 
1007
        memcpy(res->pad15, mem, sizeof(res->pad15));
 
1008
        mem += sizeof(res->pad15);
 
1009
        len -= sizeof(res->pad15);
 
1010
 
 
1011
        if (len < sizeof(res->command))
 
1012
                return NULL;
 
1013
        memcpy(&res->command, mem, sizeof(res->command));
 
1014
        mem += sizeof(res->command);
 
1015
        len -= sizeof(res->command);
 
1016
 
 
1017
        switch (ntohs(res->command)) {
 
1018
                case MSPROXY_HELLO_ACK:
 
1019
                        if (len < sizeof(res->packet._1.pad5))
 
1020
                                return NULL;
 
1021
                        memcpy(res->packet._1.pad5, mem, sizeof(res->packet._1.pad5));
 
1022
                        mem += sizeof(res->packet._1.pad5);
 
1023
                        len -= sizeof(res->packet._1.pad5);
 
1024
 
 
1025
                        if (len < sizeof(res->packet._1.magic20))
 
1026
                                return NULL;
 
1027
                        memcpy(&res->packet._1.magic20, mem, sizeof(res->packet._1.magic20));
 
1028
                        mem += sizeof(res->packet._1.magic20);
 
1029
                        len -= sizeof(res->packet._1.magic20);
 
1030
 
 
1031
                        if (len < sizeof(res->packet._1.pad10))
 
1032
                                return NULL;
 
1033
                        memcpy(&res->packet._1.pad10, mem, sizeof(res->packet._1.pad10));
 
1034
                        mem += sizeof(res->packet._1.pad10);
 
1035
                        len -= sizeof(res->packet._1.pad10);
 
1036
 
 
1037
                        if (len < sizeof(res->packet._1.magic30))
 
1038
                                return NULL;
 
1039
                        memcpy(&res->packet._1.magic30, mem, sizeof(res->packet._1.magic30));
 
1040
                        mem += sizeof(res->packet._1.magic30);
 
1041
                        len -= sizeof(res->packet._1.magic30);
 
1042
 
 
1043
                        if (len < sizeof(res->packet._1.pad15))
 
1044
                                return NULL;
 
1045
                        memcpy(res->packet._1.pad15, mem, sizeof(res->packet._1.pad15));
 
1046
                        mem += sizeof(res->packet._1.pad15);
 
1047
                        len -= sizeof(res->packet._1.pad15);
 
1048
 
 
1049
                        if (len < sizeof(res->packet._1.magic35))
 
1050
                                return NULL;
 
1051
                        memcpy(&res->packet._1.magic35, mem, sizeof(res->packet._1.magic35));
 
1052
                        mem += sizeof(res->packet._1.magic35);
 
1053
                        len -= sizeof(res->packet._1.magic35);
 
1054
 
 
1055
                        if (len < sizeof(res->packet._1.pad20))
 
1056
                                return NULL;
 
1057
                        memcpy(res->packet._1.pad20, mem, sizeof(res->packet._1.pad20));
 
1058
                        mem += sizeof(res->packet._1.pad20);
 
1059
                        len -= sizeof(res->packet._1.pad20);
 
1060
 
 
1061
                        if (len < sizeof(res->packet._1.magic50))
 
1062
                                return NULL;
 
1063
                        memcpy(&res->packet._1.magic50, mem, sizeof(res->packet._1.magic50));
 
1064
                        mem += sizeof(res->packet._1.magic50);
 
1065
                        len -= sizeof(res->packet._1.magic50);
 
1066
 
 
1067
                        if (len < sizeof(res->packet._1.pad30))
 
1068
                                return NULL;
 
1069
                        memcpy(res->packet._1.pad30, mem, sizeof(res->packet._1.pad30));
 
1070
                        mem += sizeof(res->packet._1.pad30);
 
1071
                        len -= sizeof(res->packet._1.pad30);
 
1072
 
 
1073
                        if (len < sizeof(res->packet._1.magic60))
 
1074
                                return NULL;
 
1075
                        memcpy(&res->packet._1.magic60, mem, sizeof(res->packet._1.magic60));
 
1076
                        mem += sizeof(res->packet._1.magic60);
 
1077
                        len -= sizeof(res->packet._1.magic60);
 
1078
 
 
1079
                        if (len < sizeof(res->packet._1.pad35))
 
1080
                                return NULL;
 
1081
                        memcpy(res->packet._1.pad35, mem, sizeof(res->packet._1.pad35));
 
1082
                        mem += sizeof(res->packet._1.pad35);
 
1083
                        len -= sizeof(res->packet._1.pad35);
 
1084
 
 
1085
                        if (len < sizeof(res->packet._1.magic65))
 
1086
                                return NULL;
 
1087
                        memcpy(&res->packet._1.magic65, mem, sizeof(res->packet._1.magic65));
 
1088
                        mem += sizeof(res->packet._1.magic65);
 
1089
                        len -= sizeof(res->packet._1.magic65);
 
1090
 
 
1091
                        if (len < sizeof(res->packet._1.pad40))
 
1092
                                return NULL;
 
1093
                        memcpy(res->packet._1.pad40, mem, sizeof(res->packet._1.pad40));
 
1094
                        mem += sizeof(res->packet._1.pad40);
 
1095
                        len -= sizeof(res->packet._1.pad40);
 
1096
 
 
1097
                        if (len < sizeof(res->packet._1.udpport))
 
1098
                                return NULL;
 
1099
                        memcpy(&res->packet._1.udpport, mem, sizeof(res->packet._1.udpport));
 
1100
                        mem += sizeof(res->packet._1.udpport);
 
1101
                        len -= sizeof(res->packet._1.udpport);
 
1102
 
 
1103
                        if (len < sizeof(res->packet._1.udpaddr))
 
1104
                                return NULL;
 
1105
                        memcpy(&res->packet._1.udpaddr, mem, sizeof(res->packet._1.udpaddr));
 
1106
                        mem += sizeof(res->packet._1.udpaddr);
 
1107
                        len -= sizeof(res->packet._1.udpaddr);
 
1108
 
 
1109
                        break;
 
1110
 
 
1111
                case MSPROXY_USERINFO_ACK:
 
1112
                        if (len < sizeof(res->packet._2.pad5))
 
1113
                                return NULL;
 
1114
                        memcpy(res->packet._2.pad5, mem, sizeof(res->packet._2.pad5));
 
1115
                        mem += sizeof(res->packet._2.pad5);
 
1116
                        len -= sizeof(res->packet._2.pad5);
 
1117
 
 
1118
                        if (len < sizeof(res->packet._2.magic5))
 
1119
                                return NULL;
 
1120
                        memcpy(&res->packet._2.magic5, mem, sizeof(res->packet._2.magic5));
 
1121
                        mem += sizeof(res->packet._2.magic5);
 
1122
                        len -= sizeof(res->packet._2.magic5);
 
1123
 
 
1124
                        break;
 
1125
 
 
1126
                case MSPROXY_BIND_ACK:
 
1127
                case MSPROXY_SOMETHING_1_ACK:
 
1128
                        if (len < sizeof(res->packet._3.pad1))
 
1129
                                return NULL;
 
1130
                        memcpy(res->packet._3.pad1, mem, sizeof(res->packet._3.pad1));
 
1131
                        mem += sizeof(res->packet._3.pad1);
 
1132
                        len -= sizeof(res->packet._3.pad1);
 
1133
 
 
1134
                        if (len < sizeof(res->packet._3.magic10))
 
1135
                                return NULL;
 
1136
                        memcpy(&res->packet._3.magic10, mem, sizeof(res->packet._3.magic10));
 
1137
                        mem += sizeof(res->packet._3.magic10);
 
1138
                        len -= sizeof(res->packet._3.magic10);
 
1139
 
 
1140
                        if (len < sizeof(res->packet._3.pad3))
 
1141
                                return NULL;
 
1142
                        memcpy(res->packet._3.pad3, mem, sizeof(res->packet._3.pad3));
 
1143
                        mem += sizeof(res->packet._3.pad3);
 
1144
                        len -= sizeof(res->packet._3.pad3);
 
1145
 
 
1146
                        if (len < sizeof(res->packet._3.boundport))
 
1147
                                return NULL;
 
1148
                        memcpy(&res->packet._3.boundport, mem,
 
1149
                        sizeof(res->packet._3.boundport));
 
1150
                        mem += sizeof(res->packet._3.boundport);
 
1151
                        len -= sizeof(res->packet._3.boundport);
 
1152
 
 
1153
                        if (len < sizeof(res->packet._3.boundaddr))
 
1154
                                return NULL;
 
1155
                        memcpy(&res->packet._3.boundaddr, mem,
 
1156
                        sizeof(res->packet._3.boundaddr));
 
1157
                        mem += sizeof(res->packet._3.boundaddr);
 
1158
                        len -= sizeof(res->packet._3.boundaddr);
 
1159
 
 
1160
                        if (len < sizeof(res->packet._3.pad10))
 
1161
                                return NULL;
 
1162
                        memcpy(res->packet._3.pad10, mem, sizeof(res->packet._3.pad10));
 
1163
                        mem += sizeof(res->packet._3.pad10);
 
1164
                        len -= sizeof(res->packet._3.pad10);
 
1165
 
 
1166
                        if (len < sizeof(res->packet._3.magic15))
 
1167
                                return NULL;
 
1168
                        memcpy(&res->packet._3.magic15, mem, sizeof(res->packet._3.magic15));
 
1169
                        mem += sizeof(res->packet._3.magic15);
 
1170
                        len -= sizeof(res->packet._3.magic15);
 
1171
 
 
1172
                        if (len < sizeof(res->packet._3.pad15))
 
1173
                                return NULL;
 
1174
                        memcpy(res->packet._3.pad15, mem, sizeof(res->packet._3.pad15));
 
1175
                        mem += sizeof(res->packet._3.pad15);
 
1176
                        len -= sizeof(res->packet._3.pad15);
 
1177
 
 
1178
                        if (len < sizeof(res->packet._3.NTLMSSP))
 
1179
                                return NULL;
 
1180
                        memcpy(res->packet._3.NTLMSSP, mem, sizeof(res->packet._3.NTLMSSP));
 
1181
                        mem += sizeof(res->packet._3.NTLMSSP);
 
1182
                        len -= sizeof(res->packet._3.NTLMSSP);
 
1183
 
 
1184
                        if (len < sizeof(res->packet._3.magic50))
 
1185
                                return NULL;
 
1186
                        memcpy(&res->packet._3.magic50, mem, sizeof(res->packet._3.magic50));
 
1187
                        mem += sizeof(res->packet._3.magic50);
 
1188
                        len -= sizeof(res->packet._3.magic50);
 
1189
 
 
1190
                        if (len < sizeof(res->packet._3.pad50))
 
1191
                                return NULL;
 
1192
                        memcpy(res->packet._3.pad50, mem, sizeof(res->packet._3.pad50));
 
1193
                        mem += sizeof(res->packet._3.pad50);
 
1194
                        len -= sizeof(res->packet._3.pad50);
 
1195
 
 
1196
                        if (len < sizeof(res->packet._3.magic55))
 
1197
                                return NULL;
 
1198
                        memcpy(&res->packet._3.magic55, mem, sizeof(res->packet._3.magic55));
 
1199
                        mem += sizeof(res->packet._3.magic55);
 
1200
                        len -= sizeof(res->packet._3.magic55);
 
1201
 
 
1202
                        if (len < sizeof(res->packet._3.magic60))
 
1203
                                return NULL;
 
1204
                        memcpy(&res->packet._3.magic60, mem, sizeof(res->packet._3.magic60));
 
1205
                        mem += sizeof(res->packet._3.magic60);
 
1206
                        len -= sizeof(res->packet._3.magic60);
 
1207
 
 
1208
                        if (len < sizeof(res->packet._3.magic65))
 
1209
                                return NULL;
 
1210
                        memcpy(&res->packet._3.magic65, mem, sizeof(res->packet._3.magic65));
 
1211
                        mem += sizeof(res->packet._3.magic65);
 
1212
                        len -= sizeof(res->packet._3.magic65);
 
1213
 
 
1214
                        if (len < sizeof(res->packet._3.pad60))
 
1215
                                return NULL;
 
1216
                        memcpy(res->packet._3.pad60, mem, sizeof(res->packet._3.pad60));
 
1217
                        mem += sizeof(res->packet._3.pad60);
 
1218
                        len -= sizeof(res->packet._3.pad60);
 
1219
 
 
1220
                        if (len < sizeof(res->packet._3.magic70))
 
1221
                                return NULL;
 
1222
                        memcpy(&res->packet._3.magic70, mem, sizeof(res->packet._3.magic70));
 
1223
                        mem += sizeof(res->packet._3.magic70);
 
1224
                        len -= sizeof(res->packet._3.magic70);
 
1225
 
 
1226
                        if (len < sizeof(res->packet._3.magic75))
 
1227
                                return NULL;
 
1228
                        memcpy(&res->packet._3.magic75, mem, sizeof(res->packet._3.magic75));
 
1229
                        mem += sizeof(res->packet._3.magic75);
 
1230
                        len -= sizeof(res->packet._3.magic75);
 
1231
 
 
1232
                        if (len < sizeof(res->packet._3.pad70))
 
1233
                                return NULL;
 
1234
                        memcpy(res->packet._3.pad70, mem, sizeof(res->packet._3.pad70));
 
1235
                        mem += sizeof(res->packet._3.pad70);
 
1236
                        len -= sizeof(res->packet._3.pad70);
 
1237
 
 
1238
                        if (len > sizeof(res->packet._3.ntdomain))
 
1239
                                swarnx("hmm, ntdomain length is %d, our max is %d?",
 
1240
                                len, sizeof(res->packet._3.ntdomain) - 1);
 
1241
                        memcpy(res->packet._3.ntdomain, mem,
 
1242
                        MIN(len, sizeof(res->packet._3.ntdomain) - 1));
 
1243
                        res->packet._3.ntdomain[len] = NUL;
 
1244
                        mem += len;
 
1245
                        len -= len;
 
1246
 
 
1247
                        break;
 
1248
 
 
1249
                case MSPROXY_SOMETHING_2_ACK:
 
1250
                case MSPROXY_SOMETHING_2_ACK2:
 
1251
                case MSPROXY_BIND2_ACK:
 
1252
                        if (len < sizeof(res->packet._4.pad5))
 
1253
                                return NULL;
 
1254
                        memcpy(res->packet._4.pad5, mem, sizeof(res->packet._4.pad5));
 
1255
                        mem += sizeof(res->packet._4.pad5);
 
1256
                        len -= sizeof(res->packet._4.pad5);
 
1257
                        break;
 
1258
 
 
1259
                case MSPROXY_RESOLVE_ACK: {
 
1260
                        if (len < sizeof(res->packet.resolve.addroffset))
 
1261
                                return NULL;
 
1262
                        memcpy(&res->packet.resolve.addroffset, mem,
 
1263
                        sizeof(res->packet.resolve.addroffset));
 
1264
                        mem += sizeof(res->packet.resolve.addroffset);
 
1265
                        len -= sizeof(res->packet.resolve.addroffset);
 
1266
 
 
1267
                        if (len < sizeof(res->packet.resolve.pad5))
 
1268
                                return NULL;
 
1269
                        memcpy(res->packet.resolve.pad5, mem,
 
1270
                        sizeof(res->packet.resolve.pad5));
 
1271
                        mem += sizeof(res->packet.resolve.pad5);
 
1272
                        len -= sizeof(res->packet.resolve.pad5);
 
1273
 
 
1274
                        mem += res->packet.resolve.addroffset;
 
1275
 
 
1276
                        if (len < sizeof(res->packet.resolve.hostaddr))
 
1277
                                return NULL;
 
1278
                        memcpy(&res->packet.resolve.hostaddr, mem,
 
1279
                        sizeof(res->packet.resolve.hostaddr));
 
1280
                        mem += sizeof(res->packet.resolve.hostaddr);
 
1281
                        len -= sizeof(res->packet.resolve.hostaddr);
 
1282
 
 
1283
                        break;
 
1284
                }
 
1285
 
 
1286
                case MSPROXY_CONNECT_ACK:
 
1287
                case MSPROXY_BINDINFO:
 
1288
                        if (len < sizeof(res->packet._5.magic1))
 
1289
                                return NULL;
 
1290
                        memcpy(&res->packet._5.magic1, mem, sizeof(res->packet._5.magic1));
 
1291
                        mem += sizeof(res->packet._5.magic1);
 
1292
                        len -= sizeof(res->packet._5.magic1);
 
1293
 
 
1294
                        if (len < sizeof(res->packet._5.pad5))
 
1295
                                return NULL;
 
1296
                        memcpy(res->packet._5.pad5, mem, sizeof(res->packet._5.pad5));
 
1297
                        mem += sizeof(res->packet._5.pad5);
 
1298
                        len -= sizeof(res->packet._5.pad5);
 
1299
 
 
1300
                        if (len < sizeof(res->packet._5.clientport))
 
1301
                                return NULL;
 
1302
                        memcpy(&res->packet._5.clientport, mem,
 
1303
                        sizeof(res->packet._5.clientport));
 
1304
                        mem += sizeof(res->packet._5.clientport);
 
1305
                        len -= sizeof(res->packet._5.clientport);
 
1306
 
 
1307
                        if (len < sizeof(res->packet._5.clientaddr))
 
1308
                                return NULL;
 
1309
                        memcpy(&res->packet._5.clientaddr, mem,
 
1310
                        sizeof(res->packet._5.clientaddr));
 
1311
                        mem += sizeof(res->packet._5.clientaddr);
 
1312
                        len -= sizeof(res->packet._5.clientaddr);
 
1313
 
 
1314
                        if (len < sizeof(res->packet._5.magic10))
 
1315
                                return NULL;
 
1316
                        memcpy(&res->packet._5.magic10, mem, sizeof(res->packet._5.magic10));
 
1317
                        mem += sizeof(res->packet._5.magic10);
 
1318
                        len -= sizeof(res->packet._5.magic10);
 
1319
 
 
1320
                        if (len < sizeof(res->packet._5.magic15))
 
1321
                                return NULL;
 
1322
                        memcpy(&res->packet._5.magic15, mem, sizeof(res->packet._5.magic15));
 
1323
                        mem += sizeof(res->packet._5.magic15);
 
1324
                        len -= sizeof(res->packet._5.magic15);
 
1325
 
 
1326
                        if (len < sizeof(res->packet._5.serverport))
 
1327
                                return NULL;
 
1328
                        memcpy(&res->packet._5.serverport, mem,
 
1329
                        sizeof(res->packet._5.serverport));
 
1330
                        mem += sizeof(res->packet._5.serverport);
 
1331
                        len -= sizeof(res->packet._5.serverport);
 
1332
 
 
1333
                        if (len < sizeof(res->packet._5.srcport))
 
1334
                                return NULL;
 
1335
                        memcpy(&res->packet._5.srcport, mem, sizeof(res->packet._5.srcport));
 
1336
                        mem += sizeof(res->packet._5.srcport);
 
1337
                        len -= sizeof(res->packet._5.srcport);
 
1338
 
 
1339
                        if (len < sizeof(res->packet._5.boundport))
 
1340
                                return NULL;
 
1341
                        memcpy(&res->packet._5.boundport, mem,
 
1342
                        sizeof(res->packet._5.boundport));
 
1343
                        mem += sizeof(res->packet._5.boundport);
 
1344
                        len -= sizeof(res->packet._5.boundport);
 
1345
 
 
1346
                        if (len < sizeof(res->packet._5.boundaddr))
 
1347
                                return NULL;
 
1348
                        memcpy(&res->packet._5.boundaddr, mem,
 
1349
                        sizeof(res->packet._5.boundaddr));
 
1350
                        mem += sizeof(res->packet._5.boundaddr);
 
1351
                        len -= sizeof(res->packet._5.boundaddr);
 
1352
 
 
1353
                        if (len < sizeof(res->packet._5.pad10))
 
1354
                                return NULL;
 
1355
                        memcpy(res->packet._5.pad10, mem, sizeof(res->packet._5.pad10));
 
1356
                        mem += sizeof(res->packet._5.pad10);
 
1357
                        len -= sizeof(res->packet._5.pad10);
 
1358
 
 
1359
                        break;
 
1360
 
 
1361
                case MSPROXY_CONNECT_AUTHFAILED:
 
1362
                case MSPROXY_BIND_AUTHFAILED:
 
1363
                        break;
 
1364
 
 
1365
                default:
 
1366
                        if (ntohs(res->command) >> 8 == MSPROXY_CONNREFUSED
 
1367
                        ||  ntohs(res->command) >> 12 == MSPROXY_CONNREFUSED)
 
1368
                                ;
 
1369
                        else
 
1370
                                slog(LOG_DEBUG, "%s: unknown command in msproxy reply: 0x%x",
 
1371
                                function, ntohs(res->command));
 
1372
        }
 
1373
 
 
1374
        return mem;
 
1375
}
 
1376
 
 
1377
static char *
 
1378
request2mem(req, mem)
 
1379
        const struct msproxy_request_t *req;
 
1380
        char *mem;
 
1381
{
 
1382
 
 
1383
        memcpy(mem, &req->clientid, sizeof(req->clientid));
 
1384
        mem += sizeof(req->clientid);
 
1385
 
 
1386
        memcpy(mem, &req->magic25, sizeof(req->magic25));
 
1387
        mem += sizeof(req->magic25);
 
1388
 
 
1389
        memcpy(mem, &req->serverid, sizeof(req->serverid));
 
1390
        mem += sizeof(req->serverid);
 
1391
 
 
1392
        memcpy(mem, &req->serverack, sizeof(req->serverack));
 
1393
        mem += sizeof(req->serverack);
 
1394
 
 
1395
        memcpy(mem, &req->pad10, sizeof(req->pad10));
 
1396
        mem += sizeof(req->pad10);
 
1397
 
 
1398
        memcpy(mem, &req->sequence, sizeof(req->sequence));
 
1399
        mem += sizeof(req->sequence);
 
1400
 
 
1401
        memcpy(mem, &req->pad11, sizeof(req->pad11));
 
1402
        mem += sizeof(req->pad11);
 
1403
 
 
1404
        memcpy(mem, &req->RWSP, sizeof(req->RWSP));
 
1405
        mem += sizeof(req->RWSP);
 
1406
 
 
1407
        memcpy(mem, &req->pad15, sizeof(req->pad15));
 
1408
        mem += sizeof(req->pad15);
 
1409
 
 
1410
        memcpy(mem, &req->command, sizeof(req->command));
 
1411
        mem += sizeof(req->command);
 
1412
 
 
1413
        switch (ntohs(req->command)) {
 
1414
                case MSPROXY_HELLO:
 
1415
                        memcpy(mem, &req->packet._1.pad1, sizeof(req->packet._1.pad1));
 
1416
                        mem += sizeof(req->packet._1.pad1);
 
1417
 
 
1418
                        memcpy(mem, &req->packet._1.magic3, sizeof(req->packet._1.magic3));
 
1419
                        mem += sizeof(req->packet._1.magic3);
 
1420
 
 
1421
                        memcpy(mem, &req->packet._1.pad3, sizeof(req->packet._1.pad3));
 
1422
                        mem += sizeof(req->packet._1.pad3);
 
1423
 
 
1424
                        memcpy(mem, &req->packet._1.magic5, sizeof(req->packet._1.magic5));
 
1425
                        mem += sizeof(req->packet._1.magic5);
 
1426
 
 
1427
                        memcpy(mem, &req->packet._1.pad5, sizeof(req->packet._1.pad5));
 
1428
                        mem += sizeof(req->packet._1.pad5);
 
1429
 
 
1430
                        memcpy(mem, &req->packet._1.magic10, sizeof(req->packet._1.magic10));
 
1431
                        mem += sizeof(req->packet._1.magic10);
 
1432
 
 
1433
                        memcpy(mem, &req->packet._1.pad6, sizeof(req->packet._1.pad6));
 
1434
                        mem += sizeof(req->packet._1.pad6);
 
1435
 
 
1436
                        memcpy(mem, &req->packet._1.magic15, sizeof(req->packet._1.magic15));
 
1437
                        mem += sizeof(req->packet._1.magic15);
 
1438
 
 
1439
                        memcpy(mem, &req->packet._1.pad10, sizeof(req->packet._1.pad10));
 
1440
                        mem += sizeof(req->packet._1.pad10);
 
1441
 
 
1442
                        memcpy(mem, &req->packet._1.magic20, sizeof(req->packet._1.magic20));
 
1443
                        mem += sizeof(req->packet._1.magic20);
 
1444
 
 
1445
                        memcpy(mem, &req->packet._1.magic25, sizeof(req->packet._1.magic25));
 
1446
                        mem += sizeof(req->packet._1.magic25);
 
1447
 
 
1448
                        memcpy(mem, &req->packet._1.magic30, sizeof(req->packet._1.magic30));
 
1449
                        mem += sizeof(req->packet._1.magic30);
 
1450
 
 
1451
                        memcpy(mem, &req->packet._1.pad20, sizeof(req->packet._1.pad20));
 
1452
                        mem += sizeof(req->packet._1.pad20);
 
1453
 
 
1454
                        memcpy(mem, &req->packet._1.magic35, sizeof(req->packet._1.magic35));
 
1455
                        mem += sizeof(req->packet._1.magic35);
 
1456
 
 
1457
                        memcpy(mem, &req->packet._1.pad30, sizeof(req->packet._1.pad30));
 
1458
                        mem += sizeof(req->packet._1.pad30);
 
1459
 
 
1460
                        memcpy(mem, &req->packet._1.magic40, sizeof(req->packet._1.magic40));
 
1461
                        mem += sizeof(req->packet._1.magic40);
 
1462
 
 
1463
                        memcpy(mem, &req->packet._1.pad40, sizeof(req->packet._1.pad40));
 
1464
                        mem += sizeof(req->packet._1.pad40);
 
1465
 
 
1466
                        memcpy(mem, &req->packet._1.magic45, sizeof(req->packet._1.magic45));
 
1467
                        mem += sizeof(req->packet._1.magic45);
 
1468
 
 
1469
                        memcpy(mem, &req->packet._1.pad45, sizeof(req->packet._1.pad45));
 
1470
                        mem += sizeof(req->packet._1.pad45);
 
1471
 
 
1472
                        memcpy(mem, &req->packet._1.magic50, sizeof(req->packet._1.magic50));
 
1473
                        mem += sizeof(req->packet._1.magic50);
 
1474
 
 
1475
                        memcpy(mem, &req->packet._1.pad50, sizeof(req->packet._1.pad50));
 
1476
                        mem += sizeof(req->packet._1.pad50);
 
1477
 
 
1478
                        strcpy(mem, req->username);
 
1479
                        mem += strlen(req->username) + 1;
 
1480
 
 
1481
                        strcpy(mem, req->unknown);
 
1482
                        mem += strlen(req->unknown) + 1;
 
1483
 
 
1484
                        strcpy(mem, req->executable);
 
1485
                        mem += strlen(req->executable) + 1;
 
1486
 
 
1487
                        strcpy(mem, req->clienthost);
 
1488
                        mem += strlen(req->clienthost) + 1;
 
1489
 
 
1490
                        break;
 
1491
 
 
1492
                case MSPROXY_USERINFO:
 
1493
                        memcpy(mem, &req->packet._2.pad1, sizeof(req->packet._2.pad1));
 
1494
                        mem += sizeof(req->packet._2.pad1);
 
1495
 
 
1496
                        memcpy(mem, &req->packet._2.magic3, sizeof(req->packet._2.magic3));
 
1497
                        mem += sizeof(req->packet._2.magic3);
 
1498
 
 
1499
                        memcpy(mem, &req->packet._2.pad3, sizeof(req->packet._2.pad3));
 
1500
                        mem += sizeof(req->packet._2.pad3);
 
1501
 
 
1502
                        memcpy(mem, &req->packet._2.magic5, sizeof(req->packet._2.magic5));
 
1503
                        mem += sizeof(req->packet._2.magic5);
 
1504
 
 
1505
                        memcpy(mem, &req->packet._2.pad5, sizeof(req->packet._2.pad5));
 
1506
                        mem += sizeof(req->packet._2.pad5);
 
1507
 
 
1508
                        memcpy(mem, &req->packet._2.magic10, sizeof(req->packet._2.magic10));
 
1509
                        mem += sizeof(req->packet._2.magic10);
 
1510
 
 
1511
                        memcpy(mem, &req->packet._2.pad10, sizeof(req->packet._2.pad10));
 
1512
                        mem += sizeof(req->packet._2.pad10);
 
1513
 
 
1514
                        memcpy(mem, &req->packet._2.magic15, sizeof(req->packet._2.magic15));
 
1515
                        mem += sizeof(req->packet._2.magic15);
 
1516
 
 
1517
                        memcpy(mem, &req->packet._2.pad15, sizeof(req->packet._2.pad15));
 
1518
                        mem += sizeof(req->packet._2.pad15);
 
1519
 
 
1520
                        memcpy(mem, &req->packet._2.magic20, sizeof(req->packet._2.magic20));
 
1521
                        mem += sizeof(req->packet._2.magic20);
 
1522
 
 
1523
                        memcpy(mem, &req->packet._2.magic25, sizeof(req->packet._2.magic25));
 
1524
                        mem += sizeof(req->packet._2.magic25);
 
1525
 
 
1526
                        memcpy(mem, &req->packet._2.magic30, sizeof(req->packet._2.magic30));
 
1527
                        mem += sizeof(req->packet._2.magic30);
 
1528
 
 
1529
                        memcpy(mem, &req->packet._2.pad20, sizeof(req->packet._2.pad20));
 
1530
                        mem += sizeof(req->packet._2.pad20);
 
1531
 
 
1532
                        memcpy(mem, &req->packet._2.magic35, sizeof(req->packet._2.magic35));
 
1533
                        mem += sizeof(req->packet._2.magic35);
 
1534
 
 
1535
                        memcpy(mem, &req->packet._2.pad25, sizeof(req->packet._2.pad25));
 
1536
                        mem += sizeof(req->packet._2.pad25);
 
1537
 
 
1538
                        memcpy(mem, &req->packet._2.magic35, sizeof(req->packet._2.magic35));
 
1539
                        mem += sizeof(req->packet._2.magic35);
 
1540
 
 
1541
                        memcpy(mem, &req->packet._2.pad25, sizeof(req->packet._2.pad25));
 
1542
                        mem += sizeof(req->packet._2.pad25);
 
1543
 
 
1544
                        memcpy(mem, &req->packet._2.magic50, sizeof(req->packet._2.magic50));
 
1545
                        mem += sizeof(req->packet._2.magic50);
 
1546
 
 
1547
                        memcpy(mem, &req->packet._2.pad50, sizeof(req->packet._2.pad50));
 
1548
                        mem += sizeof(req->packet._2.pad50);
 
1549
 
 
1550
                        memcpy(mem, &req->packet._2.magic55, sizeof(req->packet._2.magic55));
 
1551
                        mem += sizeof(req->packet._2.magic55);
 
1552
 
 
1553
                        memcpy(mem, &req->packet._2.pad55, sizeof(req->packet._2.pad55));
 
1554
                        mem += sizeof(req->packet._2.pad55);
 
1555
 
 
1556
                        memcpy(mem, &req->packet._2.magic60, sizeof(req->packet._2.magic60));
 
1557
                        mem += sizeof(req->packet._2.magic60);
 
1558
 
 
1559
                        strcpy(mem, req->username);
 
1560
                        mem += strlen(req->username) + 1;
 
1561
 
 
1562
                        strcpy(mem, req->unknown);
 
1563
                        mem += strlen(req->unknown) + 1;
 
1564
 
 
1565
                        strcpy(mem, req->executable);
 
1566
                        mem += strlen(req->executable) + 1;
 
1567
 
 
1568
                        strcpy(mem, req->clienthost);
 
1569
                        mem += strlen(req->clienthost) + 1;
 
1570
 
 
1571
                        break;
 
1572
 
 
1573
                case MSPROXY_BIND:
 
1574
                case MSPROXY_SOMETHING:
 
1575
                        memcpy(mem, &req->packet._3.pad1, sizeof(req->packet._3.pad1));
 
1576
                        mem += sizeof(req->packet._3.pad1);
 
1577
 
 
1578
                        memcpy(mem, &req->packet._3.magic2, sizeof(req->packet._3.magic2));
 
1579
                        mem += sizeof(req->packet._3.magic2);
 
1580
 
 
1581
                        memcpy(mem, &req->packet._3.pad10, sizeof(req->packet._3.pad10));
 
1582
                        mem += sizeof(req->packet._3.pad10);
 
1583
 
 
1584
                        memcpy(mem, &req->packet._3.bindaddr, sizeof(req->packet._3.bindaddr));
 
1585
                        mem += sizeof(req->packet._3.bindaddr);
 
1586
 
 
1587
                        memcpy(mem, &req->packet._3.bindport, sizeof(req->packet._3.bindport));
 
1588
                        mem += sizeof(req->packet._3.bindport);
 
1589
 
 
1590
                        memcpy(mem, &req->packet._3.pad15, sizeof(req->packet._3.pad15));
 
1591
                        mem += sizeof(req->packet._3.pad15);
 
1592
 
 
1593
                        memcpy(mem, &req->packet._3.magic3, sizeof(req->packet._3.magic3));
 
1594
                        mem += sizeof(req->packet._3.magic3);
 
1595
 
 
1596
                        memcpy(mem, &req->packet._3.boundport,
 
1597
                        sizeof(req->packet._3.boundport));
 
1598
                        mem += sizeof(req->packet._3.boundport);
 
1599
 
 
1600
                        memcpy(mem, &req->packet._3.pad20, sizeof(req->packet._3.pad20));
 
1601
                        mem += sizeof(req->packet._3.pad20);
 
1602
 
 
1603
                        memcpy(mem, &req->packet._3.NTLMSSP, sizeof(req->packet._3.NTLMSSP));
 
1604
                        mem += sizeof(req->packet._3.NTLMSSP);
 
1605
 
 
1606
                        memcpy(mem, &req->packet._3.magic5, sizeof(req->packet._3.magic5));
 
1607
                        mem += sizeof(req->packet._3.magic5);
 
1608
 
 
1609
                        memcpy(mem, &req->packet._3.pad25, sizeof(req->packet._3.pad25));
 
1610
                        mem += sizeof(req->packet._3.pad25);
 
1611
 
 
1612
                        memcpy(mem, &req->packet._3.magic10, sizeof(req->packet._3.magic10));
 
1613
                        mem += sizeof(req->packet._3.magic10);
 
1614
 
 
1615
                        memcpy(mem, &req->packet._3.magic15, sizeof(req->packet._3.magic15));
 
1616
                        mem += sizeof(req->packet._3.magic15);
 
1617
 
 
1618
                        memcpy(mem, &req->packet._3.magic20, sizeof(req->packet._3.magic20));
 
1619
                        mem += sizeof(req->packet._3.magic20);
 
1620
 
 
1621
                        memcpy(mem, &req->packet._3.pad30, sizeof(req->packet._3.pad30));
 
1622
                        mem += sizeof(req->packet._3.pad30);
 
1623
 
 
1624
                        memcpy(mem, &req->packet._3.magic25, sizeof(req->packet._3.magic25));
 
1625
                        mem += sizeof(req->packet._3.magic25);
 
1626
 
 
1627
                        memcpy(mem, &req->packet._3.magic30, sizeof(req->packet._3.magic30));
 
1628
                        mem += sizeof(req->packet._3.magic30);
 
1629
 
 
1630
                        memcpy(mem, &req->packet._3.pad40, sizeof(req->packet._3.pad40));
 
1631
                        mem += sizeof(req->packet._3.pad40);
 
1632
 
 
1633
                        memcpy(mem, &req->packet._3.magic50, sizeof(req->packet._3.magic50));
 
1634
                        mem += sizeof(req->packet._3.magic50);
 
1635
 
 
1636
                        memcpy(mem, &req->packet._3.pad50, sizeof(req->packet._3.pad50));
 
1637
                        mem += sizeof(req->packet._3.pad50);
 
1638
 
 
1639
                        memcpy(mem, &req->packet._3.magic55, sizeof(req->packet._3.magic55));
 
1640
                        mem += sizeof(req->packet._3.magic55);
 
1641
 
 
1642
                        memcpy(mem, &req->packet._3.pad55, sizeof(req->packet._3.pad55));
 
1643
                        mem += sizeof(req->packet._3.pad55);
 
1644
 
 
1645
                        break;
 
1646
 
 
1647
                case MSPROXY_BIND2:
 
1648
                case MSPROXY_SOMETHING_2:
 
1649
                        memcpy(mem, &req->packet._4.pad1, sizeof(req->packet._4.pad1));
 
1650
                        mem += sizeof(req->packet._4.pad1);
 
1651
 
 
1652
                        memcpy(mem, &req->packet._4.magic1, sizeof(req->packet._4.magic1));
 
1653
                        mem += sizeof(req->packet._4.magic1);
 
1654
 
 
1655
                        memcpy(mem, &req->packet._4.magic2, sizeof(req->packet._4.magic2));
 
1656
                        mem += sizeof(req->packet._4.magic2);
 
1657
 
 
1658
                        memcpy(mem, &req->packet._4.pad2, sizeof(req->packet._4.pad2));
 
1659
                        mem += sizeof(req->packet._4.pad2);
 
1660
 
 
1661
                        memcpy(mem, &req->packet._4.magic3, sizeof(req->packet._4.magic3));
 
1662
                        mem += sizeof(req->packet._4.magic3);
 
1663
 
 
1664
                        memcpy(mem, &req->packet._4.pad3, sizeof(req->packet._4.pad3));
 
1665
                        mem += sizeof(req->packet._4.pad3);
 
1666
 
 
1667
                        memcpy(mem, &req->packet._4.magic4, sizeof(req->packet._4.magic4));
 
1668
                        mem += sizeof(req->packet._4.magic4);
 
1669
 
 
1670
                        memcpy(mem, &req->packet._4.boundport,
 
1671
                        sizeof(req->packet._4.boundport));
 
1672
                        mem += sizeof(req->packet._4.boundport);
 
1673
 
 
1674
                        memcpy(mem, &req->packet._4.pad4, sizeof(req->packet._4.pad4));
 
1675
                        mem += sizeof(req->packet._4.pad4);
 
1676
 
 
1677
                        memcpy(mem, &req->packet._4.NTLMSSP, sizeof(req->packet._4.NTLMSSP));
 
1678
                        mem += sizeof(req->packet._4.NTLMSSP);
 
1679
 
 
1680
                        memcpy(mem, &req->packet._4.magic5, sizeof(req->packet._4.magic5));
 
1681
                        mem += sizeof(req->packet._4.magic5);
 
1682
 
 
1683
                        memcpy(mem, &req->packet._4.pad5, sizeof(req->packet._4.pad5));
 
1684
                        mem += sizeof(req->packet._4.pad5);
 
1685
 
 
1686
                        memcpy(mem, &req->packet._4.magic10, sizeof(req->packet._4.magic10));
 
1687
                        mem += sizeof(req->packet._4.magic10);
 
1688
 
 
1689
                        memcpy(mem, &req->packet._4.magic10, sizeof(req->packet._4.magic10));
 
1690
                        mem += sizeof(req->packet._4.magic10);
 
1691
 
 
1692
                        memcpy(mem, &req->packet._4.magic20, sizeof(req->packet._4.magic20));
 
1693
                        mem += sizeof(req->packet._4.magic20);
 
1694
 
 
1695
                        memcpy(mem, &req->packet._4.pad10, sizeof(req->packet._4.pad10));
 
1696
                        mem += sizeof(req->packet._4.pad10);
 
1697
 
 
1698
                        memcpy(mem, &req->packet._4.magic30, sizeof(req->packet._4.magic30));
 
1699
                        mem += sizeof(req->packet._4.magic30);
 
1700
 
 
1701
                        memcpy(mem, &req->packet._4.pad15, sizeof(req->packet._4.pad15));
 
1702
                        mem += sizeof(req->packet._4.pad15);
 
1703
 
 
1704
                        memcpy(mem, &req->packet._4.magic35, sizeof(req->packet._4.magic35));
 
1705
                        mem += sizeof(req->packet._4.magic35);
 
1706
 
 
1707
                        memcpy(mem, &req->packet._4.magic40, sizeof(req->packet._4.magic40));
 
1708
                        mem += sizeof(req->packet._4.magic40);
 
1709
 
 
1710
                        memcpy(mem, &req->packet._4.magic45, sizeof(req->packet._4.magic45));
 
1711
                        mem += sizeof(req->packet._4.magic45);
 
1712
 
 
1713
                        memcpy(mem, &req->packet._4.pad20, sizeof(req->packet._4.pad20));
 
1714
                        mem += sizeof(req->packet._4.pad20);
 
1715
 
 
1716
                        memcpy(mem, &req->packet._4.magic50, sizeof(req->packet._4.magic50));
 
1717
                        mem += sizeof(req->packet._4.magic50);
 
1718
 
 
1719
                        memcpy(mem, &req->packet._4.magic55, sizeof(req->packet._4.magic55));
 
1720
                        mem += sizeof(req->packet._4.magic55);
 
1721
 
 
1722
                        memcpy(mem, &req->packet._4.magic60, sizeof(req->packet._4.magic60));
 
1723
                        mem += sizeof(req->packet._4.magic60);
 
1724
 
 
1725
                        memcpy(mem, &req->packet._4.pad25, sizeof(req->packet._4.pad25));
 
1726
                        mem += sizeof(req->packet._4.pad25);
 
1727
 
 
1728
                        memcpy(mem, &req->packet._4.magic65, sizeof(req->packet._4.magic65));
 
1729
                        mem += sizeof(req->packet._4.magic65);
 
1730
 
 
1731
                        memcpy(mem, &req->packet._4.magic70, sizeof(req->packet._4.magic70));
 
1732
                        mem += sizeof(req->packet._4.magic70);
 
1733
 
 
1734
                        memcpy(mem, &req->packet._4.magic75, sizeof(req->packet._4.magic75));
 
1735
                        mem += sizeof(req->packet._4.magic75);
 
1736
 
 
1737
                        break;
 
1738
 
 
1739
                case MSPROXY_RESOLVE:
 
1740
                        memcpy(mem, &req->packet.resolve.hostlength,
 
1741
                        sizeof(req->packet.resolve.hostlength));
 
1742
                        mem += sizeof(req->packet.resolve.hostlength);
 
1743
 
 
1744
                        memcpy(mem, &req->packet.resolve.pad1,
 
1745
                        sizeof(req->packet.resolve.pad1));
 
1746
                        mem += sizeof(req->packet.resolve.pad1);
 
1747
 
 
1748
                        memcpy(mem, &req->packet.resolve.host,
 
1749
                        (size_t)req->packet.resolve.hostlength);
 
1750
                        mem += req->packet.resolve.hostlength;
 
1751
 
 
1752
                        break;
 
1753
 
 
1754
                case MSPROXY_LISTEN:
 
1755
                case MSPROXY_CONNECT:
 
1756
                        memcpy(mem, &req->packet._5.magic1, sizeof(req->packet._5.magic1));
 
1757
                        mem += sizeof(req->packet._5.magic1);
 
1758
 
 
1759
                        memcpy(mem, &req->packet._5.pad1, sizeof(req->packet._5.pad1));
 
1760
                        mem += sizeof(req->packet._5.pad1);
 
1761
 
 
1762
                        memcpy(mem, &req->packet._5.magic3, sizeof(req->packet._5.magic3));
 
1763
                        mem += sizeof(req->packet._5.magic3);
 
1764
 
 
1765
                        memcpy(mem, &req->packet._5.pad5, sizeof(req->packet._5.pad5));
 
1766
                        mem += sizeof(req->packet._5.pad5);
 
1767
 
 
1768
                        memcpy(mem, &req->packet._5.magic6, sizeof(req->packet._5.magic6));
 
1769
                        mem += sizeof(req->packet._5.magic6);
 
1770
 
 
1771
                        memcpy(mem, &req->packet._5.destport, sizeof(req->packet._5.destport));
 
1772
                        mem += sizeof(req->packet._5.destport);
 
1773
 
 
1774
                        memcpy(mem, &req->packet._5.destaddr, sizeof(req->packet._5.destaddr));
 
1775
                        mem += sizeof(req->packet._5.destaddr);
 
1776
 
 
1777
                        memcpy(mem, &req->packet._5.pad10, sizeof(req->packet._5.pad10));
 
1778
                        mem += sizeof(req->packet._5.pad10);
 
1779
 
 
1780
                        memcpy(mem, &req->packet._5.magic10, sizeof(req->packet._5.magic10));
 
1781
                        mem += sizeof(req->packet._5.magic10);
 
1782
 
 
1783
                        memcpy(mem, &req->packet._5.pad15, sizeof(req->packet._5.pad15));
 
1784
                        mem += sizeof(req->packet._5.pad15);
 
1785
 
 
1786
                        memcpy(mem, &req->packet._5.srcport, sizeof(req->packet._5.srcport));
 
1787
                        mem += sizeof(req->packet._5.srcport);
 
1788
 
 
1789
                        memcpy(mem, &req->packet._5.pad20, sizeof(req->packet._5.pad20));
 
1790
                        mem += sizeof(req->packet._5.pad20);
 
1791
                        strcpy(mem, req->executable);
 
1792
 
 
1793
                        break;
 
1794
 
 
1795
                case MSPROXY_BINDINFO_ACK:
 
1796
                case MSPROXY_CONNECTED:
 
1797
                        memcpy(mem, &req->packet._6.magic1, sizeof(req->packet._6.magic1));
 
1798
                        mem += sizeof(req->packet._6.magic1);
 
1799
 
 
1800
                        memcpy(mem, req->packet._6.pad5, sizeof(req->packet._6.pad5));
 
1801
                        mem += sizeof(req->packet._6.pad5);
 
1802
 
 
1803
                        memcpy(mem, &req->packet._6.magic5, sizeof(req->packet._6.magic5));
 
1804
                        mem += sizeof(req->packet._6.magic5);
 
1805
 
 
1806
                        memcpy(mem, &req->packet._6.magic10, sizeof(req->packet._6.magic10));
 
1807
                        mem += sizeof(req->packet._6.magic10);
 
1808
 
 
1809
                        memcpy(mem, req->packet._6.pad10, sizeof(req->packet._6.pad10));
 
1810
                        mem += sizeof(req->packet._6.pad10);
 
1811
 
 
1812
                        memcpy(mem, &req->packet._6.magic15, sizeof(req->packet._6.magic15));
 
1813
                        mem += sizeof(req->packet._6.magic15);
 
1814
 
 
1815
                        memcpy(mem, &req->packet._6.magic16, sizeof(req->packet._6.magic16));
 
1816
                        mem += sizeof(req->packet._6.magic16);
 
1817
 
 
1818
                        memcpy(mem, &req->packet._6.magic20, sizeof(req->packet._6.magic20));
 
1819
                        mem += sizeof(req->packet._6.magic20);
 
1820
 
 
1821
                        memcpy(mem, &req->packet._6.clientport,
 
1822
                        sizeof(req->packet._6.clientport));
 
1823
                        mem += sizeof(req->packet._6.clientport);
 
1824
 
 
1825
                        memcpy(mem, &req->packet._6.clientaddr,
 
1826
                        sizeof(req->packet._6.clientaddr));
 
1827
                        mem += sizeof(req->packet._6.clientaddr);
 
1828
 
 
1829
                        memcpy(mem, &req->packet._6.magic30, sizeof(req->packet._6.magic30));
 
1830
                        mem += sizeof(req->packet._6.magic30);
 
1831
 
 
1832
                        memcpy(mem, &req->packet._6.magic35, sizeof(req->packet._6.magic35));
 
1833
                        mem += sizeof(req->packet._6.magic35);
 
1834
 
 
1835
                        memcpy(mem, &req->packet._6.serverport,
 
1836
                        sizeof(req->packet._6.serverport));
 
1837
                        mem += sizeof(req->packet._6.serverport);
 
1838
 
 
1839
                        memcpy(mem, &req->packet._6.srcport, sizeof(req->packet._6.srcport));
 
1840
                        mem += sizeof(req->packet._6.srcport);
 
1841
 
 
1842
                        memcpy(mem, &req->packet._6.boundport,
 
1843
                        sizeof(req->packet._6.boundport));
 
1844
                        mem += sizeof(req->packet._6.boundport);
 
1845
 
 
1846
                        memcpy(mem, &req->packet._6.boundaddr,
 
1847
                        sizeof(req->packet._6.boundaddr));
 
1848
                        mem += sizeof(req->packet._6.boundaddr);
 
1849
 
 
1850
                        memcpy(mem, req->packet._6.pad30, sizeof(req->packet._6.pad30));
 
1851
                        mem += sizeof(req->packet._6.pad30);
 
1852
 
 
1853
                        break;
 
1854
 
 
1855
                case MSPROXY_SESSIONEND:
 
1856
                        break;
 
1857
 
 
1858
                default:
 
1859
                        SERRX(req->command);
 
1860
        }
 
1861
 
 
1862
        return mem;
 
1863
}
 
1864
 
 
1865
void
 
1866
msproxy_sessionsend(void)
 
1867
{
 
1868
        const char *function = "msproxy_sessionsend()";
 
1869
        int i, max;
 
1870
        struct socksfd_t *socksfd;
 
1871
 
 
1872
        slog(LOG_DEBUG, function);
 
1873
 
 
1874
        for (i = 0, max = getdtablesize(); i < max; ++i) {
 
1875
                if ((socksfd = socks_getaddr((unsigned int)i)) == NULL)
 
1876
                        continue;
 
1877
 
 
1878
                if (socksfd->state.version != MSPROXY_V2)
 
1879
                        continue;
 
1880
 
 
1881
                msproxy_sessionend(socksfd->control, &socksfd->state.msproxy);
 
1882
        }
 
1883
}
 
1884
 
 
1885
static void
 
1886
msproxy_sessionend(s, msproxy)
 
1887
        int s;
 
1888
        struct msproxy_state_t *msproxy;
 
1889
{
 
1890
        const char *function = "msproxy_sessionend()";
 
1891
        struct msproxy_request_t req;
 
1892
 
 
1893
        slog(LOG_DEBUG, function);
 
1894
 
 
1895
        bzero(&req, sizeof(req));
 
1896
        *req.username           = NUL;
 
1897
        *req.unknown            = NUL;
 
1898
        *req.executable = NUL;
 
1899
        *req.clienthost = NUL;
 
1900
        req.clientid    = msproxy->clientid;
 
1901
        req.serverid    = msproxy->serverid;
 
1902
        req.command             = htons(MSPROXY_SESSIONEND);
 
1903
 
 
1904
        send_msprequest(s, msproxy, &req);
 
1905
}
 
1906
 
 
1907
/* ARGSUSED */
 
1908
static void
 
1909
msproxy_keepalive(sig)
 
1910
        int sig;
 
1911
{
 
1912
        const char *function = "msproxy_keepalive()";
 
1913
        struct msproxy_request_t req;
 
1914
        struct msproxy_response_t res;
 
1915
        struct socksfd_t *socksfd;
 
1916
        int i, max;
 
1917
 
 
1918
        slog(LOG_DEBUG, function);
 
1919
 
 
1920
        for (i = 0, max = getdtablesize(); i < max; ++i) {
 
1921
                if ((socksfd = socks_getaddr((unsigned int)i)) == NULL)
 
1922
                        continue;
 
1923
 
 
1924
                if (socksfd->state.version != MSPROXY_V2
 
1925
                ||  socksfd->state.inprogress)
 
1926
                        continue;
 
1927
 
 
1928
                slog(LOG_DEBUG, "%s: sending keepalive packet", function);
 
1929
 
 
1930
                bzero(&req, sizeof(req));
 
1931
                req.clientid    = socksfd->state.msproxy.clientid;
 
1932
                req.serverid    = socksfd->state.msproxy.serverid;
 
1933
                req.command             = htons(MSPROXY_HELLO);
 
1934
 
 
1935
                if (send_msprequest(socksfd->control, &socksfd->state.msproxy, &req)
 
1936
                == -1)
 
1937
                        return;
 
1938
 
 
1939
                if (recv_mspresponse(socksfd->control, &socksfd->state.msproxy, &res)
 
1940
                == -1)
 
1941
                        return;
 
1942
        }
 
1943
}