Skip to content

Commit 671e399

Browse files
committed
pcap: Add appropriate endianness conversions for USB pcap header
The USB pcap header should always be little endian. As such, add the appropriate conversions where necessary to ensure that the data is interpreted correctly on big endian architectures.
1 parent 570b58e commit 671e399

File tree

1 file changed

+17
-17
lines changed

1 file changed

+17
-17
lines changed

src/umockdev-pcap.vala

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ internal class IoctlUsbPcapHandler : IoctlBase {
207207
usb_header_mmapped *urb_hdr = (void*) cur_buf;
208208

209209
cur_waiting_since = now;
210-
last_pkt_time_ms = urb_hdr.ts_sec * 1000 + urb_hdr.ts_usec / 1000;
210+
last_pkt_time_ms = from_little_endian(urb_hdr.ts_sec) * 1000 + from_little_endian(urb_hdr).ts_usec / 1000;
211211
start_time_ms = last_pkt_time_ms;
212212
}
213213

@@ -216,10 +216,10 @@ internal class IoctlUsbPcapHandler : IoctlBase {
216216

217217
usb_header_mmapped *urb_hdr = (void*) cur_buf;
218218

219-
uint64 cur_pkt_time_ms = urb_hdr.ts_sec * 1000 + urb_hdr.ts_usec / 1000;
219+
uint64 cur_pkt_time_ms = from_little_endian(urb_hdr.ts_sec) * 1000 + from_little_endian(urb_hdr).ts_usec / 1000;
220220

221221
/* Discard anything from a different bus/device */
222-
if (urb_hdr.bus_id != bus || urb_hdr.device_address != device)
222+
if (from_little_endian(urb_hdr.bus_id) != bus || urb_hdr.device_address != device)
223223
continue;
224224

225225
/* Print out debug info, if we need 5s longer than the recording
@@ -230,7 +230,7 @@ internal class IoctlUsbPcapHandler : IoctlBase {
230230
(ulong) (now - cur_waiting_since) / 1000,
231231
(ulong) (cur_pkt_time_ms - last_pkt_time_ms));
232232
message("Trying to reap at recording position %c %s packet, for endpoint 0x%02x with length %u, replay may be stuck (time: %.3f)",
233-
urb_hdr.event_type, urb_type_to_string(urb_hdr.transfer_type), urb_hdr.endpoint_number, urb_hdr.urb_len, (cur_pkt_time_ms - start_time_ms) / 1000.0);
233+
urb_hdr.event_type, urb_type_to_string(urb_hdr.transfer_type), urb_hdr.endpoint_number, from_little_endian(urb_hdr.urb_len), (cur_pkt_time_ms - start_time_ms) / 1000.0);
234234
message("The device has currently %u in-flight URBs:", urbs.length);
235235

236236
for (var i = 0; i < urbs.length; i++) {
@@ -277,7 +277,7 @@ internal class IoctlUsbPcapHandler : IoctlBase {
277277
*/
278278
if ((urb.type != urb_hdr.transfer_type) ||
279279
((urb.type != URB_CONTROL) && (urb.endpoint != urb_hdr.endpoint_number)) ||
280-
(urb_buffer_length != urb_hdr.urb_len)) {
280+
(urb_buffer_length != from_little_endian(urb_hdr.urb_len))) {
281281

282282
if (debug)
283283
stderr.printf("UMockdev: Queued URB %d has a metadata mismatch!\n", i);
@@ -290,10 +290,10 @@ internal class IoctlUsbPcapHandler : IoctlBase {
290290
continue;
291291
}
292292

293-
if (urb_hdr.data_len > 0) {
293+
if (from_little_endian(urb_hdr.data_len) > 0) {
294294
/* Data must have been captured. */
295295
assert(urb_hdr.data_flag == 0);
296-
assert(urb_hdr.data_len == urb_buffer_length);
296+
assert(from_little_endian(urb_hdr.data_len) == urb_buffer_length);
297297

298298
/* Compare the full buffer (as we are outgoing) */
299299
if (Posix.memcmp(urb_buffer, &cur_buf[sizeof(usb_header_mmapped)], urb_buffer_length) != 0) {
@@ -317,10 +317,10 @@ internal class IoctlUsbPcapHandler : IoctlBase {
317317
}
318318

319319
/* Everything matches, mark as submitted */
320-
urb_data.pcap_id = urb_hdr.id;
320+
urb_data.pcap_id = from_little_endian(urb_hdr.id);
321321

322322
/* Packet was handled. */
323-
last_pkt_time_ms = urb_hdr.ts_sec * 1000 + urb_hdr.ts_usec / 1000;
323+
last_pkt_time_ms = from_little_endian(urb_hdr.ts_sec) * 1000 + from_little_endian(urb_hdr).ts_usec / 1000;
324324
break;
325325
}
326326

@@ -337,7 +337,7 @@ internal class IoctlUsbPcapHandler : IoctlBase {
337337
for (int i = 0; i < urbs.length; i++) {
338338
urb_info = urbs.index(i);
339339

340-
if (urb_info.pcap_id == urb_hdr.id) {
340+
if (urb_info.pcap_id == from_little_endian(urb_hdr.id)) {
341341
urb = (Ioctl.usbdevfs_urb*) urb_info.urb_data.data;
342342
urbs.remove_index(i);
343343
break;
@@ -355,7 +355,7 @@ internal class IoctlUsbPcapHandler : IoctlBase {
355355
/* We can reap this urb!
356356
* Copy any data back if present.
357357
*/
358-
if (urb_hdr.data_len > 0) {
358+
if (from_little_endian(urb_hdr.data_len) > 0) {
359359
assert(urb_hdr.data_flag == 0);
360360

361361
uint8* urb_buffer = urb.buffer;
@@ -366,16 +366,16 @@ internal class IoctlUsbPcapHandler : IoctlBase {
366366
if (urb.type == URB_CONTROL)
367367
urb_buffer = &urb.buffer[8];
368368

369-
Posix.memcpy(urb_buffer, &cur_buf[sizeof(usb_header_mmapped)], urb_hdr.data_len);
369+
Posix.memcpy(urb_buffer, &cur_buf[sizeof(usb_header_mmapped)], from_little_endian(urb_hdr.data_len));
370370
}
371-
urb.status = (int) urb_hdr.status;
372-
urb.actual_length = (int) urb_hdr.urb_len;
371+
urb.status = (int) from_little_endian(urb_hdr.status);
372+
urb.actual_length = (int) from_little_endian(urb_hdr.urb_len);
373373

374374
/* Does this need further handling? */
375-
assert(urb_hdr.start_frame == 0);
376-
urb.start_frame = (int) urb_hdr.start_frame;
375+
assert(from_little_endian(urb_hdr.start_frame) == 0);
376+
urb.start_frame = (int) from_little_endian(urb_hdr.start_frame);
377377

378-
last_pkt_time_ms = urb_hdr.ts_sec * 1000 + urb_hdr.ts_usec / 1000;
378+
last_pkt_time_ms = from_little_endian(urb_hdr.ts_sec) * 1000 + from_little_endian(urb_hdr).ts_usec / 1000;
379379

380380
return urb_info;
381381
}

0 commit comments

Comments
 (0)