Coverage Report

Created: 2026-04-01 06:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/spice-usbredir/usbredirparser/usbredirparser.c
Line
Count
Source
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
260k
#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
258k
#define MAX_PACKET_SIZE (1024u + MAX_BULK_TRANSFER_SIZE)
41
42
/* Locking convenience macros */
43
#define LOCK(parser) \
44
140k
    do { \
45
140k
        if ((parser)->lock) \
46
140k
            (parser)->callb.lock_func((parser)->lock); \
47
140k
    } while (0)
48
49
#define UNLOCK(parser) \
50
140k
    do { \
51
140k
        if ((parser)->lock) \
52
140k
            (parser)->callb.unlock_func((parser)->lock); \
53
140k
    } 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
675k
{
98
675k
    char buf[512];
99
675k
    va_list ap;
100
675k
    int n;
101
102
675k
    n = sprintf(buf, "usbredirparser: ");
103
675k
    va_start(ap, fmt);
104
675k
    vsnprintf(buf + n, sizeof(buf) - n, fmt, ap);
105
675k
    va_end(ap);
106
107
675k
    parser->callb.log_func(parser->callb.priv, verbose, buf);
108
675k
}
109
110
124k
#define ERROR(...)   va_log(parser, usbredirparser_error, __VA_ARGS__)
111
20
#define WARNING(...) va_log(parser, usbredirparser_warning, __VA_ARGS__)
112
154
#define INFO(...)    va_log(parser, usbredirparser_info, __VA_ARGS__)
113
550k
#define DEBUG(...)    va_log(parser, usbredirparser_debug, __VA_ARGS__)
114
115
static inline void
116
usbredirparser_assert_invariants(const struct usbredirparser_priv *parser)
117
244k
{
118
244k
#ifdef ENABLE_EXTRA_CHECKS
119
244k
    assert(parser != NULL);
120
244k
    assert(parser->header_read >= 0);
121
244k
    assert(parser->header_read <= sizeof(parser->header));
122
244k
    assert(parser->type_header_read >= 0);
123
244k
    assert(parser->type_header_len <= sizeof(parser->type_header));
124
244k
    assert(parser->type_header_read <= parser->type_header_len);
125
244k
    assert(parser->data_len >= 0);
126
244k
    assert(parser->data_len <= MAX_PACKET_SIZE);
127
244k
    assert(parser->data_read >= 0);
128
244k
    assert(parser->data_read <= parser->data_len);
129
244k
    assert((parser->data_len != 0) ^ (parser->data == NULL));
130
131
244k
    int write_buf_count = 0;
132
244k
    uint64_t total_size = 0;
133
244k
    const struct usbredirparser_buf *write_buf = parser->write_buf;
134
386k
    for (; write_buf != NULL ; write_buf = write_buf->next) {
135
141k
        assert(write_buf->pos >= 0);
136
141k
        assert(write_buf->len >= 0);
137
141k
        assert(write_buf->pos <= write_buf->len);
138
141k
        assert(write_buf->len == 0 || write_buf->buf != NULL);
139
141k
        write_buf_count++;
140
141k
        total_size += write_buf->len;
141
141k
    }
142
244k
    assert(parser->write_buf_count == write_buf_count);
143
244k
    assert(parser->write_buf_total_size == total_size);
144
244k
#endif
145
244k
}
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.18k
{
187
3.18k
    return calloc(1, sizeof(struct usbredirparser_priv));
188
3.18k
}
189
190
static void usbredirparser_verify_caps(struct usbredirparser_priv *parser,
191
    uint32_t *caps, const char *desc)
192
3.25k
{
193
3.25k
    if (usbredirparser_caps_get_cap(parser, caps,
194
3.25k
                                    usb_redir_cap_bulk_streams) &&
195
1.35k
        !usbredirparser_caps_get_cap(parser, caps,
196
1.35k
                                     usb_redir_cap_ep_info_max_packet_size)) {
197
478
        ERROR("error %s caps contains cap_bulk_streams without "
198
478
              "cap_ep_info_max_packet_size", desc);
199
478
        caps[0] &= ~(1 << usb_redir_cap_bulk_streams);
200
478
    }
201
3.25k
}
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.18k
{
207
3.18k
    struct usbredirparser_priv *parser =
208
3.18k
        (struct usbredirparser_priv *)parser_pub;
209
3.18k
    struct usb_redir_hello_header hello = { { 0 }, };
210
211
3.18k
    parser->flags = (flags & ~usbredirparser_fl_no_hello);
212
3.18k
    if (parser->callb.alloc_lock_func) {
213
3.18k
        parser->lock = parser->callb.alloc_lock_func();
214
3.18k
    }
215
216
3.18k
    snprintf(hello.version, sizeof(hello.version), "%s", version);
217
3.18k
    if (caps_len > USB_REDIR_CAPS_SIZE) {
218
0
        caps_len = USB_REDIR_CAPS_SIZE;
219
0
    }
220
3.18k
    memcpy(parser->our_caps, caps, caps_len * sizeof(uint32_t));
221
    /* libusbredirparser handles sending the ack internally */
222
3.18k
    if (!(flags & usbredirparser_fl_usb_host))
223
1.82k
        usbredirparser_caps_set_cap(parser->our_caps,
224
1.82k
                                    usb_redir_cap_device_disconnect_ack);
225
3.18k
    usbredirparser_verify_caps(parser, parser->our_caps, "our");
226
3.18k
    if (!(flags & usbredirparser_fl_no_hello))
227
1.45k
        usbredirparser_queue(parser_pub, usb_redir_hello, 0, &hello,
228
1.45k
                             (uint8_t *)parser->our_caps,
229
1.45k
                             USB_REDIR_CAPS_SIZE * sizeof(uint32_t));
230
3.18k
}
231
232
USBREDIR_VISIBLE
233
void usbredirparser_destroy(struct usbredirparser *parser_pub)
234
3.18k
{
235
3.18k
    struct usbredirparser_priv *parser =
236
3.18k
        (struct usbredirparser_priv *)parser_pub;
237
3.18k
    struct usbredirparser_buf *wbuf, *next_wbuf;
238
239
3.18k
    free(parser->data);
240
3.18k
    parser->data = NULL;
241
242
3.18k
    wbuf = parser->write_buf;
243
8.89k
    while (wbuf) {
244
5.71k
        next_wbuf = wbuf->next;
245
5.71k
        free(wbuf->buf);
246
5.71k
        free(wbuf);
247
5.71k
        wbuf = next_wbuf;
248
5.71k
    }
249
250
3.18k
    if (parser->lock)
251
0
        parser->callb.free_lock_func(parser->lock);
252
253
3.18k
    free(parser);
254
3.18k
}
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.58M
{
272
1.58M
    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.58M
    if (caps[cap / 32] & (1 << (cap % 32))) {
277
1.38M
        return 1;
278
1.38M
    } else {
279
194k
        return 0;
280
194k
    }
281
1.58M
}
282
283
USBREDIR_VISIBLE
284
void usbredirparser_caps_set_cap(uint32_t *caps, int cap)
285
1.82k
{
286
1.82k
    caps[cap / 32] |= 1 << (cap % 32);
287
1.82k
}
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
857k
{
301
857k
    struct usbredirparser_priv *parser =
302
857k
        (struct usbredirparser_priv *)parser_pub;
303
857k
    return usbredirparser_caps_get_cap(parser, parser->peer_caps, cap);
304
857k
}
305
306
USBREDIR_VISIBLE
307
int usbredirparser_have_cap(struct usbredirparser *parser_pub, int cap)
308
722k
{
309
722k
    struct usbredirparser_priv *parser =
310
722k
        (struct usbredirparser_priv *)parser_pub;
311
722k
    return usbredirparser_caps_get_cap(parser, parser->our_caps, cap);
312
722k
}
313
314
static int usbredirparser_using_32bits_ids(struct usbredirparser *parser_pub)
315
707k
{
316
707k
    return !usbredirparser_have_cap(parser_pub, usb_redir_cap_64bits_ids) ||
317
577k
           !usbredirparser_peer_has_cap(parser_pub, usb_redir_cap_64bits_ids);
318
707k
}
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
933
{
323
933
    struct usbredirparser_priv *parser =
324
933
        (struct usbredirparser_priv *)parser_pub;
325
933
    uint32_t *peer_caps = (uint32_t *)data;
326
933
    char buf[64];
327
933
    int i;
328
329
933
    if (parser->have_peer_caps) {
330
856
        ERROR("Received second hello message, ignoring");
331
856
        return;
332
856
    }
333
334
    /* In case hello->version is not 0 terminated (which would be a protocol
335
       violation)_ */
336
77
    strncpy(buf, hello->version, sizeof(buf));
337
77
    buf[sizeof(buf)-1] = '\0';
338
339
77
    memset(parser->peer_caps, 0, sizeof(parser->peer_caps));
340
77
    if (data_len > sizeof(parser->peer_caps)) {
341
39
        data_len = sizeof(parser->peer_caps);
342
39
    }
343
137
    for (i = 0; i < data_len / sizeof(uint32_t); i++) {
344
60
        parser->peer_caps[i] = peer_caps[i];
345
60
    }
346
77
    usbredirparser_verify_caps(parser, parser->peer_caps, "peer");
347
77
    parser->have_peer_caps = 1;
348
349
77
    INFO("Peer version: %s, using %d-bits ids", buf,
350
77
         usbredirparser_using_32bits_ids(parser_pub) ? 32 : 64);
351
352
    /* Added in 0.3.2, so no guarantee it is there */
353
77
    if (parser->callb.hello_func)
354
77
        parser->callb.hello_func(parser->callb.priv, hello);
355
77
}
356
357
static int usbredirparser_get_header_len(struct usbredirparser *parser_pub)
358
414k
{
359
414k
    if (usbredirparser_using_32bits_ids(parser_pub))
360
153k
        return sizeof(struct usb_redir_header_32bit_id);
361
260k
    else
362
260k
        return sizeof(struct usb_redir_header);
363
414k
}
364
365
static int usbredirparser_get_type_header_len(
366
    struct usbredirparser *parser_pub, int32_t type, int send)
