Coverage Report

Created: 2026-02-26 07:12

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