Coverage Report

Created: 2025-07-11 06:51

/src/spice-usbredir/usbredirparser/usbredirparser.c
Line
Count
Source (jump to first uncovered line)
1
/* usbredirparser.c usb redirection protocol parser
2
3
   Copyright 2010-2012 Red Hat, Inc.
4
5
   Red Hat Authors:
6
   Hans de Goede <hdegoede@redhat.com>
7
8
   This library is free software; you can redistribute it and/or
9
   modify it under the terms of the GNU Lesser General Public
10
   License as published by the Free Software Foundation; either
11
   version 2.1 of the License, or (at your option) any later version.
12
13
   This library is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
   Lesser General Public License for more details.
17
18
   You should have received a copy of the GNU Lesser General Public
19
   License along with this library; if not, see <http://www.gnu.org/licenses/>.
20
*/
21
#include "config.h"
22
23
#include <assert.h>
24
#include <stdbool.h>
25
#include <stddef.h>
26
#include <stdio.h>
27
#include <stdlib.h>
28
#include <stdarg.h>
29
#include <string.h>
30
#include "usbredirproto-compat.h"
31
#include "usbredirparser.h"
32
#include "usbredirfilter.h"
33
34
/* Put *some* upper limit on bulk transfer sizes */
35
227k
#define MAX_BULK_TRANSFER_SIZE (128u * 1024u * 1024u)
36
37
/* Upper limit for accepted packet sizes including headers; makes the assumption
38
 * that no header is longer than 1kB
39
 */
40
224k
#define MAX_PACKET_SIZE (1024u + MAX_BULK_TRANSFER_SIZE)
41
42
/* Locking convenience macros */
43
#define LOCK(parser) \
44
99.9k
    do { \
45
99.9k
        if ((parser)->lock) \
46
99.9k
            (parser)->callb.lock_func((parser)->lock); \
47
99.9k
    } while (0)
48
49
#define UNLOCK(parser) \
50
99.9k
    do { \
51
99.9k
        if ((parser)->lock) \
52
99.9k
            (parser)->callb.unlock_func((parser)->lock); \
53
99.9k
    } while (0)
54
55
struct usbredirparser_buf {
56
    uint8_t *buf;
57
    int pos;
58
    int len;
59
60
    struct usbredirparser_buf *next;
61
};
62
63
struct usbredirparser_priv {
64
    struct usbredirparser callb;
65
    int flags;
66
67
    int have_peer_caps;
68
    uint32_t our_caps[USB_REDIR_CAPS_SIZE];
69
    uint32_t peer_caps[USB_REDIR_CAPS_SIZE];
70
71
    void *lock;
72
73
    union {
74
        struct usb_redir_header header;
75
        struct usb_redir_header_32bit_id header_32bit_id;
76
    };
77
    uint8_t type_header[288];
78
    int header_read;
79
    int type_header_len;
80
    int type_header_read;
81
    uint8_t *data;
82
    int data_len;
83
    int data_read;
84
    int to_skip;
85
    int write_buf_count;
86
    struct usbredirparser_buf *write_buf;
87
    uint64_t write_buf_total_size;
88
};
89
90
static void
91
#if defined __MINGW_PRINTF_FORMAT
92
__attribute__((format(__MINGW_PRINTF_FORMAT, 3, 4)))
93
#elif defined __GNUC__
94
__attribute__((format(printf, 3, 4)))
95
#endif
96
va_log(struct usbredirparser_priv *parser, int verbose, const char *fmt, ...)
97
854k
{
98
854k
    char buf[512];
99
854k
    va_list ap;
100
854k
    int n;
101
102
854k
    n = sprintf(buf, "usbredirparser: ");
103
854k
    va_start(ap, fmt);
104
854k
    vsnprintf(buf + n, sizeof(buf) - n, fmt, ap);
105
854k
    va_end(ap);
106
107
854k
    parser->callb.log_func(parser->callb.priv, verbose, buf);
108
854k
}
109
110
134k
#define ERROR(...)   va_log(parser, usbredirparser_error, __VA_ARGS__)
111
10
#define WARNING(...) va_log(parser, usbredirparser_warning, __VA_ARGS__)
112
160
#define INFO(...)    va_log(parser, usbredirparser_info, __VA_ARGS__)
113
719k
#define DEBUG(...)    va_log(parser, usbredirparser_debug, __VA_ARGS__)
114
115
static inline void
116
usbredirparser_assert_invariants(const struct usbredirparser_priv *parser)
117
263k
{
118
263k
#ifdef ENABLE_EXTRA_CHECKS
119
263k
    assert(parser != NULL);
120
263k
    assert(parser->header_read >= 0);
121
263k
    assert(parser->header_read <= sizeof(parser->header));
122
263k
    assert(parser->type_header_read >= 0);
123
263k
    assert(parser->type_header_len <= sizeof(parser->type_header));
124
263k
    assert(parser->type_header_read <= parser->type_header_len);
125
263k
    assert(parser->data_len >= 0);
126
263k
    assert(parser->data_len <= MAX_PACKET_SIZE);
127
263k
    assert(parser->data_read >= 0);
128
263k
    assert(parser->data_read <= parser->data_len);
129
263k
    assert((parser->data_len != 0) ^ (parser->data == NULL));
130
131
263k
    int write_buf_count = 0;
132
263k
    uint64_t total_size = 0;
133
263k
    const struct usbredirparser_buf *write_buf = parser->write_buf;
134
364k
    for (; write_buf != NULL ; write_buf = write_buf->next) {
135
100k
        assert(write_buf->pos >= 0);
136
100k
        assert(write_buf->len >= 0);
137
100k
        assert(write_buf->pos <= write_buf->len);
138
100k
        assert(write_buf->len == 0 || write_buf->buf != NULL);
139
100k
        write_buf_count++;
140
100k
        total_size += write_buf->len;
141
100k
    }
142
263k
    assert(parser->write_buf_count == write_buf_count);
143
263k
    assert(parser->write_buf_total_size == total_size);
144
263k
#endif
145
263k
}
146
147
#if 0 /* Can be enabled and called from random place to test serialization */
148
static void serialize_test(struct usbredirparser *parser_pub)
149
{
150
    struct usbredirparser_priv *parser =
151
        (struct usbredirparser_priv *)parser_pub;
152
    struct usbredirparser_buf *wbuf, *next_wbuf;
153
    uint8_t *data;
154
    int len;
155
156
    if (usbredirparser_serialize(parser_pub, &data, &len))
157
        return;
158
159
    wbuf = parser->write_buf;
160
    while (wbuf) {
161
        next_wbuf = wbuf->next;
162
        free(wbuf->buf);
163
        free(wbuf);
164
        wbuf = next_wbuf;
165
    }
166
    parser->write_buf = NULL;
167
    parser->write_buf_count = 0;
168
169
    free(parser->data);
170
    parser->data = NULL;
171
172
    parser->type_header_len = parser->data_len = parser->have_peer_caps = 0;
173
174
    usbredirparser_unserialize(parser_pub, data, len);
175
    free(data);
176
}
177
#endif
178
179
static void usbredirparser_queue(struct usbredirparser *parser, uint32_t type,
180
    uint64_t id, void *type_header_in, uint8_t *data_in, int data_len);
181
static int usbredirparser_caps_get_cap(struct usbredirparser_priv *parser,
182
    uint32_t *caps, int cap);
183
184
USBREDIR_VISIBLE
185
struct usbredirparser *usbredirparser_create(void)
186
3.01k
{
187
3.01k
    return calloc(1, sizeof(struct usbredirparser_priv));
188
3.01k
}
189
190
static void usbredirparser_verify_caps(struct usbredirparser_priv *parser,
191
    uint32_t *caps, const char *desc)
192
3.09k
{
193
3.09k
    if (usbredirparser_caps_get_cap(parser, caps,
194
3.09k
                                    usb_redir_cap_bulk_streams) &&
195
3.09k
        !usbredirparser_caps_get_cap(parser, caps,
196
1.27k
                                     usb_redir_cap_ep_info_max_packet_size)) {
197
414
        ERROR("error %s caps contains cap_bulk_streams without"
198
414
              "cap_ep_info_max_packet_size", desc);
199
414
        caps[0] &= ~(1 << usb_redir_cap_bulk_streams);
200
414
    }
201
3.09k
}
202
203
USBREDIR_VISIBLE
204
void usbredirparser_init(struct usbredirparser *parser_pub,
205
    const char *version, uint32_t *caps, int caps_len, int flags)
206
3.01k
{
207
3.01k
    struct usbredirparser_priv *parser =
208
3.01k
        (struct usbredirparser_priv *)parser_pub;
209
3.01k
    struct usb_redir_hello_header hello = { { 0 }, };
210
211
3.01k
    parser->flags = (flags & ~usbredirparser_fl_no_hello);
212
3.01k
    if (parser->callb.alloc_lock_func) {
213
3.01k
        parser->lock = parser->callb.alloc_lock_func();
214
3.01k
    }
215
216
3.01k
    snprintf(hello.version, sizeof(hello.version), "%s", version);
217
3.01k
    if (caps_len > USB_REDIR_CAPS_SIZE) {
218
0
        caps_len = USB_REDIR_CAPS_SIZE;
219
0
    }
220
3.01k
    memcpy(parser->our_caps, caps, caps_len * sizeof(uint32_t));
221
    /* libusbredirparser handles sending the ack internally */
222
3.01k
    if (!(flags & usbredirparser_fl_usb_host))
223
1.69k
        usbredirparser_caps_set_cap(parser->our_caps,
224
1.69k
                                    usb_redir_cap_device_disconnect_ack);
225
3.01k
    usbredirparser_verify_caps(parser, parser->our_caps, "our");
226
3.01k
    if (!(flags & usbredirparser_fl_no_hello))
227
1.37k
        usbredirparser_queue(parser_pub, usb_redir_hello, 0, &hello,
228
1.37k
                             (uint8_t *)parser->our_caps,
229
1.37k
                             USB_REDIR_CAPS_SIZE * sizeof(uint32_t));
230
3.01k
}
231
232
USBREDIR_VISIBLE
233
void usbredirparser_destroy(struct usbredirparser *parser_pub)
234
3.01k
{
235
3.01k
    struct usbredirparser_priv *parser =
236
3.01k
        (struct usbredirparser_priv *)parser_pub;
237
3.01k
    struct usbredirparser_buf *wbuf, *next_wbuf;
238
239
3.01k
    free(parser->data);
240
3.01k
    parser->data = NULL;
241
242
3.01k
    wbuf = parser->write_buf;
243
8.33k
    while (wbuf) {
244
5.32k
        next_wbuf = wbuf->next;
245
5.32k
        free(wbuf->buf);
246
5.32k
        free(wbuf);
247
5.32k
        wbuf = next_wbuf;
248
5.32k
    }
249
250
3.01k
    if (parser->lock)
251
0
        parser->callb.free_lock_func(parser->lock);
252
253
3.01k
    free(parser);
254
3.01k
}
255
256
USBREDIR_VISIBLE
257
uint64_t usbredirparser_get_bufferered_output_size(struct usbredirparser *parser_pub)
258
0
{
259
0
    struct usbredirparser_priv *parser =
260
0
        (struct usbredirparser_priv *)parser_pub;
261
0
    uint64_t size;
262
263
0
    LOCK(parser);
264
0
    size = parser->write_buf_total_size;
265
0
    UNLOCK(parser);
266
0
    return size;
267
0
}
268
269
static int usbredirparser_caps_get_cap(struct usbredirparser_priv *parser,
270
    uint32_t *caps, int cap)