367
412k
{
368
412k
    struct usbredirparser_priv *parser =
369
412k
        (struct usbredirparser_priv *)parser_pub;
370
412k
    int command_for_host = 0;
371
372
412k
    if (parser->flags & usbredirparser_fl_usb_host) {
373
26.6k
        command_for_host = 1;
374
26.6k
    }
375
412k
    if (send) {
376
139k
        command_for_host = !command_for_host;
377
139k
    }
378
379
412k
    switch (type) {
380
91.9k
    case usb_redir_hello:
381
91.9k
        return sizeof(struct usb_redir_hello_header);
382
1.26k
    case usb_redir_device_connect:
383
1.26k
        if (!command_for_host) {
384
982
            if (usbredirparser_have_cap(parser_pub,
385
982
                                    usb_redir_cap_connect_device_version) &&
386
576
                usbredirparser_peer_has_cap(parser_pub,
387
576
                                    usb_redir_cap_connect_device_version)) {
388
321
                return sizeof(struct usb_redir_device_connect_header);
389
661
            } else {
390
661
                return sizeof(struct usb_redir_device_connect_header_no_device_version);
391
661
            }
392
982
        } else {
393
281
            return -1;
394
281
        }
395
138k
    case usb_redir_device_disconnect:
396
138k
        if (!command_for_host) {
397
138k
            return 0;
398
138k
        } else {
399
354
            return -1;
400
354
        }
401
666
    case usb_redir_reset:
402
666
        if (command_for_host) {
403
397
            return 0; /* No packet type specific header */
404
397
        } else {
405
269
            return -1;
406
269
        }
407
1.04k
    case usb_redir_interface_info:
408
1.04k
        if (!command_for_host) {
409
768
            return sizeof(struct usb_redir_interface_info_header);
410
768
        } else {
411
280
            return -1;
412
280
        }
413
1.54k
    case usb_redir_ep_info:
414
1.54k
        if (!command_for_host) {
415
1.14k
            if (usbredirparser_have_cap(parser_pub,
416
1.14k
                                    usb_redir_cap_bulk_streams) &&
417
513
                usbredirparser_peer_has_cap(parser_pub,
418
513
                                    usb_redir_cap_bulk_streams)) {
419
287
                return sizeof(struct usb_redir_ep_info_header);
420
861
            } else if (usbredirparser_have_cap(parser_pub,
421
861
                                    usb_redir_cap_ep_info_max_packet_size) &&
422
438
                       usbredirparser_peer_has_cap(parser_pub,
423
438
                                    usb_redir_cap_ep_info_max_packet_size)) {
424
205
                return sizeof(struct usb_redir_ep_info_header_no_max_streams);
425
656
            } else {
426
656
                return sizeof(struct usb_redir_ep_info_header_no_max_pktsz);
427
656
            }
428
1.14k
        } else {
429
396
            return -1;
430
396
        }
431
593
    case usb_redir_set_configuration:
432
593
        if (command_for_host) {
433
392
            return sizeof(struct usb_redir_set_configuration_header);
434
392
        } else {
435
201
            return -1; /* Should never be send to a guest */
436
201
        }
437
844
    case usb_redir_get_configuration:
438
844
        if (command_for_host) {
439
638
            return 0; /* No packet type specific header */
440
638
        } else {
441
206
            return -1;
442
206
        }
443
886
    case usb_redir_configuration_status:
444
886
        if (!command_for_host) {
445
476
            return sizeof(struct usb_redir_configuration_status_header);
446
476
        } else {
447
410
            return -1;
448
410
        }
449
593
    case usb_redir_set_alt_setting:
450
593
        if (command_for_host) {
451
389
            return sizeof(struct usb_redir_set_alt_setting_header);
452
389
        } else {
453
204
            return -1;
454
204
        }
455
1.58k
    case usb_redir_get_alt_setting:
456
1.58k
        if (command_for_host) {
457
879
            return sizeof(struct usb_redir_get_alt_setting_header);
458
879
        } else {
459
710
            return -1;
460
710
        }
461
598
    case usb_redir_alt_setting_status:
462
598
        if (!command_for_host) {
463
395
            return sizeof(struct usb_redir_alt_setting_status_header);
464
395
        } else {
465
203
            return -1;
466
203
        }
467
590
    case usb_redir_start_iso_stream:
468
590
        if (command_for_host) {
469
392
            return sizeof(struct usb_redir_start_iso_stream_header);
470
392
        } else {
471
198
            return -1;
472
198
        }
473
561
    case usb_redir_stop_iso_stream:
474
561
        if (command_for_host) {
475
365
            return sizeof(struct usb_redir_stop_iso_stream_header);
476
365
        } else {
477
196
            return -1;
478
196
        }
479
721
    case usb_redir_iso_stream_status:
480
721
        if (!command_for_host) {
481
522
            return sizeof(struct usb_redir_iso_stream_status_header);
482
522
        } else {
483
199
            return -1;
484
199
        }
485
1.26k
    case usb_redir_start_interrupt_receiving:
486
1.26k
        if (command_for_host) {
487
885
            return sizeof(struct usb_redir_start_interrupt_receiving_header);
488
885
        } else {
489
381
            return -1;
490
381
        }
491
1.87k
    case usb_redir_stop_interrupt_receiving:
492
1.87k
        if (command_for_host) {
493
1.29k
            return sizeof(struct usb_redir_stop_interrupt_receiving_header);
494
1.29k
        } else {
495
580
            return -1;
496
580
        }
497
973
    case usb_redir_interrupt_receiving_status:
498
973
        if (!command_for_host) {
499
749
            return sizeof(struct usb_redir_interrupt_receiving_status_header);
500
749
        } else {
501
224
            return -1;
502
224
        }
503
818
    case usb_redir_alloc_bulk_streams:
504
818
        if (command_for_host) {
505
559
            return sizeof(struct usb_redir_alloc_bulk_streams_header);
506
559
        } else {
507
259
            return -1;
508
259
        }
509
872
    case usb_redir_free_bulk_streams:
510
872
        if (command_for_host) {
511
554
            return sizeof(struct usb_redir_free_bulk_streams_header);
512
554
        } else {
513
318
            return -1;
514
318
        }
515
645
    case usb_redir_bulk_streams_status:
516
645
        if (!command_for_host) {
517
409
            return sizeof(struct usb_redir_bulk_streams_status_header);
518
409
        } else {
519
236
            return -1;
520
236
        }
521
516
    case usb_redir_cancel_data_packet:
522
516
        if (command_for_host) {
523
319
            return 0; /* No packet type specific header */
524
319
        } else {
525
197
            return -1;
526
197
        }
527
877
    case usb_redir_filter_reject:
528
877
        if (command_for_host) {
529
667
            return 0;
530
667
        } else {
531
210
            return -1;
532
210
        }
533
4.86k
    case usb_redir_filter_filter:
534
4.86k
        return 0;
535
139k
    case usb_redir_device_disconnect_ack:
536
139k
        if (command_for_host) {
537
139k
            return 0;
538
139k
        } else {
539
516
            return -1;
540
516
        }
541
1.28k
    case usb_redir_start_bulk_receiving:
542
1.28k
        if (command_for_host) {
543
1.08k
            return sizeof(struct usb_redir_start_bulk_receiving_header);
544
1.08k
        } else {
545
201
            return -1;
546
201
        }
547
1.06k
    case usb_redir_stop_bulk_receiving:
548
1.06k
        if (command_for_host) {
549
790
            return sizeof(struct usb_redir_stop_bulk_receiving_header);
550
790
        } else {
551
278
            return -1;
552
278
        }
553
1.48k
    case usb_redir_bulk_receiving_status:
554
1.48k
        if (!command_for_host) {
555
1.22k
            return sizeof(struct usb_redir_bulk_receiving_status_header);
556
1.22k
        } else {
557
261
            return -1;
558
261
        }
559
809
    case usb_redir_control_packet:
560
809
        return sizeof(struct usb_redir_control_packet_header);
561
1.70k
    case usb_redir_bulk_packet:
562
1.70k
        if (usbredirparser_have_cap(parser_pub,
563
1.70k
                                usb_redir_cap_32bits_bulk_length) &&
564
1.18k
            usbredirparser_peer_has_cap(parser_pub,
565
1.18k
                                usb_redir_cap_32bits_bulk_length)) {
566
622
            return sizeof(struct usb_redir_bulk_packet_header);
567
1.08k
        } else {
568
1.08k
            return sizeof(struct usb_redir_bulk_packet_header_16bit_length);
569
1.08k
        }
570
1.09k
    case usb_redir_iso_packet:
571
1.09k
        return sizeof(struct usb_redir_iso_packet_header);
572
1.86k
    case usb_redir_interrupt_packet:
573
1.86k
        return sizeof(struct usb_redir_interrupt_packet_header);
574
1.39k
    case usb_redir_buffered_bulk_packet:
575
1.39k
        if (!command_for_host) {
576
1.23k
            return sizeof(struct usb_redir_buffered_bulk_packet_header);
577
1.23k
        } else {
578
162
            return -1;
579
162
        }
580
7.80k
    default:
581
7.80k
        return -1;
582
412k
    }
583
412k
}
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
7.94k
{
590
7.94k
    switch (parser->header.type) {
591
999
    case usb_redir_hello: /* For the variable length capabilities array */
592
5.37k
    case usb_redir_filter_filter:
593
5.71k
    case usb_redir_control_packet:
594
5.98k
    case usb_redir_bulk_packet:
595
6.28k
    case usb_redir_iso_packet:
596
6.98k
    case usb_redir_interrupt_packet:
597
7.45k
    case usb_redir_buffered_bulk_packet:
598
7.45k
        return 1;
599
489
    default:
600
489
        return 0;
601
7.94k
    }
602
7.94k
}
603
604
static int usbredirparser_verify_bulk_recv_cap(
605
    struct usbredirparser *parser_pub, int send)
