Coverage Report

Created: 2025-11-24 06:28

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