271
1.17M
{
272
1.17M
    if (cap / 32 >= USB_REDIR_CAPS_SIZE) {
273
0
        ERROR("error request for out of bounds cap: %d", cap);
274
0
        return 0;
275
0
    }
276
1.17M
    if (caps[cap / 32] & (1 << (cap % 32))) {
277
972k
        return 1;
278
972k
    } else {
279
204k
        return 0;
280
204k
    }
281
1.17M
}
282
283
USBREDIR_VISIBLE
284
void usbredirparser_caps_set_cap(uint32_t *caps, int cap)
285
1.69k
{
286
1.69k
    caps[cap / 32] |= 1 << (cap % 32);
287
1.69k
}
288
289
USBREDIR_VISIBLE
290
int usbredirparser_have_peer_caps(struct usbredirparser *parser_pub)
291
0
{
292
0
    struct usbredirparser_priv *parser =
293
0
        (struct usbredirparser_priv *)parser_pub;
294
295
0
    return parser->have_peer_caps;
296
0
}
297
298
USBREDIR_VISIBLE
299
int usbredirparser_peer_has_cap(struct usbredirparser *parser_pub, int cap)
300
605k
{
301
605k
    struct usbredirparser_priv *parser =
302
605k
        (struct usbredirparser_priv *)parser_pub;
303
605k
    return usbredirparser_caps_get_cap(parser, parser->peer_caps, cap);
304
605k
}
305
306
USBREDIR_VISIBLE
307
int usbredirparser_have_cap(struct usbredirparser *parser_pub, int cap)
308
567k
{
309
567k
    struct usbredirparser_priv *parser =
310
567k
        (struct usbredirparser_priv *)parser_pub;
311
567k
    return usbredirparser_caps_get_cap(parser, parser->our_caps, cap);
312
567k
}
313
314
static int usbredirparser_using_32bits_ids(struct usbredirparser *parser_pub)
315
551k
{
316
551k
    return !usbredirparser_have_cap(parser_pub, usb_redir_cap_64bits_ids) ||
317
551k
           !usbredirparser_peer_has_cap(parser_pub, usb_redir_cap_64bits_ids);
318
551k
}
319
320
static void usbredirparser_handle_hello(struct usbredirparser *parser_pub,
321
    struct usb_redir_hello_header *hello, uint8_t *data, int data_len)
322
910
{
323
910
    struct usbredirparser_priv *parser =
324
910
        (struct usbredirparser_priv *)parser_pub;
325
910
    uint32_t *peer_caps = (uint32_t *)data;
326
910
    char buf[64];
327
910
    int i;
328
329
910
    if (parser->have_peer_caps) {
330
830
        ERROR("Received second hello message, ignoring");
331
830
        return;
332
830
    }
333
334
    /* In case hello->version is not 0 terminated (which would be a protocol
335
       violation)_ */
336
80
    strncpy(buf, hello->version, sizeof(buf));
337
80
    buf[sizeof(buf)-1] = '\0';
338
339
80
    memset(parser->peer_caps, 0, sizeof(parser->peer_caps));
340
80
    if (data_len > sizeof(parser->peer_caps)) {
341
36
        data_len = sizeof(parser->peer_caps);
342
36
    }
343
140
    for (i = 0; i < data_len / sizeof(uint32_t); i++) {
344
60
        parser->peer_caps[i] = peer_caps[i];
345
60
    }
346
80
    usbredirparser_verify_caps(parser, parser->peer_caps, "peer");
347
80
    parser->have_peer_caps = 1;
348
349
80
    INFO("Peer version: %s, using %d-bits ids", buf,
350
80
         usbredirparser_using_32bits_ids(parser_pub) ? 32 : 64);
351
352
    /* Added in 0.3.2, so no guarantee it is there */
353
80
    if (parser->callb.hello_func)
354
80
        parser->callb.hello_func(parser->callb.priv, hello);
355
80
}
356
357
static int usbredirparser_get_header_len(struct usbredirparser *parser_pub)
358
341k
{
359
341k
    if (usbredirparser_using_32bits_ids(parser_pub))
360
163k
        return sizeof(struct usb_redir_header_32bit_id);
361
178k
    else
362
178k
        return sizeof(struct usb_redir_header);
363
341k
}
364
365
static int usbredirparser_get_type_header_len(
366
    struct usbredirparser *parser_pub, int32_t type, int send)
367
340k
{
368
340k
    struct usbredirparser_priv *parser =
369
340k
        (struct usbredirparser_priv *)parser_pub;
370
340k
    int command_for_host = 0;
371
372
340k
    if (parser->flags & usbredirparser_fl_usb_host) {
373
21.0k
        command_for_host = 1;
374
21.0k
    }
375
340k
    if (send) {
376
98.7k
        command_for_host = !command_for_host;
377
98.7k
    }
378
379
340k
    switch (type) {
380
101k
    case usb_redir_hello:
381
101k
        return sizeof(struct usb_redir_hello_header);
382
1.26k
    case usb_redir_device_connect:
383
1.26k
        if (!command_for_host) {
384
985
            if (usbredirparser_have_cap(parser_pub,
385
985
                                    usb_redir_cap_connect_device_version) &&
386
985
                usbredirparser_peer_has_cap(parser_pub,
387
645
                                    usb_redir_cap_connect_device_version)) {
388
201
                return sizeof(struct usb_redir_device_connect_header);
389
784
            } else {
390
784
                return sizeof(struct usb_redir_device_connect_header_no_device_version);
391
784
            }
392
985
        } else {
393
281
            return -1;
394
281
        }
395
98.2k
    case usb_redir_device_disconnect:
396
98.2k
        if (!command_for_host) {
397
97.7k
            return 0;
398
97.7k
        } else {
399
535
            return -1;
400
535
        }
401
463
    case usb_redir_reset:
402
463
        if (command_for_host) {
403
249
            return 0; /* No packet type specific header */
404
249
        } else {
405
214
            return -1;
406
214
        }
407
922
    case usb_redir_interface_info:
408
922
        if (!command_for_host) {
409
706
            return sizeof(struct usb_redir_interface_info_header);
410
706
        } else {
411
216
            return -1;
412
216
        }
413
1.48k
    case usb_redir_ep_info:
414
1.48k
        if (!command_for_host) {
415
1.09k
            if (usbredirparser_have_cap(parser_pub,
416
1.09k
                                    usb_redir_cap_bulk_streams) &&
417
1.09k
                usbredirparser_peer_has_cap(parser_pub,
418
443
                                    usb_redir_cap_bulk_streams)) {
419
202
                return sizeof(struct usb_redir_ep_info_header);
420
897
            } else if (usbredirparser_have_cap(parser_pub,
421
897
                                    usb_redir_cap_ep_info_max_packet_size) &&
422
897
                       usbredirparser_peer_has_cap(parser_pub,
423
503
                                    usb_redir_cap_ep_info_max_packet_size)) {
424
224
                return sizeof(struct usb_redir_ep_info_header_no_max_streams);
425
673
            } else {
426
673
                return sizeof(struct usb_redir_ep_info_header_no_max_pktsz);
427
673
            }
428
1.09k
        } else {
429
386
            return -1;
430
386
        }
431
549
    case usb_redir_set_configuration:
432
549
        if (command_for_host) {
433
345
            return sizeof(struct usb_redir_set_configuration_header);
434
345
        } else {
435
204
            return -1; /* Should never be send to a guest */
436
204
        }
437
574
    case usb_redir_get_configuration:
438
574
        if (command_for_host) {
439
318
            return 0; /* No packet type specific header */
440
318
        } else {
441
256
            return -1;
442
256
        }
443
605
    case usb_redir_configuration_status:
444
605
        if (!command_for_host) {
445
411
            return sizeof(struct usb_redir_configuration_status_header);
446
411
        } else {
447
194
            return -1;
448
194
        }
449
588
    case usb_redir_set_alt_setting:
450
588
        if (command_for_host) {
451
394
            return sizeof(struct usb_redir_set_alt_setting_header);
452
394
        } else {
453
194
            return -1;
454
194
        }
455
1.50k
    case usb_redir_get_alt_setting:
456
1.50k
        if (command_for_host) {
457
532
            return sizeof(struct usb_redir_get_alt_setting_header);
458
976
        } else {
459
976
            return -1;
460
976
        }
461
598
    case usb_redir_alt_setting_status:
462
598
        if (!command_for_host) {
463
399
            return sizeof(struct usb_redir_alt_setting_status_header);
464
399
        } else {
465
199
            return -1;
466
199
        }
467
659
    case usb_redir_start_iso_stream:
468
659
        if (command_for_host) {
469
409
            return sizeof(struct usb_redir_start_iso_stream_header);
470
409
        } else {
471
250
            return -1;
472
250
        }
473
700
    case usb_redir_stop_iso_stream:
474
700
        if (command_for_host) {
475
378
            return sizeof(struct usb_redir_stop_iso_stream_header);
476
378
        } else {
477
322
            return -1;
478
322
        }
479
573
    case usb_redir_iso_stream_status:
480
573
        if (!command_for_host) {
481
378
            return sizeof(struct usb_redir_iso_stream_status_header);
482
378
        } else {
483
195
            return -1;
484
195
        }
485
1.33k
    case usb_redir_start_interrupt_receiving:
486
1.33k
        if (command_for_host) {
487
786
            return sizeof(struct usb_redir_start_interrupt_receiving_header);
488
786
        } else {
489
552
            return -1;
490
552
        }
491
1.44k
    case usb_redir_stop_interrupt_receiving:
492
1.44k
        if (command_for_host) {
493
825
            return sizeof(struct usb_redir_stop_interrupt_receiving_header);
494
825
        } else {
495
617
            return -1;
496
617
        }
497
841
    case usb_redir_interrupt_receiving_status:
498
841
        if (!command_for_host) {
499
646
            return sizeof(struct usb_redir_interrupt_receiving_status_header);
500
646
        } else {
501
195
            return -1;
502
195
        }
503
604
    case usb_redir_alloc_bulk_streams:
504
604
        if (command_for_host) {
505
391
            return sizeof(struct usb_redir_alloc_bulk_streams_header);
506
391
        } else {
507
213
            return -1;
508
213
        }
509
991
    case usb_redir_free_bulk_streams:
510
991
        if (command_for_host) {
511
531
            return sizeof(struct usb_redir_free_bulk_streams_header);
512
531
        } else {
513
460
            return -1;
514
460
        }
515
619
    case usb_redir_bulk_streams_status:
516
619
        if (!command_for_host) {
517
388
            return sizeof(struct usb_redir_bulk_streams_status_header);
518
388
        } else {
519
231
            return -1;
520
231
        }
521
659
    case usb_redir_cancel_data_packet:
522
659
        if (command_for_host) {
523
427
            return 0; /* No packet type specific header */
524
427
        } else {
525
232
            return -1;
526
232
        }
527
991
    case usb_redir_filter_reject:
528
991
        if (command_for_host) {
529
747
            return 0;
530
747
        } else {
531
244
            return -1;
532
244
        }
533
5.08k
    case usb_redir_filter_filter:
534
5.08k
        return 0;
535
98.8k
    case usb_redir_device_disconnect_ack:
536
98.8k
        if (command_for_host) {
537
98.0k
            return 0;
538
98.0k
        } else {
539
793
            return -1;
540
793
        }
541
1.28k
    case usb_redir_start_bulk_receiving:
542
1.28k
        if (command_for_host) {
543
1.06k
            return sizeof(struct usb_redir_start_bulk_receiving_header);
544
1.06k
        } else {
545
215
            return -1;
546
215
        }
547
990
    case usb_redir_stop_bulk_receiving:
548
990
        if (command_for_host) {
549
794
            return sizeof(struct usb_redir_stop_bulk_receiving_header);
550
794
        } else {
551
196
            return -1;
552
196
        }
553
1.11k
    case usb_redir_bulk_receiving_status:
554
1.11k
        if (!command_for_host) {
555
893
            return sizeof(struct usb_redir_bulk_receiving_status_header);
556
893
        } else {
557
217
            return -1;
558
217
        }
559
1.07k
    case usb_redir_control_packet:
560
1.07k
        return sizeof(struct usb_redir_control_packet_header);
561
1.95k
    case usb_redir_bulk_packet:
562
1.95k
        if (usbredirparser_have_cap(parser_pub,
563
1.95k
                                usb_redir_cap_32bits_bulk_length) &&
564
1.95k
            usbredirparser_peer_has_cap(parser_pub,
565
1.20k
                                usb_redir_cap_32bits_bulk_length)) {
566
584
            return sizeof(struct usb_redir_bulk_packet_header);
567
1.36k
        } else {
568
1.36k
            return sizeof(struct usb_redir_bulk_packet_header_16bit_length);
569
1.36k
        }
570
1.06k
    case usb_redir_iso_packet:
571
1.06k
        return sizeof(struct usb_redir_iso_packet_header);
572
1.19k
    case usb_redir_interrupt_packet:
573
1.19k
        return sizeof(struct usb_redir_interrupt_packet_header);
574
1.41k
    case usb_redir_buffered_bulk_packet:
575
1.41k
        if (!command_for_host) {
576
1.22k
            return sizeof(struct usb_redir_buffered_bulk_packet_header);
577
1.22k
        } else {
578
195
            return -1;
579
195
        }
580
8.75k
    default:
581
8.75k
        return -1;
582
340k
    }
583
340k
}
584
585
/* Note this function only checks if extra data is allowed for the
586
   packet type being read at all, a check if it is actually allowed
587
   given the direction of the packet + ep is done in _verify_type_header */