606
3.40k
{
607
3.40k
    struct usbredirparser_priv *parser =
608
3.40k
        (struct usbredirparser_priv *)parser_pub;
609
610
3.40k
    if ((send && !usbredirparser_peer_has_cap(parser_pub,
611
0
                                              usb_redir_cap_bulk_receiving)) ||
612
3.40k
        (!send && !usbredirparser_have_cap(parser_pub,
613
3.40k
                                           usb_redir_cap_bulk_receiving))) {
614
811
        ERROR("error bulk_receiving without cap_bulk_receiving");
615
811
        return 0;
616
811
    }
617
2.59k
    return 1; /* Verify ok */
618
3.40k
}
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
300k
{
624
300k
    struct usbredirparser_priv *parser =
625
300k
        (struct usbredirparser_priv *)parser_pub;
626
300k
    int command_for_host = 0, expect_extra_data = 0;
627
300k
    uint32_t length = 0;
628
300k
    int ep = -1;
629
630
300k
    if (parser->flags & usbredirparser_fl_usb_host) {
631
13.2k
        command_for_host = 1;
632
13.2k
    }
633
300k
    if (send) {
634
139k
        command_for_host = !command_for_host;
635
139k
    }
636
637
300k
    switch (type) {
638
435
    case usb_redir_interface_info: {
639
435
        struct usb_redir_interface_info_header *intf_info = header;
640
641
435
        if (intf_info->interface_count > 32) {
642
232
            ERROR("error interface_count > 32");
643
232
            return 0;
644
232
        }
645
203
        break;
646
435
    }
647
866
    case usb_redir_start_interrupt_receiving: {
648
866
        struct usb_redir_start_interrupt_receiving_header *start_int = header;
649
650
866
        if (!(start_int->endpoint & 0x80)) {
651
197
            ERROR("start int receiving on non input ep %02x",
652
197
                  start_int->endpoint);
653
197
            return 0;
654
197
        }
655
669
        break;
656
866
    }
657
1.27k
    case usb_redir_stop_interrupt_receiving: {
658
1.27k
        struct usb_redir_stop_interrupt_receiving_header *stop_int = header;
659
660
1.27k
        if (!(stop_int->endpoint & 0x80)) {
661
625
            ERROR("stop int receiving on non input ep %02x",
662
625
                  stop_int->endpoint);
663
625
            return 0;
664
625
        }
665
647
        break;
666
1.27k
    }
667
647
    case usb_redir_interrupt_receiving_status: {
668
543
        struct usb_redir_interrupt_receiving_status_header *int_status = header;
669
670
543
        if (!(int_status->endpoint & 0x80)) {
671
211
            ERROR("int receiving status for non input ep %02x",
672
211
                  int_status->endpoint);
673
211
            return 0;
674
211
        }
675
332
        break;
676
543
    }
677
654
    case usb_redir_filter_reject:
678
654
        if ((send && !usbredirparser_peer_has_cap(parser_pub,
679
0
                                             usb_redir_cap_filter)) ||
680
654
            (!send && !usbredirparser_have_cap(parser_pub,
681
654
                                             usb_redir_cap_filter))) {
682
422
            ERROR("error filter_reject without cap_filter");
683
422
            return 0;
684
422
        }
685
232
        break;
686
4.67k
    case usb_redir_filter_filter:
687
4.67k
        if ((send && !usbredirparser_peer_has_cap(parser_pub,
688
0
                                             usb_redir_cap_filter)) ||
689
4.67k
            (!send && !usbredirparser_have_cap(parser_pub,
690
4.67k
                                             usb_redir_cap_filter))) {
691
400
            ERROR("error filter_filter without cap_filter");
692
400
            return 0;
693
400
        }
694
4.27k
        if (data_len < 1) {
695
289
            ERROR("error filter_filter without data");
696
289
            return 0;
697
289
        }
698
3.98k
        if (data[data_len - 1] != 0) {
699
454
            ERROR("error non 0 terminated filter_filter data");
700
454
            return 0;
701
454
        }
702
3.52k
        break;
703
138k
    case usb_redir_device_disconnect_ack:
704
138k
        if ((send && !usbredirparser_peer_has_cap(parser_pub,
705
138k
                                     usb_redir_cap_device_disconnect_ack)) ||
706
138k
            (!send && !usbredirparser_have_cap(parser_pub,
707
704
                                     usb_redir_cap_device_disconnect_ack))) {
708
228
            ERROR("error device_disconnect_ack without cap_device_disconnect_ack");
709
228
            return 0;
710
228
        }
711
138k
        break;
712
138k
    case usb_redir_start_bulk_receiving: {
713
863
        struct usb_redir_start_bulk_receiving_header *start_bulk = header;
714
715
863
        if (!usbredirparser_verify_bulk_recv_cap(parser_pub, send)) {
716
228
            return 0;
717
228
        }
718
635
        if (start_bulk->bytes_per_transfer > MAX_BULK_TRANSFER_SIZE) {
719
208
            ERROR("start bulk receiving length exceeds limits %u > %u",
720
208
                  start_bulk->bytes_per_transfer, MAX_BULK_TRANSFER_SIZE);
721
208
            return 0;
722
208
        }
723
427
        if (!(start_bulk->endpoint & 0x80)) {
724
215
            ERROR("start bulk receiving on non input ep %02x",
725
215
                  start_bulk->endpoint);
726
215
            return 0;
727
215
        }
728
212
        break;
729
427
    }
730
592
    case usb_redir_stop_bulk_receiving: {
731
592
        struct usb_redir_stop_bulk_receiving_header *stop_bulk = header;
732
733
592
        if (!usbredirparser_verify_bulk_recv_cap(parser_pub, send)) {
734
194
            return 0;
735
194
        }
736
398
        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
201
        break;
742
398
    }
743
926
    case usb_redir_bulk_receiving_status: {
744
926
        struct usb_redir_bulk_receiving_status_header *bulk_status = header;
745
746
926
        if (!usbredirparser_verify_bulk_recv_cap(parser_pub, send)) {
747
194
            return 0;
748
194
        }
749
732
        if (!(bulk_status->endpoint & 0x80)) {
750
372
            ERROR("bulk receiving status for non input ep %02x",
751
372
                  bulk_status->endpoint);
752
372
            return 0;
753
372
        }
754
360
        break;
755
732
    }
756
599
    case usb_redir_control_packet:
757
599
        length = ((struct usb_redir_control_packet_header *)header)->length;
758
599
        ep = ((struct usb_redir_control_packet_header *)header)->endpoint;
759
599
        break;
760
1.10k
    case usb_redir_bulk_packet: {
761
1.10k
        struct usb_redir_bulk_packet_header *bulk_packet = header;
762
1.10k
        if (usbredirparser_have_cap(parser_pub,
763
1.10k
                                usb_redir_cap_32bits_bulk_length) &&
764
784
            usbredirparser_peer_has_cap(parser_pub,
765
784
                                usb_redir_cap_32bits_bulk_length)) {
766
432
            length = (((uint32_t)bulk_packet->length_high) << 16) | bulk_packet->length;
767
669
        } else {
768
669
            length = bulk_packet->length;
769
669
            if (!send)
770
669
                bulk_packet->length_high = 0;
771
669
        }
772
1.10k
        if (length > MAX_BULK_TRANSFER_SIZE) {
773
329
            ERROR("bulk transfer length exceeds limits %u > %u",
774
329
                  (uint32_t)length, MAX_BULK_TRANSFER_SIZE);
775
329
            return 0;
776
329
        }
777
772
        ep = bulk_packet->endpoint;
778
772
        break;
779
1.10k
    }
780
1.03k
    case usb_redir_iso_packet:
781
1.03k
        length = ((struct usb_redir_iso_packet_header *)header)->length;
782
1.03k
        ep = ((struct usb_redir_iso_packet_header *)header)->endpoint;
783
1.03k
        break;
784
1.62k
    case usb_redir_interrupt_packet:
785
1.62k
        length = ((struct usb_redir_interrupt_packet_header *)header)->length;
786
1.62k
        ep = ((struct usb_redir_interrupt_packet_header *)header)->endpoint;
787
1.62k
        break;
788
1.02k
    case usb_redir_buffered_bulk_packet: {
789
1.02k
        struct usb_redir_buffered_bulk_packet_header *buf_bulk_pkt = header;
790
1.02k
        length = buf_bulk_pkt->length;
791
1.02k
        if (!usbredirparser_verify_bulk_recv_cap(parser_pub, send)) {
792
195
            return 0;
793
195
        }
794
828
        if ((uint32_t)length > MAX_BULK_TRANSFER_SIZE) {
795
211
            ERROR("buffered bulk transfer length exceeds limits %u > %u",
796
211
                  (uint32_t)length, MAX_BULK_TRANSFER_SIZE);
797
211
            return 0;
798
211
        }
799
617
        ep = buf_bulk_pkt->endpoint;
800
617
        break;
801
828
    }
802
300k
    }
803
804
294k
    if (ep != -1) {
805
4.63k
        if (((ep & 0x80) && !command_for_host) ||
806
3.19k
            (!(ep & 0x80) && command_for_host)) {
807
2.51k
            expect_extra_data = 1;
808
2.51k
        }
809
4.63k
        if (expect_extra_data) {
810
2.51k
            if (data_len != length) {
811
756
                ERROR("error data len %d != header len %d ep %02X",
812
756
                      data_len, length, ep);
813
756
                return 0;
814
756
            }
815
2.51k
        } else {
816
2.12k
            if (data || data_len) {
817
555
                ERROR("error unexpected extra data ep %02X", ep);
818
555
                return 0;
819
555
            }
820
1.56k
            switch (type) {
821
200
            case usb_redir_iso_packet:
822
200
                ERROR("error iso packet send in wrong direction");
823
200
                return 0;
824
443
            case usb_redir_interrupt_packet:
825
443
                if (command_for_host) {
826
236
                    ERROR("error interrupt packet send in wrong direction");
827
236
                    return 0;
828
236
                }
829
207
                break;
830
207
            case usb_redir_buffered_bulk_packet:
831
207
                ERROR("error buffered bulk packet send in wrong direction");
832
207
                return 0;
833
1.56k
            }
834
1.56k
        }
835
4.63k
    }
836
837
292k
    return 1; /* Verify ok */
838
294k
}
839
840
static void usbredirparser_call_type_func(struct usbredirparser *parser_pub,
841
    bool *data_ownership_transferred)
