Coverage Report

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