588
static int usbredirparser_expect_extra_data(struct usbredirparser_priv *parser)
589
8.18k
{
590
8.18k
    switch (parser->header.type) {
591
962
    case usb_redir_hello: /* For the variable length capabilities array */
592
5.66k
    case usb_redir_filter_filter:
593
6.19k
    case usb_redir_control_packet:
594
6.58k
    case usb_redir_bulk_packet:
595
6.89k
    case usb_redir_iso_packet:
596
7.27k
    case usb_redir_interrupt_packet:
597
7.71k
    case usb_redir_buffered_bulk_packet:
598
7.71k
        return 1;
599
472
    default:
600
472
        return 0;
601
8.18k
    }
602
8.18k
}
603
604
static int usbredirparser_verify_bulk_recv_cap(
605
    struct usbredirparser *parser_pub, int send)
606
3.35k
{
607
3.35k
    struct usbredirparser_priv *parser =
608
3.35k
        (struct usbredirparser_priv *)parser_pub;
609
610
3.35k
    if ((send && !usbredirparser_peer_has_cap(parser_pub,
611
0
                                              usb_redir_cap_bulk_receiving)) ||
612
3.35k
        (!send && !usbredirparser_have_cap(parser_pub,
613
3.35k
                                           usb_redir_cap_bulk_receiving))) {
614
826
        ERROR("error bulk_receiving without cap_bulk_receiving");
615
826
        return 0;
616
826
    }
617
2.52k
    return 1; /* Verify ok */
618
3.35k
}
619
620
static int usbredirparser_verify_type_header(
621
    struct usbredirparser *parser_pub,
622
    int32_t type, void *header, uint8_t *data, int data_len, int send)
623
217k
{
624
217k
    struct usbredirparser_priv *parser =
625
217k
        (struct usbredirparser_priv *)parser_pub;
626
217k
    int command_for_host = 0, expect_extra_data = 0;
627
217k
    uint32_t length = 0;
628
217k
    int ep = -1;
629
630
217k
    if (parser->flags & usbredirparser_fl_usb_host) {
631
11.6k
        command_for_host = 1;
632
11.6k
    }
633
217k
    if (send) {
634
98.7k
        command_for_host = !command_for_host;
635
98.7k
    }
636
637
217k
    switch (type) {
638
484
    case usb_redir_interface_info: {
639
484
        struct usb_redir_interface_info_header *intf_info = header;
640
641
484
        if (intf_info->interface_count > 32) {
642
233
            ERROR("error interface_count > 32");
643
233
            return 0;
644
233
        }
645
251
        break;
646
484
    }
647
749
    case usb_redir_start_interrupt_receiving: {
648
749
        struct usb_redir_start_interrupt_receiving_header *start_int = header;
649
650
749
        if (!(start_int->endpoint & 0x80)) {
651
208
            ERROR("start int receiving on non input ep %02x",
652
208
                  start_int->endpoint);
653
208
            return 0;
654
208
        }
655
541
        break;
656
749
    }
657
801
    case usb_redir_stop_interrupt_receiving: {
658
801
        struct usb_redir_stop_interrupt_receiving_header *stop_int = header;
659
660
801
        if (!(stop_int->endpoint & 0x80)) {
661
425
            ERROR("stop int receiving on non input ep %02x",
662
425
                  stop_int->endpoint);
663
425
            return 0;
664
425
        }
665
376
        break;
666
801
    }
667
464
    case usb_redir_interrupt_receiving_status: {
668
464
        struct usb_redir_interrupt_receiving_status_header *int_status = header;
669
670
464
        if (!(int_status->endpoint & 0x80)) {
671
261
            ERROR("int receiving status for non input ep %02x",
672
261
                  int_status->endpoint);
673
261
            return 0;
674
261
        }
675
203
        break;
676
464
    }
677
676
    case usb_redir_filter_reject:
678
676
        if ((send && !usbredirparser_peer_has_cap(parser_pub,
679
0
                                             usb_redir_cap_filter)) ||
680
676
            (!send && !usbredirparser_have_cap(parser_pub,
681
676
                                             usb_redir_cap_filter))) {
682
305
            ERROR("error filter_reject without cap_filter");
683
305
            return 0;
684
305
        }
685
371
        break;
686
4.88k
    case usb_redir_filter_filter:
687
4.88k
        if ((send && !usbredirparser_peer_has_cap(parser_pub,
688
0
                                             usb_redir_cap_filter)) ||
689
4.88k
            (!send && !usbredirparser_have_cap(parser_pub,
690
4.88k
                                             usb_redir_cap_filter))) {
691
607
            ERROR("error filter_filter without cap_filter");
692
607
            return 0;
693
607
        }
694
4.28k
        if (data_len < 1) {
695
195
            ERROR("error filter_filter without data");
696
195
            return 0;
697
195
        }
698
4.08k
        if (data[data_len - 1] != 0) {
699
438
            ERROR("error non 0 terminated filter_filter data");
700
438
            return 0;
701
438
        }
702
3.64k
        break;
703
97.9k
    case usb_redir_device_disconnect_ack:
704
97.9k
        if ((send && !usbredirparser_peer_has_cap(parser_pub,
705
97.3k
                                     usb_redir_cap_device_disconnect_ack)) ||
706
97.9k
            (!send && !usbredirparser_have_cap(parser_pub,
707
590
                                     usb_redir_cap_device_disconnect_ack))) {
708
212
            ERROR("error device_disconnect_ack without cap_device_disconnect_ack");
709
212
            return 0;
710
212
        }
711
97.7k
        break;
712
97.7k
    case usb_redir_start_bulk_receiving: {
713
943
        struct usb_redir_start_bulk_receiving_header *start_bulk = header;
714
715
943
        if (!usbredirparser_verify_bulk_recv_cap(parser_pub, send)) {
716
231
            return 0;
717
231
        }
718
712
        if (start_bulk->bytes_per_transfer > MAX_BULK_TRANSFER_SIZE) {
719
239
            ERROR("start bulk receiving length exceeds limits %u > %u",
720
239
                  start_bulk->bytes_per_transfer, MAX_BULK_TRANSFER_SIZE);
721
239
            return 0;
722
239
        }
723
473
        if (!(start_bulk->endpoint & 0x80)) {
724
253
            ERROR("start bulk receiving on non input ep %02x",
725
253
                  start_bulk->endpoint);
726
253
            return 0;
727
253
        }
728
220
        break;
729
473
    }
730
594
    case usb_redir_stop_bulk_receiving: {
731
594
        struct usb_redir_stop_bulk_receiving_header *stop_bulk = header;
732
733
594
        if (!usbredirparser_verify_bulk_recv_cap(parser_pub, send)) {
734
194
            return 0;
735
194
        }
736
400
        if (!(stop_bulk->endpoint & 0x80)) {
737
197
            ERROR("stop bulk receiving on non input ep %02x",
738
197
                  stop_bulk->endpoint);
739
197
            return 0;
740
197
        }
741
203
        break;
742
400
    }
743
688
    case usb_redir_bulk_receiving_status: {
744
688
        struct usb_redir_bulk_receiving_status_header *bulk_status = header;
745
746
688
        if (!usbredirparser_verify_bulk_recv_cap(parser_pub, send)) {
747
205
            return 0;
748
205
        }
749
483
        if (!(bulk_status->endpoint & 0x80)) {
750
219
            ERROR("bulk receiving status for non input ep %02x",
751
219
                  bulk_status->endpoint);
752
219
            return 0;
753
219
        }
754
264
        break;
755
483
    }
756
873
    case usb_redir_control_packet:
757
873
        length = ((struct usb_redir_control_packet_header *)header)->length;
758
873
        ep = ((struct usb_redir_control_packet_header *)header)->endpoint;
759
873
        break;
760
1.26k
    case usb_redir_bulk_packet: {
761
1.26k
        struct usb_redir_bulk_packet_header *bulk_packet = header;
762
1.26k
        if (usbredirparser_have_cap(parser_pub,
763
1.26k
                                usb_redir_cap_32bits_bulk_length) &&
764
1.26k
            usbredirparser_peer_has_cap(parser_pub,
765
811
                                usb_redir_cap_32bits_bulk_length)) {
766
397
            length = (((uint32_t)bulk_packet->length_high) << 16) | bulk_packet->length;
767
865
        } else {
768
865
            length = bulk_packet->length;
769
865
            if (!send)
770
865
                bulk_packet->length_high = 0;
771
865
        }
772
1.26k
        if (length > MAX_BULK_TRANSFER_SIZE) {
773
318
            ERROR("bulk transfer length exceeds limits %u > %u",
774
318
                  (uint32_t)length, MAX_BULK_TRANSFER_SIZE);
775
318
            return 0;
776
318
        }
777
944
        ep = bulk_packet->endpoint;
778
944
        break;
779
1.26k
    }
780
853
    case usb_redir_iso_packet:
781
853
        length = ((struct usb_redir_iso_packet_header *)header)->length;
782
853
        ep = ((struct usb_redir_iso_packet_header *)header)->endpoint;
783
853
        break;
784
1.10k
    case usb_redir_interrupt_packet:
785
1.10k
        length = ((struct usb_redir_interrupt_packet_header *)header)->length;
786
1.10k
        ep = ((struct usb_redir_interrupt_packet_header *)header)->endpoint;
787
1.10k
        break;
788
1.12k
    case usb_redir_buffered_bulk_packet: {
789
1.12k
        struct usb_redir_buffered_bulk_packet_header *buf_bulk_pkt = header;
790
1.12k
        length = buf_bulk_pkt->length;
791
1.12k
        if (!usbredirparser_verify_bulk_recv_cap(parser_pub, send)) {
792
196
            return 0;
793
196
        }
794
929
        if ((uint32_t)length > MAX_BULK_TRANSFER_SIZE) {
795
216
            ERROR("buffered bulk transfer length exceeds limits %u > %u",
796
216
                  (uint32_t)length, MAX_BULK_TRANSFER_SIZE);
797
216
            return 0;
798
216
        }
799
713
        ep = buf_bulk_pkt->endpoint;
800
713
        break;
801
929
    }
802
217k
    }
803
804
212k
    if (ep != -1) {
805
4.48k
        if (((ep & 0x80) && !command_for_host) ||
806
4.48k
            (!(ep & 0x80) && command_for_host)) {
807
2.18k
            expect_extra_data = 1;
808
2.18k
        }
809
4.48k
        if (expect_extra_data) {
810
2.18k
            if (data_len != length) {
811
638
                ERROR("error data len %d != header len %d ep %02X",
812
638
                      data_len, length, ep);
813
638
                return 0;
814
638
            }
815
2.30k
        } else {
816
2.30k
            if (data || data_len) {
817
489
                ERROR("error unexpected extra data ep %02X", ep);
818
489
                return 0;
819
489
            }
820
1.81k
            switch (type) {
821
196
            case usb_redir_iso_packet:
822
196
                ERROR("error iso packet send in wrong direction");
823
196
                return 0;
824
536
            case usb_redir_interrupt_packet:
825
536
                if (command_for_host) {
826
197
                    ERROR("error interrupt packet send in wrong direction");
827
197
                    return 0;
828
197
                }
829
339
                break;
830
339
            case usb_redir_buffered_bulk_packet:
831
333
                ERROR("error buffered bulk packet send in wrong direction");
832
333
                return 0;
833
1.81k
            }
834
1.81k
        }
835
4.48k
    }
836
837
210k
    return 1; /* Verify ok */
838
212k
}
839
840
static void usbredirparser_call_type_func(struct usbredirparser *parser_pub,
841
    bool *data_ownership_transferred)