842
153k
{
843
153k
    struct usbredirparser_priv *parser =
844
153k
        (struct usbredirparser_priv *)parser_pub;
845
153k
    uint64_t id;
846
847
153k
    if (usbredirparser_using_32bits_ids(parser_pub))
848
23.1k
        id = parser->header_32bit_id.id;
849
130k
    else
850
130k
        id = parser->header.id;
851
852
153k
    switch (parser->header.type) {
853
933
    case usb_redir_hello:
854
933
        usbredirparser_handle_hello(parser_pub,
855
933
            (struct usb_redir_hello_header *)parser->type_header,
856
933
            parser->data, parser->data_len);
857
933
        break;
858
194
    case usb_redir_device_connect:
859
194
        parser->callb.device_connect_func(parser->callb.priv,
860
194
            (struct usb_redir_device_connect_header *)parser->type_header);
861
194
        break;
862
138k
    case usb_redir_device_disconnect:
863
138k
        parser->callb.device_disconnect_func(parser->callb.priv);
864
138k
        if (usbredirparser_peer_has_cap(parser_pub,
865
138k
                                        usb_redir_cap_device_disconnect_ack))
866
138k
            usbredirparser_queue(parser_pub, usb_redir_device_disconnect_ack,
867
138k
                                 0, NULL, NULL, 0);
868
138k
        break;
869
378
    case usb_redir_reset:
870
378
        parser->callb.reset_func(parser->callb.priv);
871
378
        break;
872
203
    case usb_redir_interface_info:
873
203
        parser->callb.interface_info_func(parser->callb.priv,
874
203
            (struct usb_redir_interface_info_header *)parser->type_header);
875
203
        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
348
    case usb_redir_set_configuration:
881
348
        parser->callb.set_configuration_func(parser->callb.priv, id,
882
348
            (struct usb_redir_set_configuration_header *)parser->type_header);
883
348
        break;
884
454
    case usb_redir_get_configuration:
885
454
        parser->callb.get_configuration_func(parser->callb.priv, id);
886
454
        break;
887
243
    case usb_redir_configuration_status:
888
243
        parser->callb.configuration_status_func(parser->callb.priv, id,
889
243
          (struct usb_redir_configuration_status_header *)parser->type_header);
890
243
        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
646
    case usb_redir_get_alt_setting:
896
646
        parser->callb.get_alt_setting_func(parser->callb.priv, id,
897
646
            (struct usb_redir_get_alt_setting_header *)parser->type_header);
898
646
        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
194
    case usb_redir_start_iso_stream:
904
194
        parser->callb.start_iso_stream_func(parser->callb.priv, id,
905
194
            (struct usb_redir_start_iso_stream_header *)parser->type_header);
906
194
        break;
907
352
    case usb_redir_stop_iso_stream:
908
352
        parser->callb.stop_iso_stream_func(parser->callb.priv, id,
909
352
            (struct usb_redir_stop_iso_stream_header *)parser->type_header);
910
352
        break;
911
201
    case usb_redir_iso_stream_status:
912
201
        parser->callb.iso_stream_status_func(parser->callb.priv, id,
913
201
            (struct usb_redir_iso_stream_status_header *)parser->type_header);
914
201
        break;
915
669
    case usb_redir_start_interrupt_receiving:
916
669
        parser->callb.start_interrupt_receiving_func(parser->callb.priv, id,
917
669
            (struct usb_redir_start_interrupt_receiving_header *)
918
669
            parser->type_header);
919
669
        break;
920
647
    case usb_redir_stop_interrupt_receiving:
921
647
        parser->callb.stop_interrupt_receiving_func(parser->callb.priv, id,
922
647
            (struct usb_redir_stop_interrupt_receiving_header *)
923
647
            parser->type_header);
924
647
        break;
925
332
    case usb_redir_interrupt_receiving_status:
926
332
        parser->callb.interrupt_receiving_status_func(parser->callb.priv, id,
927
332
            (struct usb_redir_interrupt_receiving_status_header *)
928
332
            parser->type_header);
929
332
        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
194
    case usb_redir_free_bulk_streams:
935
194
        parser->callb.free_bulk_streams_func(parser->callb.priv, id,
936
194
            (struct usb_redir_free_bulk_streams_header *)parser->type_header);
937
194
        break;
938
198
    case usb_redir_bulk_streams_status:
939
198
        parser->callb.bulk_streams_status_func(parser->callb.priv, id,
940
198
          (struct usb_redir_bulk_streams_status_header *)parser->type_header);
941
198
        break;
942
310
    case usb_redir_cancel_data_packet:
943
310
        parser->callb.cancel_data_packet_func(parser->callb.priv, id);
944
310
        break;
945
232
    case usb_redir_filter_reject:
946
232
        parser->callb.filter_reject_func(parser->callb.priv);
947
232
        break;
948
3.52k
    case usb_redir_filter_filter: {
949
3.52k
        struct usbredirfilter_rule *rules;
950
3.52k
        int r, count;
951
952
3.52k
        r = usbredirfilter_string_to_rules((char *)parser->data, ",", "|",
953
3.52k
                                           &rules, &count);
954
3.52k
        if (r) {
955
2.91k
            ERROR("error parsing filter (%d), ignoring filter message", r);
956
2.91k
            break;
957
2.91k
        }
958
611
        parser->callb.filter_filter_func(parser->callb.priv, rules, count);
959
611
        break;
960
3.52k
    }
961
476
    case usb_redir_device_disconnect_ack:
962
476
        parser->callb.device_disconnect_ack_func(parser->callb.priv);
963
476
        break;
964
212
    case usb_redir_start_bulk_receiving:
965
212
        parser->callb.start_bulk_receiving_func(parser->callb.priv, id,
966
212
            (struct usb_redir_start_bulk_receiving_header *)
967
212
            parser->type_header);
968
212
        break;
969
201
    case usb_redir_stop_bulk_receiving:
970
201
        parser->callb.stop_bulk_receiving_func(parser->callb.priv, id,
971
201
            (struct usb_redir_stop_bulk_receiving_header *)
972
201
            parser->type_header);
973
201
        break;
974
360
    case usb_redir_bulk_receiving_status:
975
360
        parser->callb.bulk_receiving_status_func(parser->callb.priv, id,
976
360
            (struct usb_redir_bulk_receiving_status_header *)
977
360
            parser->type_header);
978
360
        break;
979
595
    case usb_redir_control_packet:
980
595
        *data_ownership_transferred = true;
981
595
        parser->callb.control_packet_func(parser->callb.priv, id,
982
595
            (struct usb_redir_control_packet_header *)parser->type_header,
983
595
            parser->data, parser->data_len);
984
595
        break;
985
497
    case usb_redir_bulk_packet:
986
497
        *data_ownership_transferred = true;
987
497
        parser->callb.bulk_packet_func(parser->callb.priv, id,
988
497
            (struct usb_redir_bulk_packet_header *)parser->type_header,
989
497
            parser->data, parser->data_len);
990
497
        break;
991
654
    case usb_redir_iso_packet:
992
654
        *data_ownership_transferred = true;
993
654
        parser->callb.iso_packet_func(parser->callb.priv, id,
994
654
            (struct usb_redir_iso_packet_header *)parser->type_header,
995
654
            parser->data, parser->data_len);
996
654
        break;
997
557
    case usb_redir_interrupt_packet:
998
557
        *data_ownership_transferred = true;
999
557
        parser->callb.interrupt_packet_func(parser->callb.priv, id,
1000
557
            (struct usb_redir_interrupt_packet_header *)parser->type_header,
1001
557
            parser->data, parser->data_len);
1002
557
        break;
1003
382
    case usb_redir_buffered_bulk_packet:
1004
382
        *data_ownership_transferred = true;
1005
382
        parser->callb.buffered_bulk_packet_func(parser->callb.priv, id,
1006
382
          (struct usb_redir_buffered_bulk_packet_header *)parser->type_header,
1007
382
          parser->data, parser->data_len);
1008
382
        break;
1009
153k
    }
1010
153k
}
1011
1012
USBREDIR_VISIBLE
1013
int usbredirparser_do_read(struct usbredirparser *parser_pub)
1014
120k
{
1015
120k
    struct usbredirparser_priv *parser =
1016
120k
        (struct usbredirparser_priv *)parser_pub;
1017
120k
    int r, header_len, type_header_len, data_len;
1018
120k
    bool data_ownership_transferred;
1019
120k
    uint8_t *dest;
1020
1021
120k
    header_len = usbredirparser_get_header_len(parser_pub);
1022
1023
120k
    usbredirparser_assert_invariants(parser);
1024
    /* Skip forward to next packet (only used in error conditions) */
1025
748k
    while (parser->to_skip > 0) {
1026
627k
        uint8_t buf[65536];
1027
627k
        r = (parser->to_skip > sizeof(buf)) ? sizeof(buf) : parser->to_skip;
1028
627k
        r = parser->callb.read_func(parser->callb.priv, buf, r);
1029
627k
        if (r <= 0) {
1030
145
            usbredirparser_assert_invariants(parser);
1031
145
            return r;
1032
145
        }
1033
627k
        parser->to_skip -= r;
1034
627k
    }
1035
1036
    /* Consume data until read would block or returns an error */
1037
1.59M
    while (1) {
1038
1.59M
        if (parser->header_read < header_len) {
1039
1.39M
            r = header_len - parser->header_read;
1040
1.39M
            dest = (uint8_t *)&parser->header + parser->header_read;
1041
1.39M
        } else if (parser->type_header_read < parser->type_header_len) {
1042
21.0k
            r = parser->type_header_len - parser->type_header_read;
1043
21.0k
            dest = parser->type_header + parser->type_header_read;
1044
173k
        } else {
1045
173k
            r = parser->data_len - parser->data_read;
1046
173k
            dest = parser->data + parser->data_read;
1047
173k
        }
1048
1049
1.59M
        if (r > 0) {
1050
1.43M
            r = parser->callb.read_func(parser->callb.priv, dest, r);
1051
1.43M
            if (r <= 0) {
1052
1.23k
                usbredirparser_assert_invariants(parser);
1053
1.23k
                return r;
1054
1.23k
            }
1055
1.43M
        }
1056
1057
1.59M
        if (parser->header_read < header_len) {
1058
1.39M
            parser->header_read += r;
1059
1.39M
            if (parser->header_read == header_len) {
1060
273k
                type_header_len =
1061
273k
                    usbredirparser_get_type_header_len(parser_pub,
1062
273k
                                                       parser->header.type, 0);
1063
273k
                if (type_header_len < 0) {
1064
15.7k
                    ERROR("error invalid usb-redir packet type: %u",
1065
15.7k
                          parser->header.type);
1066
15.7k
                    parser->to_skip = parser->header.length;
1067
15.7k
                    parser->header_read = 0;
1068
15.7k
                    usbredirparser_assert_invariants(parser);
1069
15.7k
                    return usbredirparser_read_parse_error;
1070
15.7k
                }
1071
                /* This should never happen */
1072
257k
                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
257k
                if (parser->header.length > MAX_PACKET_SIZE) {
1080
5.98k
                    ERROR("packet length of %d larger than permitted %d bytes",
1081
5.98k
                          parser->header.length, MAX_PACKET_SIZE);
1082
5.98k
                    parser->to_skip = parser->header.length;
1083
5.98k
                    parser->header_read = 0;
1084
5.98k
                    usbredirparser_assert_invariants(parser);
1085
5.98k
                    return usbredirparser_read_parse_error;
1086
5.98k
                }
1087
251k
                if ((int)parser->header.length < type_header_len ||
1088
161k
                    ((int)parser->header.length > type_header_len &&
1089
90.4k
                     !usbredirparser_expect_extra_data(parser))) {
1090
90.4k
                    ERROR("error invalid packet type %u length: %u",
1091
90.4k
                          parser->header.type, parser->header.length);
1092
90.4k
                    parser->to_skip = parser->header.length;
1093
90.4k
                    parser->header_read = 0;
1094
90.4k
                    usbredirparser_assert_invariants(parser);
1095
90.4k
                    return usbredirparser_read_parse_error;
1096
90.4k
                }
1097
161k
                data_len = parser->header.length - type_header_len;
1098
161k
                if (data_len) {
1099
7.39k
                    parser->data = malloc(data_len);
1100
7.39k
                    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.39k
                }
1108
161k
                parser->type_header_len = type_header_len;
1109
161k
                parser->data_len = data_len;
1110
161k
            }
1111
1.39M
        } else if (parser->type_header_read < parser->type_header_len) {
1112
20.8k
            parser->type_header_read += r;
1113
173k
        } else {
1114
173k
            parser->data_read += r;
1115
173k
            if (parser->data_read == parser->data_len) {
1116
160k
                r = usbredirparser_verify_type_header(parser_pub,
1117
160k
                         parser->header.type, parser->type_header,
1118
160k
                         parser->data, parser->data_len, 0);
1119
160k
                data_ownership_transferred = false;
1120
160k
                if (r) {
1121
153k
                    usbredirparser_call_type_func(parser_pub,
1122
153k
                                                  &data_ownership_transferred);
1123
153k
                }
1124
160k
                if (!data_ownership_transferred) {
1125
157k
                    free(parser->data);
1126
157k
                }
1127
160k
                parser->header_read = 0;
1128
160k
                parser->type_header_len  = 0;
1129
160k
                parser->type_header_read = 0;
1130
160k
                parser->data_len  = 0;
1131
160k
                parser->data_read = 0;
1132
160k
                parser->data = NULL;
1133
160k
                if (!r) {
1134
7.35k
                    usbredirparser_assert_invariants(parser);
1135
7.35k
                    return usbredirparser_read_parse_error;
1136
7.35k
                }
1137
                /* header len may change if this was an hello packet */
1138
153k
                header_len = usbredirparser_get_header_len(parser_pub);
1139
153k
            }
1140
173k
        }
1141
1.59M
    }
1142
120k
}
1143
1144
USBREDIR_VISIBLE
1145
int usbredirparser_has_data_to_write(struct usbredirparser *parser_pub)
1146
122k
{
1147
122k
    struct usbredirparser_priv *parser =
1148
122k
        (struct usbredirparser_priv *)parser_pub;
1149
122k
    return parser->write_buf_count;
1150
122k
}
1151
1152
USBREDIR_VISIBLE
1153
int usbredirparser_do_write(struct usbredirparser *parser_pub)
1154
1.22k
{
1155
1.22k
    struct usbredirparser_priv *parser =
1156
1.22k
        (struct usbredirparser_priv *)parser_pub;
1157
1.22k
    struct usbredirparser_buf* wbuf;
1158
1.22k
    int w, ret = 0;
1159
1160
1.22k
    LOCK(parser);
1161
1.22k
    assert((parser->write_buf_count != 0) ^ (parser->write_buf == NULL));
1162
1163
2.42M
    for (;;) {
1164
2.42M
        wbuf = parser->write_buf;
1165
2.42M
        if (!wbuf)
1166
1.22k
            break;
1167
1168
2.42M
        w = wbuf->len - wbuf->pos;
1169
2.42M
        w = parser->callb.write_func(parser->callb.priv,
1170
2.42M
                                     wbuf->buf + wbuf->pos, w);
1171
2.42M
        if (w <= 0) {
1172
0
            ret = w;
1173
0
            break;
1174
0
        }
1175
1176
        /* See usbredirparser_write documentation */
1177
2.42M
        if ((parser->flags & usbredirparser_fl_write_cb_owns_buffer) &&
1178
0
                w != wbuf->len)
1179
0
            abort();
1180
1181
2.42M
        wbuf->pos += w;
1182
2.42M
        if (wbuf->pos == wbuf->len) {
1183
134k
            parser->write_buf = wbuf->next;
1184
134k
            if (!(parser->flags & usbredirparser_fl_write_cb_owns_buffer))
1185
134k
                free(wbuf->buf);
1186
1187
134k
            parser->write_buf_total_size -= wbuf->len;
1188
134k
            parser->write_buf_count--;
1189
134k
            free(wbuf);
1190
134k
        }
1191
2.42M
    }
1192
1.22k
    UNLOCK(parser);
1193
1.22k
    return ret;
1194
1.22k
}
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.68k
{
1207
2.68k
    free(data);
1208
2.68k
}
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
139k
{
1214
139k
    struct usbredirparser_priv *parser =
1215
139k
        (struct usbredirparser_priv *)parser_pub;
1216
139k
    uint8_t *buf, *type_header_out, *data_out;
1217
139k
    struct usb_redir_header *header;
1218
139k
    struct usbredirparser_buf *wbuf, *new_wbuf;
1219
139k
    int header_len, type_header_len, total_size;
1220
1221
139k
    header_len = usbredirparser_get_header_len(parser_pub);
1222
139k
    type_header_len = usbredirparser_get_type_header_len(parser_pub, type, 1);
1223
139k
    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
139k
    if (!usbredirparser_verify_type_header(parser_pub, type, type_header_in,
1229
139k
                                           data_in, data_len, 1)) {
1230
0
        ERROR("error usbredirparser_send_* call invalid params, please report!!");
1231
0
        return;
1232
0
    }
1233
1234
139k
    total_size = header_len + type_header_len + data_len;
1235
139k
    new_wbuf = calloc(1, sizeof(*new_wbuf));
1236
139k
    buf = malloc(total_size);
1237
139k
    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
139k
    new_wbuf->buf = buf;
1244
139k
    new_wbuf->len = total_size;
1245
1246
139k
    header = (struct usb_redir_header *)buf;
1247
139k
    type_header_out = buf + header_len;
1248
139k
    data_out = type_header_out + type_header_len;
1249
1250
139k
    header->type   = type;
1251
139k
    header->length = type_header_len + data_len;
1252
139k
    if (usbredirparser_using_32bits_ids(parser_pub))
1253
9.50k
        ((struct usb_redir_header_32bit_id *)header)->id = id;
1254
130k
    else
1255
130k
        header->id = id;
1256
139k
    memcpy(type_header_out, type_header_in, type_header_len);
1257
139k
    memcpy(data_out, data_in, data_len);
1258
1259
139k
    LOCK(parser);
1260
139k
    if (!parser->write_buf) {
1261
2.28k
        parser->write_buf = new_wbuf;
1262
137k
    } else {
1263
        /* limiting the write_buf's stack depth is our users responsibility */
1264
137k
        wbuf = parser->write_buf;
1265
996M
        while (wbuf->next)
1266
995M
            wbuf = wbuf->next;
1267
1268
137k
        wbuf->next = new_wbuf;
1269
137k
    }
1270
139k
    parser->write_buf_total_size += total_size;
1271
139k
    parser->write_buf_count++;
1272
139k
    UNLOCK(parser);
1273
139k
}
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
74.3k
#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
438k
{
1588
438k
    uint8_t *old_state = *state;
1589
438k
    uint32_t used, size;
1590
1591
438k
    if (*remain >= needed)
1592
401k
        return 0;
1593
1594
37.1k
    used = *pos - *state;
1595
37.1k
    size = (used + needed + USBREDIRPARSER_SERIALIZE_BUF_SIZE - 1) &
1596
37.1k
           ~(USBREDIRPARSER_SERIALIZE_BUF_SIZE - 1);
1597
1598
37.1k
    *state = realloc(*state, size);
1599
37.1k
    if (!*state) {
1600
0
        free(old_state);
1601
0
        ERROR("Out of memory allocating serialization buffer");
1602
0
        return -1;
1603
0
    }
1604
1605
37.1k
    *pos = *state + used;
1606
37.1k
    *remain = size - used;
1607
1608
37.1k
    return 0;
1609
37.1k
}
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
178k
{
1615
178k
    DEBUG("serializing int %08x : %s", val, desc);
1616
1617
178k
    if (serialize_alloc(parser, state, pos, remain, sizeof(uint32_t)))
1618
0
        return -1;
1619
1620
178k
    memcpy(*pos, &val, sizeof(uint32_t));
1621
178k
    *pos += sizeof(uint32_t);
1622
178k
    *remain -= sizeof(uint32_t);
1623
1624
178k
    return 0;
1625
178k
}
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.94k
{
1631
2.94k
    if (*remain < sizeof(uint32_t)) {
1632
143
        ERROR("error buffer underrun while unserializing state");
1633
143
        return -1;
1634
143
    }
1635
2.80k
    memcpy(val, *pos, sizeof(uint32_t));
1636
2.80k
    *pos += sizeof(uint32_t);
1637
2.80k
    *remain -= sizeof(uint32_t);
1638
1639
2.80k
    DEBUG("unserialized int %08x : %s", *val, desc);
1640
1641
2.80k
    return 0;
1642
2.94k
}
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
260k
{
1648
260k
    DEBUG("serializing %d bytes of %s data", len, desc);
1649
260k
    if (len >= 8)
1650
104k
        DEBUG("First 8 bytes of %s: %02x %02x %02x %02x %02x %02x %02x %02x",
1651
260k
              desc, data[0], data[1], data[2], data[3],
1652
260k
                    data[4], data[5], data[6], data[7]);
1653
1654
260k
    if (serialize_alloc(parser, state, pos, remain, sizeof(uint32_t) + len))
1655
0
        return -1;
1656
1657
260k
    memcpy(*pos, &len, sizeof(uint32_t));
1658
260k
    *pos += sizeof(uint32_t);
1659
260k
    *remain -= sizeof(uint32_t);
1660
1661
260k
    memcpy(*pos, data, len);
1662
260k
    *pos += len;
1663
260k
    *remain -= len;
1664
1665
260k
    return 0;
1666
260k
}
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
4.31k
{
1675
4.31k
    uint32_t len;
1676
1677
4.31k
    if (*remain < sizeof(uint32_t)) {
1678
197
        ERROR("error buffer underrun while unserializing state");
1679
197
        return -1;
1680
197
    }
1681
4.11k
    memcpy(&len, *pos, sizeof(uint32_t));
1682
4.11k
    *pos += sizeof(uint32_t);
1683
4.11k
    *remain -= sizeof(uint32_t);
1684
1685
4.11k
    if (*remain < len) {
1686
73
        ERROR("error buffer underrun while unserializing state");
1687
73
        return -1;
1688
73
    }
1689
4.04k
    if (*data == NULL && len > 0) {
1690
1.25k
        *data = malloc(len);
1691
1.25k
        if (!*data) {
1692
0
            ERROR("Out of memory allocating unserialize buffer");
1693
0
            return -1;
1694
0
        }
1695
2.79k
    } else {
1696
2.79k
        if (*len_in_out < len) {
1697
5
            ERROR("error buffer overrun while unserializing state");
1698
5
            return -1;
1699
5
        }
1700
2.79k
    }
1701
1702
4.03k
    memcpy(*data, *pos, len);
1703
4.03k
    *pos += len;
1704
4.03k
    *remain -= len;
1705
4.03k
    *len_in_out = len;
1706
1707
4.03k
    DEBUG("unserialized %d bytes of %s data", len, desc);
1708
4.03k
    if (len >= 8)
1709
909
        DEBUG("First 8 bytes of %s: %02x %02x %02x %02x %02x %02x %02x %02x",
1710
4.03k
              desc, (*data)[0], (*data)[1], (*data)[2], (*data)[3],
1711
4.03k
              (*data)[4], (*data)[5], (*data)[6], (*data)[7]);
1712
1713
4.03k
    return 0;
1714
4.04k
}
1715
1716
USBREDIR_VISIBLE
1717
int usbredirparser_serialize(struct usbredirparser *parser_pub,
1718
                             uint8_t **state_dest, int *state_len)
