Coverage Report

Created: 2025-11-11 06:15

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