842
111k
{
843
111k
    struct usbredirparser_priv *parser =
844
111k
        (struct usbredirparser_priv *)parser_pub;
845
111k
    uint64_t id;
846
847
111k
    if (usbredirparser_using_32bits_ids(parser_pub))
848
22.4k
        id = parser->header_32bit_id.id;
849
89.0k
    else
850
89.0k
        id = parser->header.id;
851
852
111k
    switch (parser->header.type) {
853
910
    case usb_redir_hello:
854
910
        usbredirparser_handle_hello(parser_pub,
855
910
            (struct usb_redir_hello_header *)parser->type_header,
856
910
            parser->data, parser->data_len);
857
910
        break;
858
208
    case usb_redir_device_connect:
859
208
        parser->callb.device_connect_func(parser->callb.priv,
860
208
            (struct usb_redir_device_connect_header *)parser->type_header);
861
208
        break;
862
97.7k
    case usb_redir_device_disconnect:
863
97.7k
        parser->callb.device_disconnect_func(parser->callb.priv);
864
97.7k
        if (usbredirparser_peer_has_cap(parser_pub,
865
97.7k
                                        usb_redir_cap_device_disconnect_ack))
866
97.3k
            usbredirparser_queue(parser_pub, usb_redir_device_disconnect_ack,
867
97.3k
                                 0, NULL, NULL, 0);
868
97.7k
        break;
869
241
    case usb_redir_reset:
870
241
        parser->callb.reset_func(parser->callb.priv);
871
241
        break;
872
251
    case usb_redir_interface_info:
873
251
        parser->callb.interface_info_func(parser->callb.priv,
874
251
            (struct usb_redir_interface_info_header *)parser->type_header);
875
251
        break;
876
219
    case usb_redir_ep_info:
877
219
        parser->callb.ep_info_func(parser->callb.priv,
878
219
            (struct usb_redir_ep_info_header *)parser->type_header);
879
219
        break;
880
334
    case usb_redir_set_configuration:
881
334
        parser->callb.set_configuration_func(parser->callb.priv, id,
882
334
            (struct usb_redir_set_configuration_header *)parser->type_header);
883
334
        break;
884
211
    case usb_redir_get_configuration:
885
211
        parser->callb.get_configuration_func(parser->callb.priv, id);
886
211
        break;
887
244
    case usb_redir_configuration_status:
888
244
        parser->callb.configuration_status_func(parser->callb.priv, id,
889
244
          (struct usb_redir_configuration_status_header *)parser->type_header);
890
244
        break;
891
194
    case usb_redir_set_alt_setting:
892
194
        parser->callb.set_alt_setting_func(parser->callb.priv, id,
893
194
            (struct usb_redir_set_alt_setting_header *)parser->type_header);
894
194
        break;
895
421
    case usb_redir_get_alt_setting:
896
421
        parser->callb.get_alt_setting_func(parser->callb.priv, id,
897
421
            (struct usb_redir_get_alt_setting_header *)parser->type_header);
898
421
        break;
899
197
    case usb_redir_alt_setting_status:
900
197
        parser->callb.alt_setting_status_func(parser->callb.priv, id,
901
197
            (struct usb_redir_alt_setting_status_header *)parser->type_header);
902
197
        break;
903
197
    case usb_redir_start_iso_stream:
904
197
        parser->callb.start_iso_stream_func(parser->callb.priv, id,
905
197
            (struct usb_redir_start_iso_stream_header *)parser->type_header);
906
197
        break;
907
195
    case usb_redir_stop_iso_stream:
908
195
        parser->callb.stop_iso_stream_func(parser->callb.priv, id,
909
195
            (struct usb_redir_stop_iso_stream_header *)parser->type_header);
910
195
        break;
911
211
    case usb_redir_iso_stream_status:
912
211
        parser->callb.iso_stream_status_func(parser->callb.priv, id,
913
211
            (struct usb_redir_iso_stream_status_header *)parser->type_header);
914
211
        break;
915
541
    case usb_redir_start_interrupt_receiving:
916
541
        parser->callb.start_interrupt_receiving_func(parser->callb.priv, id,
917
541
            (struct usb_redir_start_interrupt_receiving_header *)
918
541
            parser->type_header);
919
541
        break;
920
376
    case usb_redir_stop_interrupt_receiving:
921
376
        parser->callb.stop_interrupt_receiving_func(parser->callb.priv, id,
922
376
            (struct usb_redir_stop_interrupt_receiving_header *)
923
376
            parser->type_header);
924
376
        break;
925
203
    case usb_redir_interrupt_receiving_status:
926
203
        parser->callb.interrupt_receiving_status_func(parser->callb.priv, id,
927
203
            (struct usb_redir_interrupt_receiving_status_header *)
928
203
            parser->type_header);
929
203
        break;
930
194
    case usb_redir_alloc_bulk_streams:
931
194
        parser->callb.alloc_bulk_streams_func(parser->callb.priv, id,
932
194
            (struct usb_redir_alloc_bulk_streams_header *)parser->type_header);
933
194
        break;
934
195
    case usb_redir_free_bulk_streams:
935
195
        parser->callb.free_bulk_streams_func(parser->callb.priv, id,
936
195
            (struct usb_redir_free_bulk_streams_header *)parser->type_header);
937
195
        break;
938
194
    case usb_redir_bulk_streams_status:
939
194
        parser->callb.bulk_streams_status_func(parser->callb.priv, id,
940
194
          (struct usb_redir_bulk_streams_status_header *)parser->type_header);
941
194
        break;
942
397
    case usb_redir_cancel_data_packet:
943
397
        parser->callb.cancel_data_packet_func(parser->callb.priv, id);
944
397
        break;
945
371
    case usb_redir_filter_reject:
946
371
        parser->callb.filter_reject_func(parser->callb.priv);
947
371
        break;
948
3.64k
    case usb_redir_filter_filter: {
949
3.64k
        struct usbredirfilter_rule *rules;
950
3.64k
        int r, count;
951
952
3.64k
        r = usbredirfilter_string_to_rules((char *)parser->data, ",", "|",
953
3.64k
                                           &rules, &count);
954
3.64k
        if (r) {
955
3.06k
            ERROR("error parsing filter (%d), ignoring filter message", r);
956
3.06k
            break;
957
3.06k
        }
958
585
        parser->callb.filter_filter_func(parser->callb.priv, rules, count);
959
585
        break;
960
3.64k
    }
961
378
    case usb_redir_device_disconnect_ack:
962
378
        parser->callb.device_disconnect_ack_func(parser->callb.priv);
963
378
        break;
964
220
    case usb_redir_start_bulk_receiving:
965
220
        parser->callb.start_bulk_receiving_func(parser->callb.priv, id,
966
220
            (struct usb_redir_start_bulk_receiving_header *)
967
220
            parser->type_header);
968
220
        break;
969
203
    case usb_redir_stop_bulk_receiving:
970
203
        parser->callb.stop_bulk_receiving_func(parser->callb.priv, id,
971
203
            (struct usb_redir_stop_bulk_receiving_header *)
972
203
            parser->type_header);
973
203
        break;
974
264
    case usb_redir_bulk_receiving_status:
975
264
        parser->callb.bulk_receiving_status_func(parser->callb.priv, id,
976
264
            (struct usb_redir_bulk_receiving_status_header *)
977
264
            parser->type_header);
978
264
        break;
979
796
    case usb_redir_control_packet:
980
796
        *data_ownership_transferred = true;
981
796
        parser->callb.control_packet_func(parser->callb.priv, id,
982
796
            (struct usb_redir_control_packet_header *)parser->type_header,
983
796
            parser->data, parser->data_len);
984
796
        break;
985
585
    case usb_redir_bulk_packet:
986
585
        *data_ownership_transferred = true;
987
585
        parser->callb.bulk_packet_func(parser->callb.priv, id,
988
585
            (struct usb_redir_bulk_packet_header *)parser->type_header,
989
585
            parser->data, parser->data_len);
990
585
        break;
991
455
    case usb_redir_iso_packet:
992
455
        *data_ownership_transferred = true;
993
455
        parser->callb.iso_packet_func(parser->callb.priv, id,
994
455
            (struct usb_redir_iso_packet_header *)parser->type_header,
995
455
            parser->data, parser->data_len);
996
455
        break;
997
547
    case usb_redir_interrupt_packet:
998
547
        *data_ownership_transferred = true;
999
547
        parser->callb.interrupt_packet_func(parser->callb.priv, id,
1000
547
            (struct usb_redir_interrupt_packet_header *)parser->type_header,
1001
547
            parser->data, parser->data_len);
1002
547
        break;
1003
253
    case usb_redir_buffered_bulk_packet:
1004
253
        *data_ownership_transferred = true;
1005
253
        parser->callb.buffered_bulk_packet_func(parser->callb.priv, id,
1006
253
          (struct usb_redir_buffered_bulk_packet_header *)parser->type_header,
1007
253
          parser->data, parser->data_len);
1008
253
        break;
1009
111k
    }
1010
111k
}
1011
1012
USBREDIR_VISIBLE
1013
int usbredirparser_do_read(struct usbredirparser *parser_pub)
1014
130k
{
1015
130k
    struct usbredirparser_priv *parser =
1016
130k
        (struct usbredirparser_priv *)parser_pub;
1017
130k
    int r, header_len, type_header_len, data_len;
1018
130k
    bool data_ownership_transferred;
1019
130k
    uint8_t *dest;
1020
1021
130k
    header_len = usbredirparser_get_header_len(parser_pub);
1022
1023
130k
    usbredirparser_assert_invariants(parser);
1024
    /* Skip forward to next packet (only used in error conditions) */
1025
756k
    while (parser->to_skip > 0) {
1026
625k
        uint8_t buf[65536];
1027
625k
        r = (parser->to_skip > sizeof(buf)) ? sizeof(buf) : parser->to_skip;
1028
625k
        r = parser->callb.read_func(parser->callb.priv, buf, r);
1029
625k
        if (r <= 0) {
1030
159
            usbredirparser_assert_invariants(parser);
1031
159
            return r;
1032
159
        }
1033
625k
        parser->to_skip -= r;
1034
625k
    }
1035
1036
    /* Consume data until read would block or returns an error */
1037
1.30M
    while (1) {
1038
1.30M
        if (parser->header_read < header_len) {
1039
1.15M
            r = header_len - parser->header_read;
1040
1.15M
            dest = (uint8_t *)&parser->header + parser->header_read;
1041
1.15M
        } else if (parser->type_header_read < parser->type_header_len) {
1042
19.2k
            r = parser->type_header_len - parser->type_header_read;
1043
19.2k
            dest = parser->type_header + parser->type_header_read;
1044
130k
        } else {
1045
130k
            r = parser->data_len - parser->data_read;
1046
130k
            dest = parser->data + parser->data_read;
1047
130k
        }
1048
1049
1.30M
        if (r > 0) {
1050
1.19M
            r = parser->callb.read_func(parser->callb.priv, dest, r);
1051
1.19M
            if (r <= 0) {
1052
1.17k
                usbredirparser_assert_invariants(parser);
1053
1.17k
                return r;
1054
1.17k
            }
1055
1.19M
        }
1056
1057
1.30M
        if (parser->header_read < header_len) {
1058
1.15M
            parser->header_read += r;
1059
1.15M
            if (parser->header_read == header_len) {
1060
241k
                type_header_len =
1061
241k
                    usbredirparser_get_type_header_len(parser_pub,
1062
241k
                                                       parser->header.type, 0);
1063
241k
                if (type_header_len < 0) {
1064
17.5k
                    ERROR("error invalid usb-redir packet type: %u",
1065
17.5k
                          parser->header.type);
1066
17.5k
                    parser->to_skip = parser->header.length;
1067
17.5k
                    parser->header_read = 0;
1068
17.5k
                    usbredirparser_assert_invariants(parser);
1069
17.5k
                    return usbredirparser_read_parse_error;
1070
17.5k
                }
1071
                /* This should never happen */
1072
223k
                if (type_header_len > sizeof(parser->type_header)) {
1073
0
                    ERROR("error type specific header buffer too small, please report!!");
1074
0
                    parser->to_skip = parser->header.length;
1075
0
                    parser->header_read = 0;
1076
0
                    usbredirparser_assert_invariants(parser);
1077
0
                    return usbredirparser_read_parse_error;
1078
0
                }
1079
223k
                if (parser->header.length > MAX_PACKET_SIZE) {
1080
5.24k
                    ERROR("packet length of %d larger than permitted %d bytes",
1081
5.24k
                          parser->header.length, MAX_PACKET_SIZE);
1082
5.24k
                    parser->to_skip = parser->header.length;
1083
5.24k
                    parser->header_read = 0;
1084
5.24k
                    usbredirparser_assert_invariants(parser);
1085
5.24k
                    return usbredirparser_read_parse_error;
1086
5.24k
                }
1087
218k
                if ((int)parser->header.length < type_header_len ||
1088
218k
                    ((int)parser->header.length > type_header_len &&
1089
119k
                     !usbredirparser_expect_extra_data(parser))) {
1090
99.6k
                    ERROR("error invalid packet type %u length: %u",
1091
99.6k
                          parser->header.type, parser->header.length);
1092
99.6k
                    parser->to_skip = parser->header.length;
1093
99.6k
                    parser->header_read = 0;
1094
99.6k
                    usbredirparser_assert_invariants(parser);
1095
99.6k
                    return usbredirparser_read_parse_error;
1096
99.6k
                }
1097
118k
                data_len = parser->header.length - type_header_len;
1098
118k
                if (data_len) {
1099
7.63k
                    parser->data = malloc(data_len);
1100
7.63k
                    if (!parser->data) {
1101
0
                        ERROR("Out of memory allocating data buffer");
1102
0
                        parser->to_skip = parser->header.length;
1103
0
                        parser->header_read = 0;
1104
0
                        usbredirparser_assert_invariants(parser);
1105
0
                        return usbredirparser_read_parse_error;
1106
0
                    }
1107
7.63k
                }
1108
118k
                parser->type_header_len = type_header_len;
1109
118k
                parser->data_len = data_len;
1110
118k
            }
1111
1.15M
        } else if (parser->type_header_read < parser->type_header_len) {
1112
19.1k
            parser->type_header_read += r;
1113
129k
        } else {
1114
129k
            parser->data_read += r;
1115
129k
            if (parser->data_read == parser->data_len) {
1116
118k
                r = usbredirparser_verify_type_header(parser_pub,
1117
118k
                         parser->header.type, parser->type_header,
1118
118k
                         parser->data, parser->data_len, 0);
1119
118k
                data_ownership_transferred = false;
1120
118k
                if (r) {
1121
111k
                    usbredirparser_call_type_func(parser_pub,
1122
111k
                                                  &data_ownership_transferred);
1123
111k
                }
1124
118k
                if (!data_ownership_transferred) {
1125
115k
                    free(parser->data);
1126
115k
                }
1127
118k
                parser->header_read = 0;
1128
118k
                parser->type_header_len  = 0;
1129
118k
                parser->type_header_read = 0;
1130
118k
                parser->data_len  = 0;
1131
118k
                parser->data_read = 0;
1132
118k
                parser->data = NULL;
1133
118k
                if (!r) {
1134
7.00k
                    usbredirparser_assert_invariants(parser);
1135
7.00k
                    return usbredirparser_read_parse_error;
1136
7.00k
                }
1137
                /* header len may change if this was an hello packet */
1138
111k
                header_len = usbredirparser_get_header_len(parser_pub);
1139
111k
            }
1140
129k
        }
1141
1.30M
    }
1142
130k
}
1143
1144
USBREDIR_VISIBLE
1145
int usbredirparser_has_data_to_write(struct usbredirparser *parser_pub)
1146
131k
{
1147
131k
    struct usbredirparser_priv *parser =
1148
131k
        (struct usbredirparser_priv *)parser_pub;
1149
131k
    return parser->write_buf_count;
1150
131k
}
1151
1152
USBREDIR_VISIBLE
1153
int usbredirparser_do_write(struct usbredirparser *parser_pub)
1154
1.25k
{
1155
1.25k
    struct usbredirparser_priv *parser =
1156
1.25k
        (struct usbredirparser_priv *)parser_pub;
1157
1.25k
    struct usbredirparser_buf* wbuf;
1158
1.25k
    int w, ret = 0;
1159
1160
1.25k
    LOCK(parser);
1161
1.25k
    assert((parser->write_buf_count != 0) ^ (parser->write_buf == NULL));
1162
1163
1.48M
    for (;;) {
1164
1.48M
        wbuf = parser->write_buf;
1165
1.48M
        if (!wbuf)
1166
1.25k
            break;
1167
1168
1.48M
        w = wbuf->len - wbuf->pos;
1169
1.48M
        w = parser->callb.write_func(parser->callb.priv,
1170
1.48M
                                     wbuf->buf + wbuf->pos, w);
1171
1.48M
        if (w <= 0) {
1172
0
            ret = w;
1173
0
            break;
1174
0
        }
1175
1176
        /* See usbredirparser_write documentation */
1177
1.48M
        if ((parser->flags & usbredirparser_fl_write_cb_owns_buffer) &&
1178
1.48M
                w != wbuf->len)
1179
0
            abort();
1180
1181
1.48M
        wbuf->pos += w;
1182
1.48M
        if (wbuf->pos == wbuf->len) {
1183
93.6k
            parser->write_buf = wbuf->next;
1184
93.6k
            if (!(parser->flags & usbredirparser_fl_write_cb_owns_buffer))
1185
93.6k
                free(wbuf->buf);
1186
1187
93.6k
            parser->write_buf_total_size -= wbuf->len;
1188
93.6k
            parser->write_buf_count--;
1189
93.6k
            free(wbuf);
1190
93.6k
        }
1191
1.48M
    }
1192
1.25k
    UNLOCK(parser);
1193
1.25k
    return ret;
1194
1.25k
}
1195
1196
USBREDIR_VISIBLE
1197
void usbredirparser_free_write_buffer(struct usbredirparser *parser,
1198
    uint8_t *data)