1719
37.1k
{
1720
37.1k
    struct usbredirparser_priv *parser =
1721
37.1k
        (struct usbredirparser_priv *)parser_pub;
1722
37.1k
    struct usbredirparser_buf *wbuf;
1723
37.1k
    uint8_t *state = NULL, *pos = NULL;
1724
37.1k
    uint32_t write_buf_count = 0, len, remain = 0;
1725
37.1k
    ptrdiff_t write_buf_count_pos;
1726
1727
37.1k
    *state_dest = NULL;
1728
37.1k
    *state_len = 0;
1729
1730
37.1k
    if (serialize_int(parser, &state, &pos, &remain,
1731
37.1k
                                   USBREDIRPARSER_SERIALIZE_MAGIC, "magic"))
1732
0
        return -1;
1733
1734
    /* To be replaced with length later */
1735
37.1k
    if (serialize_int(parser, &state, &pos, &remain, 0, "length"))
1736
0
        return -1;
1737
1738
37.1k
    if (serialize_data(parser, &state, &pos, &remain,
1739
37.1k
                       (uint8_t *)parser->our_caps,
1740
37.1k
                       USB_REDIR_CAPS_SIZE * sizeof(int32_t), "our_caps"))
1741
0
        return -1;
1742
1743
37.1k
    if (parser->have_peer_caps) {
1744
7.08k
        if (serialize_data(parser, &state, &pos, &remain,
1745
7.08k
                           (uint8_t *)parser->peer_caps,
1746
7.08k
                           USB_REDIR_CAPS_SIZE * sizeof(int32_t), "peer_caps"))
1747
0
            return -1;
1748
30.0k
    } else {
1749
30.0k
        if (serialize_int(parser, &state, &pos, &remain, 0, "peer_caps_len"))
1750
0
            return -1;
1751
30.0k
    }
1752
1753
37.1k
    if (serialize_int(parser, &state, &pos, &remain, parser->to_skip, "skip"))
1754
0
        return -1;
1755
1756
37.1k
    if (serialize_data(parser, &state, &pos, &remain,
1757
37.1k
                       (uint8_t *)&parser->header, parser->header_read,
1758
37.1k
                       "header"))
1759
0
        return -1;
1760
1761
37.1k
    if (serialize_data(parser, &state, &pos, &remain,
1762
37.1k
                       parser->type_header, parser->type_header_read,
1763
37.1k
                       "type_header"))
1764
0
        return -1;
1765
1766
37.1k
    if (serialize_data(parser, &state, &pos, &remain,
1767
37.1k
                       parser->data, parser->data_read, "packet-data"))
1768
0
        return -1;
1769
1770
37.1k
    write_buf_count_pos = pos - state;
1771
    /* To be replaced with write_buf_count later */
1772
37.1k
    if (serialize_int(parser, &state, &pos, &remain, 0, "write_buf_count"))
1773
0
        return -1;
1774
1775
37.1k
    wbuf = parser->write_buf;
1776
141k
    while (wbuf) {
1777
104k
        if (serialize_data(parser, &state, &pos, &remain,
1778
104k
                           wbuf->buf + wbuf->pos, wbuf->len - wbuf->pos,
1779
104k
                           "write-buf"))
1780
0
            return -1;
1781
104k
        write_buf_count++;
1782
104k
        wbuf = wbuf->next;
1783
104k
    }
1784
    /* Patch in write_buf_count */
1785
37.1k
    memcpy(state + write_buf_count_pos, &write_buf_count, sizeof(int32_t));
1786
1787
    /* Patch in length */
1788
37.1k
    len = pos - state;
1789
37.1k
    memcpy(state + sizeof(int32_t), &len, sizeof(int32_t));
1790
1791
37.1k
    *state_dest = state;
1792
37.1k
    *state_len = len;
1793
1794
37.1k
    return 0;
1795
37.1k
}
1796
1797
USBREDIR_VISIBLE
1798
int usbredirparser_unserialize(struct usbredirparser *parser_pub,
1799
                               uint8_t *state, int len)