1199
0
{
1200
0
    free(data);
1201
0
}
1202
1203
USBREDIR_VISIBLE
1204
void usbredirparser_free_packet_data(struct usbredirparser *parser,
1205
    uint8_t *data)
1206
2.63k
{
1207
2.63k
    free(data);
1208
2.63k
}
1209
1210
static void usbredirparser_queue(struct usbredirparser *parser_pub,
1211
    uint32_t type, uint64_t id, void *type_header_in,
1212
    uint8_t *data_in, int data_len)
1213
98.7k
{
1214
98.7k
    struct usbredirparser_priv *parser =
1215
98.7k
        (struct usbredirparser_priv *)parser_pub;
1216
98.7k
    uint8_t *buf, *type_header_out, *data_out;
1217
98.7k
    struct usb_redir_header *header;
1218
98.7k
    struct usbredirparser_buf *wbuf, *new_wbuf;
1219
98.7k
    int header_len, type_header_len, total_size;
1220
1221
98.7k
    header_len = usbredirparser_get_header_len(parser_pub);
1222
98.7k
    type_header_len = usbredirparser_get_type_header_len(parser_pub, type, 1);
1223
98.7k
    if (type_header_len < 0) { /* This should never happen */
1224
0
        ERROR("error packet type unknown with internal call, please report!!");
1225
0
        return;
1226
0
    }
1227
1228
98.7k
    if (!usbredirparser_verify_type_header(parser_pub, type, type_header_in,
1229
98.7k
                                           data_in, data_len, 1)) {
1230
0
        ERROR("error usbredirparser_send_* call invalid params, please report!!");
1231
0
        return;
1232
0
    }
1233
1234
98.7k
    total_size = header_len + type_header_len + data_len;
1235
98.7k
    new_wbuf = calloc(1, sizeof(*new_wbuf));
1236
98.7k
    buf = malloc(total_size);
1237
98.7k
    if (!new_wbuf || !buf) {
1238
0
        ERROR("Out of memory allocating buffer to send packet, dropping!");
1239
0
        free(new_wbuf); free(buf);
1240
0
        return;
1241
0
    }
1242
1243
98.7k
    new_wbuf->buf = buf;
1244
98.7k
    new_wbuf->len = total_size;
1245
1246
98.7k
    header = (struct usb_redir_header *)buf;
1247
98.7k
    type_header_out = buf + header_len;
1248
98.7k
    data_out = type_header_out + type_header_len;
1249
1250
98.7k
    header->type   = type;
1251
98.7k
    header->length = type_header_len + data_len;
1252
98.7k
    if (usbredirparser_using_32bits_ids(parser_pub))
1253
9.86k
        ((struct usb_redir_header_32bit_id *)header)->id = id;
1254
88.8k
    else
1255
88.8k
        header->id = id;
1256
98.7k
    memcpy(type_header_out, type_header_in, type_header_len);
1257
98.7k
    memcpy(data_out, data_in, data_len);
1258
1259
98.7k
    LOCK(parser);
1260
98.7k
    if (!parser->write_buf) {
1261
2.23k
        parser->write_buf = new_wbuf;
1262
96.4k
    } else {
1263
        /* limiting the write_buf's stack depth is our users responsibility */
1264
96.4k
        wbuf = parser->write_buf;
1265
607M
        while (wbuf->next)
1266
606M
            wbuf = wbuf->next;
1267
1268
96.4k
        wbuf->next = new_wbuf;
1269
96.4k
    }
1270
98.7k
    parser->write_buf_total_size += total_size;
1271
98.7k
    parser->write_buf_count++;
1272
98.7k
    UNLOCK(parser);
1273
98.7k
}
1274
1275
USBREDIR_VISIBLE
1276
void usbredirparser_send_device_connect(struct usbredirparser *parser,
1277
    struct usb_redir_device_connect_header *device_connect)
1278
0
{
1279
0
    usbredirparser_queue(parser, usb_redir_device_connect, 0, device_connect,
1280
0
                         NULL, 0);
1281
0
}
1282
1283
USBREDIR_VISIBLE
1284
void usbredirparser_send_device_disconnect(struct usbredirparser *parser)
1285
0
{
1286
0
    usbredirparser_queue(parser, usb_redir_device_disconnect, 0, NULL,
1287
0
                         NULL, 0);
1288
0
}
1289
1290
USBREDIR_VISIBLE
1291
void usbredirparser_send_reset(struct usbredirparser *parser)
1292
0
{
1293
0
    usbredirparser_queue(parser, usb_redir_reset, 0, NULL, NULL, 0);
1294
0
}
1295
1296
USBREDIR_VISIBLE
1297
void usbredirparser_send_interface_info(struct usbredirparser *parser,
1298
    struct usb_redir_interface_info_header *interface_info)
1299
0
{
1300
0
    usbredirparser_queue(parser, usb_redir_interface_info, 0, interface_info,
1301
0
                         NULL, 0);
1302
0
}
1303
1304
USBREDIR_VISIBLE
1305
void usbredirparser_send_ep_info(struct usbredirparser *parser,
1306
    struct usb_redir_ep_info_header *ep_info)
1307
0
{
1308
0
    usbredirparser_queue(parser, usb_redir_ep_info, 0, ep_info, NULL, 0);
1309
0
}
1310
1311
USBREDIR_VISIBLE
1312
void usbredirparser_send_set_configuration(struct usbredirparser *parser,
1313
    uint64_t id,
1314
    struct usb_redir_set_configuration_header *set_configuration)
1315
0
{
1316
0
    usbredirparser_queue(parser, usb_redir_set_configuration, id,
1317
0
                         set_configuration, NULL, 0);
1318
0
}
1319
1320
USBREDIR_VISIBLE
1321
void usbredirparser_send_get_configuration(struct usbredirparser *parser,
1322
    uint64_t id)
1323
0
{
1324
0
    usbredirparser_queue(parser, usb_redir_get_configuration, id,
1325
0
                         NULL, NULL, 0);
1326
0
}
1327
1328
USBREDIR_VISIBLE
1329
void usbredirparser_send_configuration_status(struct usbredirparser *parser,
1330
    uint64_t id,
1331
    struct usb_redir_configuration_status_header *configuration_status)
1332
0
{
1333
0
    usbredirparser_queue(parser, usb_redir_configuration_status, id,
1334
0
                         configuration_status, NULL, 0);
1335
0
}
1336
1337
USBREDIR_VISIBLE
1338
void usbredirparser_send_set_alt_setting(struct usbredirparser *parser,
1339
    uint64_t id,
1340
    struct usb_redir_set_alt_setting_header *set_alt_setting)
1341
0
{
1342
0
    usbredirparser_queue(parser, usb_redir_set_alt_setting, id,
1343
0
                         set_alt_setting, NULL, 0);
1344
0
}
1345
1346
USBREDIR_VISIBLE
1347
void usbredirparser_send_get_alt_setting(struct usbredirparser *parser,
1348
    uint64_t id,
1349
    struct usb_redir_get_alt_setting_header *get_alt_setting)
1350
0
{
1351
0
    usbredirparser_queue(parser, usb_redir_get_alt_setting, id,
1352
0
                         get_alt_setting, NULL, 0);
1353
0
}
1354
1355
USBREDIR_VISIBLE
1356
void usbredirparser_send_alt_setting_status(struct usbredirparser *parser,
1357
    uint64_t id,
1358
    struct usb_redir_alt_setting_status_header *alt_setting_status)
1359
0
{
1360
0
    usbredirparser_queue(parser, usb_redir_alt_setting_status, id,
1361
0
                         alt_setting_status, NULL, 0);
1362
0
}
1363
1364
USBREDIR_VISIBLE
1365
void usbredirparser_send_start_iso_stream(struct usbredirparser *parser,
1366
    uint64_t id,
1367
    struct usb_redir_start_iso_stream_header *start_iso_stream)
1368
0
{
1369
0
    usbredirparser_queue(parser, usb_redir_start_iso_stream, id,
1370
0
                         start_iso_stream, NULL, 0);
1371
0
}
1372
1373
USBREDIR_VISIBLE
1374
void usbredirparser_send_stop_iso_stream(struct usbredirparser *parser,
1375
    uint64_t id,
1376
    struct usb_redir_stop_iso_stream_header *stop_iso_stream)
1377
0
{
1378
0
    usbredirparser_queue(parser, usb_redir_stop_iso_stream, id,
1379
0
                         stop_iso_stream, NULL, 0);
1380
0
}
1381
1382
USBREDIR_VISIBLE
1383
void usbredirparser_send_iso_stream_status(struct usbredirparser *parser,
1384
    uint64_t id,
1385
    struct usb_redir_iso_stream_status_header *iso_stream_status)
1386
0
{
1387
0
    usbredirparser_queue(parser, usb_redir_iso_stream_status, id,
1388
0
                         iso_stream_status, NULL, 0);
1389
0
}
1390
1391
USBREDIR_VISIBLE
1392
void usbredirparser_send_start_interrupt_receiving(struct usbredirparser *parser,
1393
    uint64_t id,
1394
    struct usb_redir_start_interrupt_receiving_header *start_interrupt_receiving)
1395
0
{
1396
0
    usbredirparser_queue(parser, usb_redir_start_interrupt_receiving, id,
1397
0
                         start_interrupt_receiving, NULL, 0);
1398
0
}
1399
1400
USBREDIR_VISIBLE
1401
void usbredirparser_send_stop_interrupt_receiving(struct usbredirparser *parser,
1402
    uint64_t id,
1403
    struct usb_redir_stop_interrupt_receiving_header *stop_interrupt_receiving)
1404
0
{
1405
0
    usbredirparser_queue(parser, usb_redir_stop_interrupt_receiving, id,
1406
0
                         stop_interrupt_receiving, NULL, 0);
1407
0
}
1408
1409
USBREDIR_VISIBLE
1410
void usbredirparser_send_interrupt_receiving_status(struct usbredirparser *parser,
1411
    uint64_t id,
1412
    struct usb_redir_interrupt_receiving_status_header *interrupt_receiving_status)
1413
0
{
1414
0
    usbredirparser_queue(parser, usb_redir_interrupt_receiving_status, id,
1415
0
                         interrupt_receiving_status, NULL, 0);
1416
0
}
1417
1418
USBREDIR_VISIBLE
1419
void usbredirparser_send_alloc_bulk_streams(struct usbredirparser *parser,
1420
    uint64_t id,
1421
    struct usb_redir_alloc_bulk_streams_header *alloc_bulk_streams)
1422
0
{
1423
0
    usbredirparser_queue(parser, usb_redir_alloc_bulk_streams, id,
1424
0
                         alloc_bulk_streams, NULL, 0);
1425
0
}
1426
1427
USBREDIR_VISIBLE
1428
void usbredirparser_send_free_bulk_streams(struct usbredirparser *parser,
1429
    uint64_t id,
1430
    struct usb_redir_free_bulk_streams_header *free_bulk_streams)
1431
0
{
1432
0
    usbredirparser_queue(parser, usb_redir_free_bulk_streams, id,
1433
0
                         free_bulk_streams, NULL, 0);
1434
0
}
1435
1436
USBREDIR_VISIBLE
1437
void usbredirparser_send_bulk_streams_status(struct usbredirparser *parser,
1438
    uint64_t id,
1439
    struct usb_redir_bulk_streams_status_header *bulk_streams_status)
1440
0
{
1441
0
    usbredirparser_queue(parser, usb_redir_bulk_streams_status, id,
1442
0
                         bulk_streams_status, NULL, 0);
1443
0
}
1444
1445
USBREDIR_VISIBLE
1446
void usbredirparser_send_cancel_data_packet(struct usbredirparser *parser,
1447
    uint64_t id)
1448
0
{
1449
0
    usbredirparser_queue(parser, usb_redir_cancel_data_packet, id,
1450
0
                         NULL, NULL, 0);
1451
0
}
1452
1453
USBREDIR_VISIBLE
1454
void usbredirparser_send_filter_reject(struct usbredirparser *parser)
1455
0
{
1456
0
    if (!usbredirparser_peer_has_cap(parser, usb_redir_cap_filter))
1457
0
        return;
1458
1459
0
    usbredirparser_queue(parser, usb_redir_filter_reject, 0, NULL, NULL, 0);
1460
0
}
1461
1462
USBREDIR_VISIBLE
1463
void usbredirparser_send_filter_filter(struct usbredirparser *parser_pub,
1464
    const struct usbredirfilter_rule *rules, int rules_count)
1465
0
{
1466
0
    struct usbredirparser_priv *parser =
1467
0
        (struct usbredirparser_priv *)parser_pub;
1468
0
    char *str;
1469
1470
0
    if (!usbredirparser_peer_has_cap(parser_pub, usb_redir_cap_filter))
1471
0
        return;
1472
1473
0
    str = usbredirfilter_rules_to_string(rules, rules_count, ",", "|");
1474
0
    if (!str) {
1475
0
        ERROR("error creating filter string, not sending filter");
1476
0
        return;
1477
0
    }
1478
0
    usbredirparser_queue(parser_pub, usb_redir_filter_filter, 0, NULL,
1479
0
                         (uint8_t *)str, strlen(str) + 1);
1480
0
    free(str);
1481
0
}
1482
1483
USBREDIR_VISIBLE
1484
void usbredirparser_send_start_bulk_receiving(struct usbredirparser *parser,
1485
    uint64_t id,
1486
    struct usb_redir_start_bulk_receiving_header *start_bulk_receiving)
1487
0
{
1488
0
    usbredirparser_queue(parser, usb_redir_start_bulk_receiving, id,
1489
0
                         start_bulk_receiving, NULL, 0);
1490
0
}
1491
1492
USBREDIR_VISIBLE
1493
void usbredirparser_send_stop_bulk_receiving(struct usbredirparser *parser,
1494
    uint64_t id,
1495
    struct usb_redir_stop_bulk_receiving_header *stop_bulk_receiving)
1496
0
{
1497
0
    usbredirparser_queue(parser, usb_redir_stop_bulk_receiving, id,
1498
0
                         stop_bulk_receiving, NULL, 0);
1499
0
}
1500
1501
USBREDIR_VISIBLE
1502
void usbredirparser_send_bulk_receiving_status(struct usbredirparser *parser,
1503
    uint64_t id,
1504
    struct usb_redir_bulk_receiving_status_header *bulk_receiving_status)