1800
957
{
1801
957
    struct usbredirparser_priv *parser =
1802
957
        (struct usbredirparser_priv *)parser_pub;
1803
957
    struct usbredirparser_buf *wbuf, **next;
1804
957
    uint32_t orig_caps[USB_REDIR_CAPS_SIZE];
1805
957
    uint8_t *data;
1806
957
    uint32_t i, l, header_len, remain = len;
1807
1808
957
    usbredirparser_assert_invariants(parser);
1809
957
    if (unserialize_int(parser, &state, &remain, &i, "magic")) {
1810
23
        usbredirparser_assert_invariants(parser);
1811
23
        return -1;
1812
23
    }
1813
934
    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
934
    if (!(parser->data == NULL && parser->header_read == 0 &&
1820
934
          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
934
    {
1827
        /* We need to reset parser's state to receive unserialized
1828
         * data. */
1829
934
        struct usbredirparser_buf *wbuf = parser->write_buf;
1830
1.46k
        while (wbuf) {
1831
529
            struct usbredirparser_buf *next_wbuf = wbuf->next;
1832
529
            free(wbuf->buf);
1833
529
            free(wbuf);
1834
529
            wbuf = next_wbuf;
1835
529
        }
1836
934
        parser->write_buf = NULL;
1837
934
        parser->write_buf_count = 0;
1838
934
        parser->write_buf_total_size = 0;
1839
934
    }
1840
1841
934
    if (unserialize_int(parser, &state, &remain, &i, "length")) {
1842
57
        usbredirparser_assert_invariants(parser);
1843
57
        return -1;
1844
57
    }
1845
877
    if (i != len) {
1846
118
        ERROR("error unserialize length mismatch");
1847
118
        usbredirparser_assert_invariants(parser);
1848
118
        return -1;
1849
118
    }
1850
1851
759
    data = (uint8_t *)parser->our_caps;
1852
759
    i = USB_REDIR_CAPS_SIZE * sizeof(int32_t);
1853
759
    memcpy(orig_caps, parser->our_caps, i);
1854
759
    if (unserialize_data(parser, &state, &remain, &data, &i, "our_caps")) {
1855
51
        usbredirparser_assert_invariants(parser);
1856
51
        return -1;
1857
51
    }
1858
1.33k
    for (i =0; i < USB_REDIR_CAPS_SIZE; i++) {
1859
708
        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
98
            if (parser->our_caps[i] & ~orig_caps[i]) {
1866
                /* Source has a cap we don't */
1867
78
                ERROR("error unserialize caps mismatch ours: %x recv: %x",
1868
78
                      orig_caps[i], parser->our_caps[i]);
1869
78
                usbredirparser_assert_invariants(parser);
1870
78
                return -1;
1871
78
            } else {
1872
                /* We've got a cap the source doesn't - that's OK */
1873
20
                WARNING("unserialize missing some caps; ours: %x recv: %x",
1874
20
                      orig_caps[i], parser->our_caps[i]);
1875
20
            }
1876
98
        }
1877
708
    }
1878
1879
630
    data = (uint8_t *)parser->peer_caps;
1880
630
    i = USB_REDIR_CAPS_SIZE * sizeof(int32_t);
1881
630
    if (unserialize_data(parser, &state, &remain, &data, &i, "peer_caps")) {
1882
13
        usbredirparser_assert_invariants(parser);
1883
13
        return -1;
1884
13
    }
1885
617
    if (i)
1886
262
        parser->have_peer_caps = 1;
1887
1888
617
    if (unserialize_int(parser, &state, &remain, &i, "skip")) {
1889
4
        usbredirparser_assert_invariants(parser);
1890
4
        return -1;
1891
4
    }
1892
613
    parser->to_skip = i;
1893
1894
613
    header_len = usbredirparser_get_header_len(parser_pub);
1895
613
    data = (uint8_t *)&parser->header;
1896
613
    i = header_len;
1897
613
    memset(&parser->header, 0, sizeof(parser->header));
1898
613
    if (unserialize_data(parser, &state, &remain, &data, &i, "header")) {
1899
3
        usbredirparser_assert_invariants(parser);
1900
3
        return -1;
1901
3
    }
1902
610
    if (parser->header.length > MAX_PACKET_SIZE) {
1903
13
        ERROR("packet length of %d larger than permitted %d bytes",
1904
13
              parser->header.length, MAX_PACKET_SIZE);
1905
13
        usbredirparser_assert_invariants(parser);
1906
13
        return -1;
1907
13
    }
1908
597
    parser->header_read = i;
1909
597
    parser->type_header_len = 0;
1910
1911
    /* Set various length field from the header (if any) */
1912
597
    if (parser->header_read == header_len) {
1913
92
        int type_header_len =
1914
92
            usbredirparser_get_type_header_len(parser_pub,
1915
92
                                               parser->header.type, 0);
1916
92
        if (type_header_len < 0 ||
1917
89
            type_header_len > sizeof(parser->type_header) ||
1918
89
            parser->header.length < type_header_len ||
1919
87
            (parser->header.length > type_header_len &&
1920
81
             !usbredirparser_expect_extra_data(parser))) {
1921
28
            ERROR("error unserialize packet header invalid");
1922
28
            usbredirparser_assert_invariants(parser);
1923
28
            return -1;
1924
28
        }
1925
64
        parser->type_header_len = type_header_len;
1926
64
    }
1927
1928
569
    data = parser->type_header;
1929
569
    i = parser->type_header_len;
1930
569
    if (unserialize_data(parser, &state, &remain, &data, &i, "type_header")) {
1931
80
        usbredirparser_assert_invariants(parser);
1932
80
        return -1;
1933
80
    }
1934
489
    if (parser->header_read == header_len) {
1935
36
        parser->type_header_read = i;
1936
36
    }
1937
1938
489
    if (parser->type_header_read == parser->type_header_len) {
1939
464
        parser->data_len = parser->header.length - parser->type_header_len;
1940
464
        if (parser->data_len) {
1941
183
            parser->data = malloc(parser->data_len);
1942
183
            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
183
        }
1948
464
    }
1949
489
    i = parser->data_len;
1950
489
    if (unserialize_data(parser, &state, &remain, &parser->data, &i, "data")) {
1951
54
        free(parser->data);
1952
54
        parser->data = NULL;
1953
54
        parser->data_len = 0;
1954
54
        usbredirparser_assert_invariants(parser);
1955
54
        return -1;
1956
54
    }
1957
435
    if (parser->header_read == header_len &&
1958
27
        parser->type_header_read == parser->type_header_len &&
1959
9
        parser->data_len > 0) {
1960
5
        parser->data_read = i;
1961
430
    } else if (parser->data != NULL) {
1962
222
        free(parser->data);
1963
222
        parser->data = NULL;
1964
222
        parser->data_len = 0;
1965
222
    }
1966
1967
    /* Get the write buffer count and the write buffers */
1968
435
    if (unserialize_int(parser, &state, &remain, &i, "write_buf_count")) {
1969
59
        usbredirparser_assert_invariants(parser);
1970
59
        return -1;
1971
59
    }
1972
376
    next = &parser->write_buf;
1973
376
    usbredirparser_assert_invariants(parser);
1974
1.53k
    while (i) {
1975
1.25k
        uint8_t *buf = NULL;
1976
1977
1.25k
        l = 0;
1978
1.25k
        if (unserialize_data(parser, &state, &remain, &buf, &l, "wbuf")) {
1979
74
            usbredirparser_assert_invariants(parser);
1980
74
            return -1;
1981
74
        }
1982
1983
1.17k
        if (l == 0) {
1984
17
            free(buf);
1985
17
            ERROR("write buffer %d is empty", i);
1986
17
            usbredirparser_assert_invariants(parser);
1987
17
            return -1;
1988
17
        }
1989
1990
1.16k
        wbuf = calloc(1, sizeof(*wbuf));
1991
1.16k
        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
1.16k
        wbuf->buf = buf;
1998
1.16k
        wbuf->len = l;
1999
1.16k
        *next = wbuf;
2000
1.16k
        next = &wbuf->next;
2001
1.16k
        parser->write_buf_total_size += wbuf->len;
2002
1.16k
        parser->write_buf_count++;
2003
1.16k
        i--;
2004
1.16k
    }
2005
2006
285
    if (remain) {
2007
7
        ERROR("error unserialize %d bytes of extraneous state data", remain);
2008
7
        usbredirparser_assert_invariants(parser);
2009
7
        return -1;
2010
7
    }
2011
2012
278
    usbredirparser_assert_invariants(parser);
2013
278
    return 0;
2014
285
}