1505
0
{
1506
0
    usbredirparser_queue(parser, usb_redir_bulk_receiving_status, id,
1507
0
                         bulk_receiving_status, NULL, 0);
1508
0
}
1509
1510
/* Data packets: */
1511
USBREDIR_VISIBLE
1512
void usbredirparser_send_control_packet(struct usbredirparser *parser,
1513
    uint64_t id,
1514
    struct usb_redir_control_packet_header *control_header,
1515
    uint8_t *data, int data_len)
1516
0
{
1517
0
    usbredirparser_queue(parser, usb_redir_control_packet, id, control_header,
1518
0
                         data, data_len);
1519
0
}
1520
1521
USBREDIR_VISIBLE
1522
void usbredirparser_send_bulk_packet(struct usbredirparser *parser,
1523
    uint64_t id,
1524
    struct usb_redir_bulk_packet_header *bulk_header,
1525
    uint8_t *data, int data_len)
1526
0
{
1527
0
    usbredirparser_queue(parser, usb_redir_bulk_packet, id, bulk_header,
1528
0
                         data, data_len);
1529
0
}
1530
1531
USBREDIR_VISIBLE
1532
void usbredirparser_send_iso_packet(struct usbredirparser *parser,
1533
    uint64_t id,
1534
    struct usb_redir_iso_packet_header *iso_header,
1535
    uint8_t *data, int data_len)
1536
0
{
1537
0
    usbredirparser_queue(parser, usb_redir_iso_packet, id, iso_header,
1538
0
                         data, data_len);
1539
0
}
1540
1541
USBREDIR_VISIBLE
1542
void usbredirparser_send_interrupt_packet(struct usbredirparser *parser,
1543
    uint64_t id,
1544
    struct usb_redir_interrupt_packet_header *interrupt_header,
1545
    uint8_t *data, int data_len)
1546
0
{
1547
0
    usbredirparser_queue(parser, usb_redir_interrupt_packet, id,
1548
0
                         interrupt_header, data, data_len);
1549
0
}
1550
1551
USBREDIR_VISIBLE
1552
void usbredirparser_send_buffered_bulk_packet(struct usbredirparser *parser,
1553
    uint64_t id,
1554
    struct usb_redir_buffered_bulk_packet_header *buffered_bulk_header,
1555
    uint8_t *data, int data_len)
1556
0
{
1557
0
    usbredirparser_queue(parser, usb_redir_buffered_bulk_packet, id,
1558
0
                         buffered_bulk_header, data, data_len);
1559
0
}
1560
1561
/****** Serialization support ******/
1562
1563
126k
#define USBREDIRPARSER_SERIALIZE_BUF_SIZE     65536
1564
1565
/* Serialization format, send and receiving endian are expected to be the same!
1566
    uint32 MAGIC: 0x55525031 ascii: URP1 (UsbRedirParser version 1)
1567
    uint32 len: length of the entire serialized state, including MAGIC
1568
    uint32 our_caps_len
1569
    uint32 our_caps[our_caps_len]
1570
    uint32 peer_caps_len
1571
    uint32 peer_caps[peer_caps_len]
1572
    uint32 to_skip
1573
    uint32 header_read
1574
    uint8  header[header_read]
1575
    uint32 type_header_read
1576
    uint8  type_header[type_header_read]
1577
    uint32 data_read
1578
    uint8  data[data_read]
1579
    uint32 write_buf_count: followed by write_buf_count times:
1580
        uint32 write_buf_len
1581
        uint8  write_buf_data[write_buf_len]
1582
*/
1583
1584
static int serialize_alloc(struct usbredirparser_priv *parser,
1585
                           uint8_t **state, uint8_t **pos,
1586
                           uint32_t *remain, uint32_t needed)
1587
641k
{
1588
641k
    uint8_t *old_state = *state;
1589
641k
    uint32_t used, size;
1590
1591
641k
    if (*remain >= needed)
1592
577k
        return 0;
1593
1594
63.2k
    used = *pos - *state;
1595
63.2k
    size = (used + needed + USBREDIRPARSER_SERIALIZE_BUF_SIZE - 1) &
1596
63.2k
           ~(USBREDIRPARSER_SERIALIZE_BUF_SIZE - 1);
1597
1598
63.2k
    *state = realloc(*state, size);
1599
63.2k
    if (!*state) {
1600
0
        free(old_state);
1601
0
        ERROR("Out of memory allocating serialization buffer");
1602
0
        return -1;
1603
0
    }
1604
1605
63.2k
    *pos = *state + used;
1606
63.2k
    *remain = size - used;
1607
1608
63.2k
    return 0;
1609
63.2k
}
1610
1611
static int serialize_int(struct usbredirparser_priv *parser,
1612
                         uint8_t **state, uint8_t **pos, uint32_t *remain,
1613
                         uint32_t val, const char *desc)
1614
310k
{
1615
310k
    DEBUG("serializing int %08x : %s", val, desc);
1616
1617
310k
    if (serialize_alloc(parser, state, pos, remain, sizeof(uint32_t)))
1618
0
        return -1;
1619
1620
310k
    memcpy(*pos, &val, sizeof(uint32_t));
1621
310k
    *pos += sizeof(uint32_t);
1622
310k
    *remain -= sizeof(uint32_t);
1623
1624
310k
    return 0;
1625
310k
}
1626
1627
static int unserialize_int(struct usbredirparser_priv *parser,
1628
                           uint8_t **pos, uint32_t *remain, uint32_t *val,
1629
                           const char *desc)
1630
2.63k
{
1631
2.63k
    if (*remain < sizeof(uint32_t)) {
1632
142
        ERROR("error buffer underrun while unserializing state");
1633
142
        return -1;
1634
142
    }
1635
2.49k
    memcpy(val, *pos, sizeof(uint32_t));
1636
2.49k
    *pos += sizeof(uint32_t);
1637
2.49k
    *remain -= sizeof(uint32_t);
1638
1639
2.49k
    DEBUG("unserialized int %08x : %s", *val, desc);
1640
1641
2.49k
    return 0;
1642
2.63k
}
1643
1644
static int serialize_data(struct usbredirparser_priv *parser,
1645
                          uint8_t **state, uint8_t **pos, uint32_t *remain,
1646
                          uint8_t *data, uint32_t len, const char *desc)
1647
330k
{
1648
330k
    DEBUG("serializing %d bytes of %s data", len, desc);
1649
330k
    if (len >= 8)
1650
72.0k
        DEBUG("First 8 bytes of %s: %02x %02x %02x %02x %02x %02x %02x %02x",
1651
330k
              desc, data[0], data[1], data[2], data[3],
1652
330k
                    data[4], data[5], data[6], data[7]);
1653
1654
330k
    if (serialize_alloc(parser, state, pos, remain, sizeof(uint32_t) + len))
1655
0
        return -1;
1656
1657
330k
    memcpy(*pos, &len, sizeof(uint32_t));
1658
330k
    *pos += sizeof(uint32_t);
1659
330k
    *remain -= sizeof(uint32_t);
1660
1661
330k
    memcpy(*pos, data, len);
1662
330k
    *pos += len;
1663
330k
    *remain -= len;
1664
1665
330k
    return 0;
1666
330k
}
1667
1668
/* If *data == NULL, allocs buffer dynamically, else len_in_out must contain
1669
   the length of the passed in buffer. */
1670
static int unserialize_data(struct usbredirparser_priv *parser,
1671
                            uint8_t **pos, uint32_t *remain,
1672
                            uint8_t **data, uint32_t *len_in_out,
1673
                            const char *desc)
1674
3.58k
{
1675
3.58k
    uint32_t len;
1676
1677
3.58k
    if (*remain < sizeof(uint32_t)) {
1678
178
        ERROR("error buffer underrun while unserializing state");
1679
178
        return -1;
1680
178
    }
1681
3.40k
    memcpy(&len, *pos, sizeof(uint32_t));
1682
3.40k
    *pos += sizeof(uint32_t);
1683
3.40k
    *remain -= sizeof(uint32_t);
1684
1685
3.40k
    if (*remain < len) {
1686
81
        ERROR("error buffer underrun while unserializing state");
1687
81
        return -1;
1688
81
    }
1689
3.32k
    if (*data == NULL && len > 0) {
1690
821
        *data = malloc(len);
1691
821
        if (!*data) {
1692
0
            ERROR("Out of memory allocating unserialize buffer");
1693
0
            return -1;
1694
0
        }
1695
2.50k
    } else {
1696
2.50k
        if (*len_in_out < len) {
1697
3
            ERROR("error buffer overrun while unserializing state");
1698
3
            return -1;
1699
3
        }
1700
2.50k
    }
1701
1702
3.32k
    memcpy(*data, *pos, len);
1703
3.32k
    *pos += len;
1704
3.32k
    *remain -= len;
1705
3.32k
    *len_in_out = len;
1706
1707
3.32k
    DEBUG("unserialized %d bytes of %s data", len, desc);
1708
3.32k
    if (len >= 8)
1709
687
        DEBUG("First 8 bytes of %s: %02x %02x %02x %02x %02x %02x %02x %02x",
1710
3.32k
              desc, (*data)[0], (*data)[1], (*data)[2], (*data)[3],
1711
3.32k
              (*data)[4], (*data)[5], (*data)[6], (*data)[7]);
1712
1713
3.32k
    return 0;
1714
3.32k
}
1715
1716
USBREDIR_VISIBLE
1717
int usbredirparser_serialize(struct usbredirparser *parser_pub,
1718
                             uint8_t **state_dest, int *state_len)
1719
63.2k
{
1720
63.2k
    struct usbredirparser_priv *parser =
1721
63.2k
        (struct usbredirparser_priv *)parser_pub;
1722
63.2k
    struct usbredirparser_buf *wbuf;
1723
63.2k
    uint8_t *state = NULL, *pos = NULL;
1724
63.2k
    uint32_t write_buf_count = 0, len, remain = 0;
1725
63.2k
    ptrdiff_t write_buf_count_pos;
1726
1727
63.2k
    *state_dest = NULL;
1728
63.2k
    *state_len = 0;
1729
1730
63.2k
    if (serialize_int(parser, &state, &pos, &remain,
1731
63.2k
                                   USBREDIRPARSER_SERIALIZE_MAGIC, "magic"))
1732
0
        return -1;
1733
1734
    /* To be replaced with length later */
1735
63.2k
    if (serialize_int(parser, &state, &pos, &remain, 0, "length"))
1736
0
        return -1;
1737
1738
63.2k
    if (serialize_data(parser, &state, &pos, &remain,
1739
63.2k
                       (uint8_t *)parser->our_caps,
1740
63.2k
                       USB_REDIR_CAPS_SIZE * sizeof(int32_t), "our_caps"))
1741
0
        return -1;
1742
1743
63.2k
    if (parser->have_peer_caps) {
1744
5.76k
        if (serialize_data(parser, &state, &pos, &remain,
1745
5.76k
                           (uint8_t *)parser->peer_caps,
1746
5.76k
                           USB_REDIR_CAPS_SIZE * sizeof(int32_t), "peer_caps"))
1747
0
            return -1;
1748
57.4k
    } else {
1749
57.4k
        if (serialize_int(parser, &state, &pos, &remain, 0, "peer_caps_len"))
1750
0
            return -1;
1751
57.4k
    }
1752
1753
63.2k
    if (serialize_int(parser, &state, &pos, &remain, parser->to_skip, "skip"))
1754
0
        return -1;
1755
1756
63.2k
    if (serialize_data(parser, &state, &pos, &remain,
1757
63.2k
                       (uint8_t *)&parser->header, parser->header_read,
1758
63.2k
                       "header"))
1759
0
        return -1;
1760
1761
63.2k
    if (serialize_data(parser, &state, &pos, &remain,
1762
63.2k
                       parser->type_header, parser->type_header_read,
1763
63.2k
                       "type_header"))
1764
0
        return -1;
1765
1766
63.2k
    if (serialize_data(parser, &state, &pos, &remain,
1767
63.2k
                       parser->data, parser->data_read, "packet-data"))
1768
0
        return -1;
1769
1770
63.2k
    write_buf_count_pos = pos - state;
1771
    /* To be replaced with write_buf_count later */
1772
63.2k
    if (serialize_int(parser, &state, &pos, &remain, 0, "write_buf_count"))
1773
0
        return -1;
1774
1775
63.2k
    wbuf = parser->write_buf;
1776
135k
    while (wbuf) {
1777
72.1k
        if (serialize_data(parser, &state, &pos, &remain,
1778
72.1k
                           wbuf->buf + wbuf->pos, wbuf->len - wbuf->pos,
1779
72.1k
                           "write-buf"))
1780
0
            return -1;
1781
72.1k
        write_buf_count++;
1782
72.1k
        wbuf = wbuf->next;
1783
72.1k
    }
1784
    /* Patch in write_buf_count */
1785
63.2k
    memcpy(state + write_buf_count_pos, &write_buf_count, sizeof(int32_t));
1786
1787
    /* Patch in length */
1788
63.2k
    len = pos - state;
1789
63.2k
    memcpy(state + sizeof(int32_t), &len, sizeof(int32_t));
1790
1791
63.2k
    *state_dest = state;
1792
63.2k
    *state_len = len;
1793
1794
63.2k
    return 0;
1795
63.2k
}
1796
1797
USBREDIR_VISIBLE
1798
int usbredirparser_unserialize(struct usbredirparser *parser_pub,
1799
                               uint8_t *state, int len)
1800
861
{
1801
861
    struct usbredirparser_priv *parser =
1802
861
        (struct usbredirparser_priv *)parser_pub;
1803
861
    struct usbredirparser_buf *wbuf, **next;
1804
861
    uint32_t orig_caps[USB_REDIR_CAPS_SIZE];
1805
861
    uint8_t *data;
1806
861
    uint32_t i, l, header_len, remain = len;
1807
1808
861
    usbredirparser_assert_invariants(parser);
1809
861
    if (unserialize_int(parser, &state, &remain, &i, "magic")) {
1810
24
        usbredirparser_assert_invariants(parser);
1811
24
        return -1;
1812
24
    }
1813
837
    if (i != USBREDIRPARSER_SERIALIZE_MAGIC) {
1814
0
        ERROR("error unserialize magic mismatch");
1815
0
        usbredirparser_assert_invariants(parser);
1816
0
        return -1;
1817
0
    }
1818
1819
837
    if (!(parser->data == NULL && parser->header_read == 0 &&
1820
837
          parser->type_header_read == 0 && parser->data_read == 0)) {
1821
0
        ERROR("unserialization must use a pristine parser");
1822
0
        usbredirparser_assert_invariants(parser);
1823
0
        return -1;
1824
0
    }
1825
1826
837
    {
1827
        /* We need to reset parser's state to receive unserialized
1828
         * data. */
1829
837
        struct usbredirparser_buf *wbuf = parser->write_buf;
1830
1.29k
        while (wbuf) {
1831
462
            struct usbredirparser_buf *next_wbuf = wbuf->next;
1832
462
            free(wbuf->buf);
1833
462
            free(wbuf);
1834
462
            wbuf = next_wbuf;
1835
462
        }
1836
837
        parser->write_buf = NULL;
1837
837
        parser->write_buf_count = 0;
1838
837
        parser->write_buf_total_size = 0;
1839
837
    }
1840
1841
837
    if (unserialize_int(parser, &state, &remain, &i, "length")) {
1842
61
        usbredirparser_assert_invariants(parser);
1843
61
        return -1;
1844
61
    }
1845
776
    if (i != len) {
1846
88
        ERROR("error unserialize length mismatch");
1847
88
        usbredirparser_assert_invariants(parser);
1848
88
        return -1;
1849
88
    }
1850
1851
688
    data = (uint8_t *)parser->our_caps;
1852
688
    i = USB_REDIR_CAPS_SIZE * sizeof(int32_t);
1853
688
    memcpy(orig_caps, parser->our_caps, i);
1854
688
    if (unserialize_data(parser, &state, &remain, &data, &i, "our_caps")) {
1855
48
        usbredirparser_assert_invariants(parser);
1856
48
        return -1;
1857
48
    }
1858
1.20k
    for (i =0; i < USB_REDIR_CAPS_SIZE; i++) {
1859
640
        if (parser->our_caps[i] != orig_caps[i]) {
1860
            /* orig_caps is our original settings
1861
             * parser->our_caps is off the wire.
1862
             * We want to allow reception from an older
1863
             * usbredir that doesn't have all our features.
1864
             */
1865
89
            if (parser->our_caps[i] & ~orig_caps[i]) {
1866
                /* Source has a cap we don't */
1867
79
                ERROR("error unserialize caps mismatch ours: %x recv: %x",
1868
79
                      orig_caps[i], parser->our_caps[i]);
1869
79
                usbredirparser_assert_invariants(parser);
1870
79
                return -1;
1871
79
            } else {
1872
                /* We've got a cap the source doesn't - that's OK */
1873
10
                WARNING("unserialize missing some caps; ours: %x recv: %x",
1874
10
                      orig_caps[i], parser->our_caps[i]);
1875
10
            }
1876
89
        }
1877
640
    }
1878
1879
561
    data = (uint8_t *)parser->peer_caps;
1880
561
    i = USB_REDIR_CAPS_SIZE * sizeof(int32_t);
1881
561
    if (unserialize_data(parser, &state, &remain, &data, &i, "peer_caps")) {
1882
9
        usbredirparser_assert_invariants(parser);
1883
9
        return -1;
1884
9
    }
1885
552
    if (i)
1886
201
        parser->have_peer_caps = 1;
1887
1888
552
    if (unserialize_int(parser, &state, &remain, &i, "skip")) {
1889
3
        usbredirparser_assert_invariants(parser);
1890
3
        return -1;
1891
3
    }
1892
549
    parser->to_skip = i;
1893
1894
549
    header_len = usbredirparser_get_header_len(parser_pub);
1895
549
    data = (uint8_t *)&parser->header;
1896
549
    i = header_len;
1897
549
    memset(&parser->header, 0, sizeof(parser->header));
1898
549
    if (unserialize_data(parser, &state, &remain, &data, &i, "header")) {
1899
2
        usbredirparser_assert_invariants(parser);
1900
2
        return -1;
1901
2
    }
1902
547
    if (parser->header.length > MAX_PACKET_SIZE) {
1903
17
        ERROR("packet length of %d larger than permitted %d bytes",
1904
17
              parser->header.length, MAX_PACKET_SIZE);
1905
17
        usbredirparser_assert_invariants(parser);
1906
17
        return -1;
1907
17
    }
1908
530
    parser->header_read = i;
1909
530
    parser->type_header_len = 0;
1910
1911
    /* Set various length field from the header (if any) */
1912
530
    if (parser->header_read == header_len) {
1913
112
        int type_header_len =
1914
112
            usbredirparser_get_type_header_len(parser_pub,
1915
112
                                               parser->header.type, 0);
1916
112
        if (type_header_len < 0 ||
1917
112
            type_header_len > sizeof(parser->type_header) ||
1918
112
            parser->header.length < type_header_len ||
1919
112
            (parser->header.length > type_header_len &&
1920
108
             !usbredirparser_expect_extra_data(parser))) {
1921
25
            ERROR("error unserialize packet header invalid");
1922
25
            usbredirparser_assert_invariants(parser);
1923
25
            return -1;
1924
25
        }
1925
87
        parser->type_header_len = type_header_len;
1926
87
    }
1927
1928
505
    data = parser->type_header;
1929
505
    i = parser->type_header_len;
1930
505
    if (unserialize_data(parser, &state, &remain, &data, &i, "type_header")) {
1931
71
        usbredirparser_assert_invariants(parser);
1932
71
        return -1;
1933
71
    }
1934
434
    if (parser->header_read == header_len) {
1935
56
        parser->type_header_read = i;
1936
56
    }
1937
1938
434
    if (parser->type_header_read == parser->type_header_len) {
1939
413
        parser->data_len = parser->header.length - parser->type_header_len;
1940
413
        if (parser->data_len) {
1941
144
            parser->data = malloc(parser->data_len);
1942
144
            if (!parser->data) {
1943
0
                ERROR("Out of memory allocating unserialize buffer");
1944
0
                usbredirparser_assert_invariants(parser);
1945
0
                return -1;
1946
0
            }
1947
144
        }
1948
413
    }
1949
434
    i = parser->data_len;
1950
434
    if (unserialize_data(parser, &state, &remain, &parser->data, &i, "data")) {
1951
49
        free(parser->data);
1952
49
        parser->data = NULL;
1953
49
        parser->data_len = 0;
1954
49
        usbredirparser_assert_invariants(parser);
1955
49
        return -1;
1956
49
    }
1957
385
    if (parser->header_read == header_len &&
1958
385
        parser->type_header_read == parser->type_header_len &&
1959
385
        parser->data_len > 0) {
1960
34
        parser->data_read = i;
1961
351
    } else if (parser->data != NULL) {
1962
143
        free(parser->data);
1963
143
        parser->data = NULL;
1964
143
        parser->data_len = 0;
1965
143
    }
1966
1967
    /* Get the write buffer count and the write buffers */
1968
385
    if (unserialize_int(parser, &state, &remain, &i, "write_buf_count")) {
1969
54
        usbredirparser_assert_invariants(parser);
1970
54
        return -1;
1971
54
    }
1972
331
    next = &parser->write_buf;
1973
331
    usbredirparser_assert_invariants(parser);
1974
1.08k
    while (i) {
1975
846
        uint8_t *buf = NULL;
1976
1977
846
        l = 0;
1978
846
        if (unserialize_data(parser, &state, &remain, &buf, &l, "wbuf")) {
1979
83
            usbredirparser_assert_invariants(parser);
1980
83
            return -1;
1981
83
        }
1982
1983
763
        if (l == 0) {
1984
13
            free(buf);
1985
13
            ERROR("write buffer %d is empty", i);
1986
13
            usbredirparser_assert_invariants(parser);
1987
13
            return -1;
1988
13
        }
1989
1990
750
        wbuf = calloc(1, sizeof(*wbuf));
1991
750
        if (!wbuf) {
1992
0
            free(buf);
1993
0
            ERROR("Out of memory allocating unserialize buffer");
1994
0
            usbredirparser_assert_invariants(parser);
1995
0
            return -1;
1996
0
        }
1997
750
        wbuf->buf = buf;
1998
750
        wbuf->len = l;
1999
750
        *next = wbuf;
2000
750
        next = &wbuf->next;
2001
750
        parser->write_buf_total_size += wbuf->len;
2002
750
        parser->write_buf_count++;
2003
750
        i--;
2004
750
    }
2005
2006
235
    if (remain) {
2007
19
        ERROR("error unserialize %d bytes of extraneous state data", remain);
2008
19
        usbredirparser_assert_invariants(parser);
2009
19
        return -1;
2010
19
    }
2011
2012
216
    usbredirparser_assert_invariants(parser);
2013
216
    return 0;
2014
235
}