Coverage Report

Created: 2025-07-23 07:29

/src/libpcap-1.9.1/sf-pcapng.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (c) 1993, 1994, 1995, 1996, 1997
3
 *  The Regents of the University of California.  All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that: (1) source code distributions
7
 * retain the above copyright notice and this paragraph in its entirety, (2)
8
 * distributions including binary code include the above copyright notice and
9
 * this paragraph in its entirety in the documentation or other materials
10
 * provided with the distribution, and (3) all advertising materials mentioning
11
 * features or use of this software display the following acknowledgement:
12
 * ``This product includes software developed by the University of California,
13
 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14
 * the University nor the names of its contributors may be used to endorse
15
 * or promote products derived from this software without specific prior
16
 * written permission.
17
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18
 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20
 *
21
 * sf-pcapng.c - pcapng-file-format-specific code from savefile.c
22
 */
23
24
#ifdef HAVE_CONFIG_H
25
#include <config.h>
26
#endif
27
28
#include <pcap/pcap-inttypes.h>
29
30
#include <errno.h>
31
#include <memory.h>
32
#include <stdio.h>
33
#include <stdlib.h>
34
#include <string.h>
35
36
#include "pcap-int.h"
37
38
#include "pcap-common.h"
39
40
#ifdef HAVE_OS_PROTO_H
41
#include "os-proto.h"
42
#endif
43
44
#include "sf-pcapng.h"
45
46
/*
47
 * Block types.
48
 */
49
50
/*
51
 * Common part at the beginning of all blocks.
52
 */
53
struct block_header {
54
  bpf_u_int32 block_type;
55
  bpf_u_int32 total_length;
56
};
57
58
/*
59
 * Common trailer at the end of all blocks.
60
 */
61
struct block_trailer {
62
  bpf_u_int32 total_length;
63
};
64
65
/*
66
 * Common options.
67
 */
68
769
#define OPT_ENDOFOPT  0  /* end of options */
69
#define OPT_COMMENT 1 /* comment string */
70
71
/*
72
 * Option header.
73
 */
74
struct option_header {
75
  u_short   option_code;
76
  u_short   option_length;
77
};
78
79
/*
80
 * Structures for the part of each block type following the common
81
 * part.
82
 */
83
84
/*
85
 * Section Header Block.
86
 */
87
8.17k
#define BT_SHB      0x0A0D0D0A
88
2.13k
#define BT_SHB_INSANE_MAX       1024U*1024U*1U  /* 1MB should be enough */
89
struct section_header_block {
90
  bpf_u_int32 byte_order_magic;
91
  u_short   major_version;
92
  u_short   minor_version;
93
  uint64_t  section_length;
94
  /* followed by options and trailer */
95
};
96
97
/*
98
 * Byte-order magic value.
99
 */
100
3.46k
#define BYTE_ORDER_MAGIC  0x1A2B3C4D
101
102
/*
103
 * Current version number.  If major_version isn't PCAP_NG_VERSION_MAJOR,
104
 * that means that this code can't read the file.
105
 */
106
4.07k
#define PCAP_NG_VERSION_MAJOR 1
107
1.82k
#define PCAP_NG_VERSION_MINOR 0
108
109
/*
110
 * Interface Description Block.
111
 */
112
91.1k
#define BT_IDB      0x00000001
113
114
struct interface_description_block {
115
  u_short   linktype;
116
  u_short   reserved;
117
  bpf_u_int32 snaplen;
118
  /* followed by options and trailer */
119
};
120
121
/*
122
 * Options in the IDB.
123
 */
124
#define IF_NAME   2 /* interface name string */
125
#define IF_DESCRIPTION  3 /* interface description string */
126
#define IF_IPV4ADDR 4 /* interface's IPv4 address and netmask */
127
#define IF_IPV6ADDR 5 /* interface's IPv6 address and prefix length */
128
#define IF_MACADDR  6 /* interface's MAC address */
129
#define IF_EUIADDR  7 /* interface's EUI address */
130
#define IF_SPEED  8 /* interface's speed, in bits/s */
131
1.37k
#define IF_TSRESOL  9  /* interface's time stamp resolution */
132
#define IF_TZONE  10  /* interface's time zone */
133
#define IF_FILTER 11  /* filter used when capturing on interface */
134
#define IF_OS   12  /* string OS on which capture on this interface was done */
135
#define IF_FCSLEN 13  /* FCS length for this interface */
136
388
#define IF_TSOFFSET 14  /* time stamp offset for this interface */
137
138
/*
139
 * Enhanced Packet Block.
140
 */
141
671
#define BT_EPB      0x00000006
142
143
struct enhanced_packet_block {
144
  bpf_u_int32 interface_id;
145
  bpf_u_int32 timestamp_high;
146
  bpf_u_int32 timestamp_low;
147
  bpf_u_int32 caplen;
148
  bpf_u_int32 len;
149
  /* followed by packet data, options, and trailer */
150
};
151
152
/*
153
 * Simple Packet Block.
154
 */
155
2.95k
#define BT_SPB      0x00000003
156
157
struct simple_packet_block {
158
  bpf_u_int32 len;
159
  /* followed by packet data and trailer */
160
};
161
162
/*
163
 * Packet Block.
164
 */
165
548
#define BT_PB     0x00000002
166
167
struct packet_block {
168
  u_short   interface_id;
169
  u_short   drops_count;
170
  bpf_u_int32 timestamp_high;
171
  bpf_u_int32 timestamp_low;
172
  bpf_u_int32 caplen;
173
  bpf_u_int32 len;
174
  /* followed by packet data, options, and trailer */
175
};
176
177
/*
178
 * Block cursor - used when processing the contents of a block.
179
 * Contains a pointer into the data being processed and a count
180
 * of bytes remaining in the block.
181
 */
182
struct block_cursor {
183
  u_char    *data;
184
  size_t    data_remaining;
185
  bpf_u_int32 block_type;
186
};
187
188
typedef enum {
189
  PASS_THROUGH,
190
  SCALE_UP_DEC,
191
  SCALE_DOWN_DEC,
192
  SCALE_UP_BIN,
193
  SCALE_DOWN_BIN
194
} tstamp_scale_type_t;
195
196
/*
197
 * Per-interface information.
198
 */
199
struct pcap_ng_if {
200
  uint64_t tsresol;   /* time stamp resolution */
201
  tstamp_scale_type_t scale_type; /* how to scale */
202
  uint64_t scale_factor;    /* time stamp scale factor for power-of-10 tsresol */
203
  uint64_t tsoffset;    /* time stamp offset */
204
};
205
206
/*
207
 * Per-pcap_t private data.
208
 *
209
 * max_blocksize is the maximum size of a block that we'll accept.  We
210
 * reject blocks bigger than this, so we don't consume too much memory
211
 * with a truly huge block.  It can change as we see IDBs with different
212
 * link-layer header types.  (Currently, we don't support IDBs with
213
 * different link-layer header types, but we will support it in the
214
 * future, when we offer file-reading APIs that support it.)
215
 *
216
 * XXX - that's an issue on ILP32 platforms, where the maximum block
217
 * size of 2^31-1 would eat all but one byte of the entire address space.
218
 * It's less of an issue on ILP64/LLP64 platforms, but the actual size
219
 * of the address space may be limited by 1) the number of *significant*
220
 * address bits (currently, x86-64 only supports 48 bits of address), 2)
221
 * any limitations imposed by the operating system; 3) any limitations
222
 * imposed by the amount of available backing store for anonymous pages,
223
 * so we impose a limit regardless of the size of a pointer.
224
 */
225
struct pcap_ng_sf {
226
  uint64_t user_tsresol;    /* time stamp resolution requested by the user */
227
  u_int max_blocksize;    /* don't grow buffer size past this */
228
  bpf_u_int32 ifcount;    /* number of interfaces seen in this capture */
229
  bpf_u_int32 ifaces_size;  /* size of array below */
230
  struct pcap_ng_if *ifaces;  /* array of interface information */
231
};
232
233
/*
234
 * The maximum block size we start with; we use an arbitrary value of
235
 * 16 MiB.
236
 */
237
1.93k
#define INITIAL_MAX_BLOCKSIZE (16*1024*1024)
238
239
/*
240
 * Maximum block size for a given maximum snapshot length; we define it
241
 * as the size of an EPB with a max_snaplen-sized packet and 128KB of
242
 * options.
243
 */
244
#define MAX_BLOCKSIZE_FOR_SNAPLEN(max_snaplen) \
245
1.34k
  (sizeof (struct block_header) + \
246
1.34k
   sizeof (struct enhanced_packet_block) + \
247
1.34k
   (max_snaplen) + 131072 + \
248
1.34k
   sizeof (struct block_trailer))
249
250
static void pcap_ng_cleanup(pcap_t *p);
251
static int pcap_ng_next_packet(pcap_t *p, struct pcap_pkthdr *hdr,
252
    u_char **data);
253
254
static int
255
read_bytes(FILE *fp, void *buf, size_t bytes_to_read, int fail_on_eof,
256
    char *errbuf)
257
199k
{
258
199k
  size_t amt_read;
259
260
199k
  amt_read = fread(buf, 1, bytes_to_read, fp);
261
199k
  if (amt_read != bytes_to_read) {
262
841
    if (ferror(fp)) {
263
0
      pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
264
0
          errno, "error reading dump file");
265
841
    } else {
266
841
      if (amt_read == 0 && !fail_on_eof)
267
469
        return (0);  /* EOF */
268
372
      pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
269
372
          "truncated pcapng dump file; tried to read %" PRIsize " bytes, only got %" PRIsize,
270
372
          bytes_to_read, amt_read);
271
372
    }
272
372
    return (-1);
273
841
  }
274
198k
  return (1);
275
199k
}
276
277
static int
278
read_block(FILE *fp, pcap_t *p, struct block_cursor *cursor, char *errbuf)
279
99.2k
{
280
99.2k
  struct pcap_ng_sf *ps;
281
99.2k
  int status;
282
99.2k
  struct block_header bhdr;
283
99.2k
  struct block_trailer *btrlr;
284
99.2k
  u_char *bdata;
285
99.2k
  size_t data_remaining;
286
287
99.2k
  ps = p->priv;
288
289
99.2k
  status = read_bytes(fp, &bhdr, sizeof(bhdr), 0, errbuf);
290
99.2k
  if (status <= 0)
291
620
    return (status);  /* error or EOF */
292
293
98.6k
  if (p->swapped) {
294
3.58k
    bhdr.block_type = SWAPLONG(bhdr.block_type);
295
3.58k
    bhdr.total_length = SWAPLONG(bhdr.total_length);
296
3.58k
  }
297
298
  /*
299
   * Is this block "too small" - i.e., is it shorter than a block
300
   * header plus a block trailer?
301
   */
302
98.6k
  if (bhdr.total_length < sizeof(struct block_header) +
303
98.6k
      sizeof(struct block_trailer)) {
304
16
    pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
305
16
        "block in pcapng dump file has a length of %u < %" PRIsize,
306
16
        bhdr.total_length,
307
16
        sizeof(struct block_header) + sizeof(struct block_trailer));
308
16
    return (-1);
309
16
  }
310
311
  /*
312
   * Is the block total length a multiple of 4?
313
   */
314
98.6k
  if ((bhdr.total_length % 4) != 0) {
315
    /*
316
     * No.  Report that as an error.
317
     */
318
38
    pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
319
38
        "block in pcapng dump file has a length of %u that is not a multiple of 4" PRIsize,
320
38
        bhdr.total_length);
321
38
    return (-1);
322
38
  }
323
324
  /*
325
   * Is the buffer big enough?
326
   */
327
98.5k
  if (p->bufsize < bhdr.total_length) {
328
    /*
329
     * No - make it big enough, unless it's too big, in
330
     * which case we fail.
331
     */
332
620
    void *bigger_buffer;
333
334
620
    if (bhdr.total_length > ps->max_blocksize) {
335
148
      pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "pcapng block size %u > maximum %u", bhdr.total_length,
336
148
          ps->max_blocksize);
337
148
      return (-1);
338
148
    }
339
472
    bigger_buffer = realloc(p->buffer, bhdr.total_length);
340
472
    if (bigger_buffer == NULL) {
341
0
      pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "out of memory");
342
0
      return (-1);
343
0
    }
344
472
    p->buffer = bigger_buffer;
345
472
  }
346
347
  /*
348
   * Copy the stuff we've read to the buffer, and read the rest
349
   * of the block.
350
   */
351
98.4k
  memcpy(p->buffer, &bhdr, sizeof(bhdr));
352
98.4k
  bdata = (u_char *)p->buffer + sizeof(bhdr);
353
98.4k
  data_remaining = bhdr.total_length - sizeof(bhdr);
354
98.4k
  if (read_bytes(fp, bdata, data_remaining, 1, errbuf) == -1)
355
121
    return (-1);
356
357
  /*
358
   * Get the block size from the trailer.
359
   */
360
98.3k
  btrlr = (struct block_trailer *)(bdata + data_remaining - sizeof (struct block_trailer));
361
98.3k
  if (p->swapped)
362
3.47k
    btrlr->total_length = SWAPLONG(btrlr->total_length);
363
364
  /*
365
   * Is the total length from the trailer the same as the total
366
   * length from the header?
367
   */
368
98.3k
  if (bhdr.total_length != btrlr->total_length) {
369
    /*
370
     * No.
371
     */
372
118
    pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
373
118
        "block total length in header and trailer don't match");
374
118
    return (-1);
375
118
  }
376
377
  /*
378
   * Initialize the cursor.
379
   */
380
98.2k
  cursor->data = bdata;
381
98.2k
  cursor->data_remaining = data_remaining - sizeof(struct block_trailer);
382
98.2k
  cursor->block_type = bhdr.block_type;
383
98.2k
  return (1);
384
98.3k
}
385
386
static void *
387
get_from_block_data(struct block_cursor *cursor, size_t chunk_size,
388
    char *errbuf)
389
361k
{
390
361k
  void *data;
391
392
  /*
393
   * Make sure we have the specified amount of data remaining in
394
   * the block data.
395
   */
396
361k
  if (cursor->data_remaining < chunk_size) {
397
152
    pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
398
152
        "block of type %u in pcapng dump file is too short",
399
152
        cursor->block_type);
400
152
    return (NULL);
401
152
  }
402
403
  /*
404
   * Return the current pointer, and skip past the chunk.
405
   */
406
361k
  data = cursor->data;
407
361k
  cursor->data += chunk_size;
408
361k
  cursor->data_remaining -= chunk_size;
409
361k
  return (data);
410
361k
}
411
412
static struct option_header *
413
get_opthdr_from_block_data(pcap_t *p, struct block_cursor *cursor, char *errbuf)
414
131k
{
415
131k
  struct option_header *opthdr;
416
417
131k
  opthdr = get_from_block_data(cursor, sizeof(*opthdr), errbuf);
418
131k
  if (opthdr == NULL) {
419
    /*
420
     * Option header is cut short.
421
     */
422
0
    return (NULL);
423
0
  }
424
425
  /*
426
   * Byte-swap it if necessary.
427
   */
428
131k
  if (p->swapped) {
429
1.44k
    opthdr->option_code = SWAPSHORT(opthdr->option_code);
430
1.44k
    opthdr->option_length = SWAPSHORT(opthdr->option_length);
431
1.44k
  }
432
433
131k
  return (opthdr);
434
131k
}
435
436
static void *
437
get_optvalue_from_block_data(struct block_cursor *cursor,
438
    struct option_header *opthdr, char *errbuf)
439
131k
{
440
131k
  size_t padded_option_len;
441
131k
  void *optvalue;
442
443
  /* Pad option length to 4-byte boundary */
444
131k
  padded_option_len = opthdr->option_length;
445
131k
  padded_option_len = ((padded_option_len + 3)/4)*4;
446
447
131k
  optvalue = get_from_block_data(cursor, padded_option_len, errbuf);
448
131k
  if (optvalue == NULL) {
449
    /*
450
     * Option value is cut short.
451
     */
452
40
    return (NULL);
453
40
  }
454
455
130k
  return (optvalue);
456
131k
}
457
458
static int
459
process_idb_options(pcap_t *p, struct block_cursor *cursor, uint64_t *tsresol,
460
    uint64_t *tsoffset, int *is_binary, char *errbuf)
461
91.0k
{
462
91.0k
  struct option_header *opthdr;
463
91.0k
  void *optvalue;
464
91.0k
  int saw_tsresol, saw_tsoffset;
465
91.0k
  uint8_t tsresol_opt;
466
91.0k
  u_int i;
467
468
91.0k
  saw_tsresol = 0;
469
91.0k
  saw_tsoffset = 0;
470
221k
  while (cursor->data_remaining != 0) {
471
    /*
472
     * Get the option header.
473
     */
474
131k
    opthdr = get_opthdr_from_block_data(p, cursor, errbuf);
475
131k
    if (opthdr == NULL) {
476
      /*
477
       * Option header is cut short.
478
       */
479
0
      return (-1);
480
0
    }
481
482
    /*
483
     * Get option value.
484
     */
485
131k
    optvalue = get_optvalue_from_block_data(cursor, opthdr,
486
131k
        errbuf);
487
131k
    if (optvalue == NULL) {
488
      /*
489
       * Option value is cut short.
490
       */
491
40
      return (-1);
492
40
    }
493
494
130k
    switch (opthdr->option_code) {
495
496
769
    case OPT_ENDOFOPT:
497
769
      if (opthdr->option_length != 0) {
498
22
        pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
499
22
            "Interface Description Block has opt_endofopt option with length %u != 0",
500
22
            opthdr->option_length);
501
22
        return (-1);
502
22
      }
503
747
      goto done;
504
505
1.37k
    case IF_TSRESOL:
506
1.37k
      if (opthdr->option_length != 1) {
507
3
        pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
508
3
            "Interface Description Block has if_tsresol option with length %u != 1",
509
3
            opthdr->option_length);
510
3
        return (-1);
511
3
      }
512
1.37k
      if (saw_tsresol) {
513
2
        pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
514
2
            "Interface Description Block has more than one if_tsresol option");
515
2
        return (-1);
516
2
      }
517
1.37k
      saw_tsresol = 1;
518
1.37k
      memcpy(&tsresol_opt, optvalue, sizeof(tsresol_opt));
519
1.37k
      if (tsresol_opt & 0x80) {
520
        /*
521
         * Resolution is negative power of 2.
522
         */
523
773
        uint8_t tsresol_shift = (tsresol_opt & 0x7F);
524
525
773
        if (tsresol_shift > 63) {
526
          /*
527
           * Resolution is too high; 2^-{res}
528
           * won't fit in a 64-bit value.
529
           */
530
9
          pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
531
9
              "Interface Description Block if_tsresol option resolution 2^-%u is too high",
532
9
              tsresol_shift);
533
9
          return (-1);
534
9
        }
535
764
        *is_binary = 1;
536
764
        *tsresol = ((uint64_t)1) << tsresol_shift;
537
764
      } else {
538
        /*
539
         * Resolution is negative power of 10.
540
         */
541
601
        if (tsresol_opt > 19) {
542
          /*
543
           * Resolution is too high; 2^-{res}
544
           * won't fit in a 64-bit value (the
545
           * largest power of 10 that fits
546
           * in a 64-bit value is 10^19, as
547
           * the largest 64-bit unsigned
548
           * value is ~1.8*10^19).
549
           */
550
2
          pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
551
2
              "Interface Description Block if_tsresol option resolution 10^-%u is too high",
552
2
              tsresol_opt);
553
2
          return (-1);
554
2
        }
555
599
        *is_binary = 0;
556
599
        *tsresol = 1;
557
4.10k
        for (i = 0; i < tsresol_opt; i++)
558
3.50k
          *tsresol *= 10;
559
599
      }
560
1.36k
      break;
561
562
1.36k
    case IF_TSOFFSET:
563
388
      if (opthdr->option_length != 8) {
564
6
        pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
565
6
            "Interface Description Block has if_tsoffset option with length %u != 8",
566
6
            opthdr->option_length);
567
6
        return (-1);
568
6
      }
569
382
      if (saw_tsoffset) {
570
2
        pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
571
2
            "Interface Description Block has more than one if_tsoffset option");
572
2
        return (-1);
573
2
      }
574
380
      saw_tsoffset = 1;
575
380
      memcpy(tsoffset, optvalue, sizeof(*tsoffset));
576
380
      if (p->swapped)
577
231
        *tsoffset = SWAPLL(*tsoffset);
578
380
      break;
579
580
128k
    default:
581
128k
      break;
582
130k
    }
583
130k
  }
584
585
90.9k
done:
586
90.9k
  return (0);
587
91.0k
}
588
589
static int
590
add_interface(pcap_t *p, struct block_cursor *cursor, char *errbuf)
591
91.0k
{
592
91.0k
  struct pcap_ng_sf *ps;
593
91.0k
  uint64_t tsresol;
594
91.0k
  uint64_t tsoffset;
595
91.0k
  int is_binary;
596
597
91.0k
  ps = p->priv;
598
599
  /*
600
   * Count this interface.
601
   */
602
91.0k
  ps->ifcount++;
603
604
  /*
605
   * Grow the array of per-interface information as necessary.
606
   */
607
91.0k
  if (ps->ifcount > ps->ifaces_size) {
608
    /*
609
     * We need to grow the array.
610
     */
611
2.18k
    bpf_u_int32 new_ifaces_size;
612
2.18k
    struct pcap_ng_if *new_ifaces;
613
614
2.18k
    if (ps->ifaces_size == 0) {
615
      /*
616
       * It's currently empty.
617
       *
618
       * (The Clang static analyzer doesn't do enough,
619
       * err, umm, dataflow *analysis* to realize that
620
       * ps->ifaces_size == 0 if ps->ifaces == NULL,
621
       * and so complains about a possible zero argument
622
       * to realloc(), so we check for the former
623
       * condition to shut it up.
624
       *
625
       * However, it doesn't complain that one of the
626
       * multiplications below could overflow, which is
627
       * a real, albeit extremely unlikely, problem (you'd
628
       * need a pcapng file with tens of millions of
629
       * interfaces).)
630
       */
631
1.40k
      new_ifaces_size = 1;
632
1.40k
      new_ifaces = malloc(sizeof (struct pcap_ng_if));
633
1.40k
    } else {
634
      /*
635
       * It's not currently empty; double its size.
636
       * (Perhaps overkill once we have a lot of interfaces.)
637
       *
638
       * Check for overflow if we double it.
639
       */
640
777
      if (ps->ifaces_size * 2 < ps->ifaces_size) {
641
        /*
642
         * The maximum number of interfaces before
643
         * ps->ifaces_size overflows is the largest
644
         * possible 32-bit power of 2, as we do
645
         * size doubling.
646
         */
647
0
        pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
648
0
            "more than %u interfaces in the file",
649
0
            0x80000000U);
650
0
        return (0);
651
0
      }
652
653
      /*
654
       * ps->ifaces_size * 2 doesn't overflow, so it's
655
       * safe to multiply.
656
       */
657
777
      new_ifaces_size = ps->ifaces_size * 2;
658
659
      /*
660
       * Now make sure that's not so big that it overflows
661
       * if we multiply by sizeof (struct pcap_ng_if).
662
       *
663
       * That can happen on 32-bit platforms, with a 32-bit
664
       * size_t; it shouldn't happen on 64-bit platforms,
665
       * with a 64-bit size_t, as new_ifaces_size is
666
       * 32 bits.
667
       */
668
777
      if (new_ifaces_size * sizeof (struct pcap_ng_if) < new_ifaces_size) {
669
        /*
670
         * As this fails only with 32-bit size_t,
671
         * the multiplication was 32x32->32, and
672
         * the largest 32-bit value that can safely
673
         * be multiplied by sizeof (struct pcap_ng_if)
674
         * without overflow is the largest 32-bit
675
         * (unsigned) value divided by
676
         * sizeof (struct pcap_ng_if).
677
         */
678
0
        pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
679
0
            "more than %u interfaces in the file",
680
0
            0xFFFFFFFFU / ((u_int)sizeof (struct pcap_ng_if)));
681
0
        return (0);
682
0
      }
683
777
      new_ifaces = realloc(ps->ifaces, new_ifaces_size * sizeof (struct pcap_ng_if));
684
777
    }
685
2.18k
    if (new_ifaces == NULL) {
686
      /*
687
       * We ran out of memory.
688
       * Give up.
689
       */
690
0
      pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
691
0
          "out of memory for per-interface information (%u interfaces)",
692
0
          ps->ifcount);
693
0
      return (0);
694
0
    }
695
2.18k
    ps->ifaces_size = new_ifaces_size;
696
2.18k
    ps->ifaces = new_ifaces;
697
2.18k
  }
698
699
  /*
700
   * Set the default time stamp resolution and offset.
701
   */
702
91.0k
  tsresol = 1000000;  /* microsecond resolution */
703
91.0k
  is_binary = 0;    /* which is a power of 10 */
704
91.0k
  tsoffset = 0;   /* absolute timestamps */
705
706
  /*
707
   * Now look for various time stamp options, so we know
708
   * how to interpret the time stamps for this interface.
709
   */
710
91.0k
  if (process_idb_options(p, cursor, &tsresol, &tsoffset, &is_binary,
711
91.0k
      errbuf) == -1)
712
86
    return (0);
713
714
90.9k
  ps->ifaces[ps->ifcount - 1].tsresol = tsresol;
715
90.9k
  ps->ifaces[ps->ifcount - 1].tsoffset = tsoffset;
716
717
  /*
718
   * Determine whether we're scaling up or down or not
719
   * at all for this interface.
720
   */
721
90.9k
  if (tsresol == ps->user_tsresol) {
722
    /*
723
     * The resolution is the resolution the user wants,
724
     * so we don't have to do scaling.
725
     */
726
89.5k
    ps->ifaces[ps->ifcount - 1].scale_type = PASS_THROUGH;
727
89.5k
  } else if (tsresol > ps->user_tsresol) {
728
    /*
729
     * The resolution is greater than what the user wants,
730
     * so we have to scale the timestamps down.
731
     */
732
699
    if (is_binary)
733
394
      ps->ifaces[ps->ifcount - 1].scale_type = SCALE_DOWN_BIN;
734
305
    else {
735
      /*
736
       * Calculate the scale factor.
737
       */
738
305
      ps->ifaces[ps->ifcount - 1].scale_factor = tsresol/ps->user_tsresol;
739
305
      ps->ifaces[ps->ifcount - 1].scale_type = SCALE_DOWN_DEC;
740
305
    }
741
699
  } else {
742
    /*
743
     * The resolution is less than what the user wants,
744
     * so we have to scale the timestamps up.
745
     */
746
652
    if (is_binary)
747
369
      ps->ifaces[ps->ifcount - 1].scale_type = SCALE_UP_BIN;
748
283
    else {
749
      /*
750
       * Calculate the scale factor.
751
       */
752
283
      ps->ifaces[ps->ifcount - 1].scale_factor = ps->user_tsresol/tsresol;
753
283
      ps->ifaces[ps->ifcount - 1].scale_type = SCALE_UP_DEC;
754
283
    }
755
652
  }
756
90.9k
  return (1);
757
91.0k
}
758
759
/*
760
 * Check whether this is a pcapng savefile and, if it is, extract the
761
 * relevant information from the header.
762
 */
763
pcap_t *
764
pcap_ng_check_header(const uint8_t *magic, FILE *fp, u_int precision,
765
    char *errbuf, int *err)
766
7.53k
{
767
7.53k
  bpf_u_int32 magic_int;
768
7.53k
  size_t amt_read;
769
7.53k
  bpf_u_int32 total_length;
770
7.53k
  bpf_u_int32 byte_order_magic;
771
7.53k
  struct block_header *bhdrp;
772
7.53k
  struct section_header_block *shbp;
773
7.53k
  pcap_t *p;
774
7.53k
  int swapped = 0;
775
7.53k
  struct pcap_ng_sf *ps;
776
7.53k
  int status;
777
7.53k
  struct block_cursor cursor;
778
7.53k
  struct interface_description_block *idbp;
779
780
  /*
781
   * Assume no read errors.
782
   */
783
7.53k
  *err = 0;
784
785
  /*
786
   * Check whether the first 4 bytes of the file are the block
787
   * type for a pcapng savefile.
788
   */
789
7.53k
  memcpy(&magic_int, magic, sizeof(magic_int));
790
7.53k
  if (magic_int != BT_SHB) {
791
    /*
792
     * XXX - check whether this looks like what the block
793
     * type would be after being munged by mapping between
794
     * UN*X and DOS/Windows text file format and, if it
795
     * does, look for the byte-order magic number in
796
     * the appropriate place and, if we find it, report
797
     * this as possibly being a pcapng file transferred
798
     * between UN*X and Windows in text file format?
799
     */
800
5.24k
    return (NULL);  /* nope */
801
5.24k
  }
802
803
  /*
804
   * OK, they are.  However, that's just \n\r\r\n, so it could,
805
   * conceivably, be an ordinary text file.
806
   *
807
   * It could not, however, conceivably be any other type of
808
   * capture file, so we can read the rest of the putative
809
   * Section Header Block; put the block type in the common
810
   * header, read the rest of the common header and the
811
   * fixed-length portion of the SHB, and look for the byte-order
812
   * magic value.
813
   */
814
2.29k
  amt_read = fread(&total_length, 1, sizeof(total_length), fp);
815
2.29k
  if (amt_read < sizeof(total_length)) {
816
9
    if (ferror(fp)) {
817
0
      pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
818
0
          errno, "error reading dump file");
819
0
      *err = 1;
820
0
      return (NULL);  /* fail */
821
0
    }
822
823
    /*
824
     * Possibly a weird short text file, so just say
825
     * "not pcapng".
826
     */
827
9
    return (NULL);
828
9
  }
829
2.28k
  amt_read = fread(&byte_order_magic, 1, sizeof(byte_order_magic), fp);
830
2.28k
  if (amt_read < sizeof(byte_order_magic)) {
831
6
    if (ferror(fp)) {
832
0
      pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
833
0
          errno, "error reading dump file");
834
0
      *err = 1;
835
0
      return (NULL);  /* fail */
836
0
    }
837
838
    /*
839
     * Possibly a weird short text file, so just say
840
     * "not pcapng".
841
     */
842
6
    return (NULL);
843
6
  }
844
2.27k
  if (byte_order_magic != BYTE_ORDER_MAGIC) {
845
790
    byte_order_magic = SWAPLONG(byte_order_magic);
846
790
    if (byte_order_magic != BYTE_ORDER_MAGIC) {
847
      /*
848
       * Not a pcapng file.
849
       */
850
236
      return (NULL);
851
236
    }
852
554
    swapped = 1;
853
554
    total_length = SWAPLONG(total_length);
854
554
  }
855
856
  /*
857
   * Check the sanity of the total length.
858
   */
859
2.04k
  if (total_length < sizeof(*bhdrp) + sizeof(*shbp) + sizeof(struct block_trailer) ||
860
2.04k
            (total_length > BT_SHB_INSANE_MAX)) {
861
102
    pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
862
102
        "Section Header Block in pcapng dump file has invalid length %" PRIsize " < _%u_ < %u (BT_SHB_INSANE_MAX)",
863
102
        sizeof(*bhdrp) + sizeof(*shbp) + sizeof(struct block_trailer),
864
102
        total_length,
865
102
        BT_SHB_INSANE_MAX);
866
867
102
    *err = 1;
868
102
    return (NULL);
869
102
  }
870
871
  /*
872
   * OK, this is a good pcapng file.
873
   * Allocate a pcap_t for it.
874
   */
875
1.93k
  p = pcap_open_offline_common(errbuf, sizeof (struct pcap_ng_sf));
876
1.93k
  if (p == NULL) {
877
    /* Allocation failed. */
878
0
    *err = 1;
879
0
    return (NULL);
880
0
  }
881
1.93k
  p->swapped = swapped;
882
1.93k
  ps = p->priv;
883
884
  /*
885
   * What precision does the user want?
886
   */
887
1.93k
  switch (precision) {
888
889
1.93k
  case PCAP_TSTAMP_PRECISION_MICRO:
890
1.93k
    ps->user_tsresol = 1000000;
891
1.93k
    break;
892
893
0
  case PCAP_TSTAMP_PRECISION_NANO:
894
0
    ps->user_tsresol = 1000000000;
895
0
    break;
896
897
0
  default:
898
0
    pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
899
0
        "unknown time stamp resolution %u", precision);
900
0
    free(p);
901
0
    *err = 1;
902
0
    return (NULL);
903
1.93k
  }
904
905
1.93k
  p->opt.tstamp_precision = precision;
906
907
  /*
908
   * Allocate a buffer into which to read blocks.  We default to
909
   * the maximum of:
910
   *
911
   *  the total length of the SHB for which we read the header;
912
   *
913
   *  2K, which should be more than large enough for an Enhanced
914
   *  Packet Block containing a full-size Ethernet frame, and
915
   *  leaving room for some options.
916
   *
917
   * If we find a bigger block, we reallocate the buffer, up to
918
   * the maximum size.  We start out with a maximum size of
919
   * INITIAL_MAX_BLOCKSIZE; if we see any link-layer header types
920
   * with a maximum snapshot that results in a larger maximum
921
   * block length, we boost the maximum.
922
   */
923
1.93k
  p->bufsize = 2048;
924
1.93k
  if (p->bufsize < total_length)
925
74
    p->bufsize = total_length;
926
1.93k
  p->buffer = malloc(p->bufsize);
927
1.93k
  if (p->buffer == NULL) {
928
0
    pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "out of memory");
929
0
    free(p);
930
0
    *err = 1;
931
0
    return (NULL);
932
0
  }
933
1.93k
  ps->max_blocksize = INITIAL_MAX_BLOCKSIZE;
934
935
  /*
936
   * Copy the stuff we've read to the buffer, and read the rest
937
   * of the SHB.
938
   */
939
1.93k
  bhdrp = (struct block_header *)p->buffer;
940
1.93k
  shbp = (struct section_header_block *)((u_char *)p->buffer + sizeof(struct block_header));
941
1.93k
  bhdrp->block_type = magic_int;
942
1.93k
  bhdrp->total_length = total_length;
943
1.93k
  shbp->byte_order_magic = byte_order_magic;
944
1.93k
  if (read_bytes(fp,
945
1.93k
      (u_char *)p->buffer + (sizeof(magic_int) + sizeof(total_length) + sizeof(byte_order_magic)),
946
1.93k
      total_length - (sizeof(magic_int) + sizeof(total_length) + sizeof(byte_order_magic)),
947
1.93k
      1, errbuf) == -1)
948
100
    goto fail;
949
950
1.83k
  if (p->swapped) {
951
    /*
952
     * Byte-swap the fields we've read.
953
     */
954
483
    shbp->major_version = SWAPSHORT(shbp->major_version);
955
483
    shbp->minor_version = SWAPSHORT(shbp->minor_version);
956
957
    /*
958
     * XXX - we don't care about the section length.
959
     */
960
483
  }
961
  /* currently only SHB version 1.0 is supported */
962
1.83k
  if (! (shbp->major_version == PCAP_NG_VERSION_MAJOR &&
963
1.83k
         shbp->minor_version == PCAP_NG_VERSION_MINOR)) {
964
41
    pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
965
41
        "unsupported pcapng savefile version %u.%u",
966
41
        shbp->major_version, shbp->minor_version);
967
41
    goto fail;
968
41
  }
969
1.79k
  p->version_major = shbp->major_version;
970
1.79k
  p->version_minor = shbp->minor_version;
971
972
  /*
973
   * Save the time stamp resolution the user requested.
974
   */
975
1.79k
  p->opt.tstamp_precision = precision;
976
977
  /*
978
   * Now start looking for an Interface Description Block.
979
   */
980
3.22k
  for (;;) {
981
    /*
982
     * Read the next block.
983
     */
984
3.22k
    status = read_block(fp, p, &cursor, errbuf);
985
3.22k
    if (status == 0) {
986
      /* EOF - no IDB in this file */
987
22
      pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
988
22
          "the capture file has no Interface Description Blocks");
989
22
      goto fail;
990
22
    }
991
3.20k
    if (status == -1)
992
359
      goto fail;  /* error */
993
2.84k
    switch (cursor.block_type) {
994
995
1.40k
    case BT_IDB:
996
      /*
997
       * Get a pointer to the fixed-length portion of the
998
       * IDB.
999
       */
1000
1.40k
      idbp = get_from_block_data(&cursor, sizeof(*idbp),
1001
1.40k
          errbuf);
1002
1.40k
      if (idbp == NULL)
1003
4
        goto fail;  /* error */
1004
1005
      /*
1006
       * Byte-swap it if necessary.
1007
       */
1008
1.40k
      if (p->swapped) {
1009
345
        idbp->linktype = SWAPSHORT(idbp->linktype);
1010
345
        idbp->snaplen = SWAPLONG(idbp->snaplen);
1011
345
      }
1012
1013
      /*
1014
       * Try to add this interface.
1015
       */
1016
1.40k
      if (!add_interface(p, &cursor, errbuf))
1017
73
        goto fail;
1018
1019
1.33k
      goto done;
1020
1021
1.33k
    case BT_EPB:
1022
5
    case BT_SPB:
1023
7
    case BT_PB:
1024
      /*
1025
       * Saw a packet before we saw any IDBs.  That's
1026
       * not valid, as we don't know what link-layer
1027
       * encapsulation the packet has.
1028
       */
1029
7
      pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
1030
7
          "the capture file has a packet block before any Interface Description Blocks");
1031
7
      goto fail;
1032
1033
1.42k
    default:
1034
      /*
1035
       * Just ignore it.
1036
       */
1037
1.42k
      break;
1038
2.84k
    }
1039
2.84k
  }
1040
1041
1.33k
done:
1042
1.33k
  p->tzoff = 0; /* XXX - not used in pcap */
1043
1.33k
  p->linktype = linktype_to_dlt(idbp->linktype);
1044
1.33k
  p->snapshot = pcap_adjust_snapshot(p->linktype, idbp->snaplen);
1045
1.33k
  p->linktype_ext = 0;
1046
1047
  /*
1048
   * If the maximum block size for a packet with the maximum
1049
   * snapshot length for this DLT_ is bigger than the current
1050
   * maximum block size, increase the maximum.
1051
   */
1052
1.33k
  if (MAX_BLOCKSIZE_FOR_SNAPLEN(max_snaplen_for_dlt(p->linktype)) > ps->max_blocksize)
1053
10
    ps->max_blocksize = MAX_BLOCKSIZE_FOR_SNAPLEN(max_snaplen_for_dlt(p->linktype));
1054
1055
1.33k
  p->next_packet_op = pcap_ng_next_packet;
1056
1.33k
  p->cleanup_op = pcap_ng_cleanup;
1057
1058
1.33k
  return (p);
1059
1060
606
fail:
1061
606
  free(ps->ifaces);
1062
606
  free(p->buffer);
1063
606
  free(p);
1064
606
  *err = 1;
1065
606
  return (NULL);
1066
1.79k
}
1067
1068
static void
1069
pcap_ng_cleanup(pcap_t *p)
1070
1.33k
{
1071
1.33k
  struct pcap_ng_sf *ps = p->priv;
1072
1073
1.33k
  free(ps->ifaces);
1074
1.33k
  sf_cleanup(p);
1075
1.33k
}
1076
1077
/*
1078
 * Read and return the next packet from the savefile.  Return the header
1079
 * in hdr and a pointer to the contents in data.  Return 0 on success, 1
1080
 * if there were no more packets, and -1 on an error.
1081
 */
1082
static int
1083
pcap_ng_next_packet(pcap_t *p, struct pcap_pkthdr *hdr, u_char **data)
1084
5.22k
{
1085
5.22k
  struct pcap_ng_sf *ps = p->priv;
1086
5.22k
  struct block_cursor cursor;
1087
5.22k
  int status;
1088
5.22k
  struct enhanced_packet_block *epbp;
1089
5.22k
  struct simple_packet_block *spbp;
1090
5.22k
  struct packet_block *pbp;
1091
5.22k
  bpf_u_int32 interface_id = 0xFFFFFFFF;
1092
5.22k
  struct interface_description_block *idbp;
1093
5.22k
  struct section_header_block *shbp;
1094
5.22k
  FILE *fp = p->rfile;
1095
5.22k
  uint64_t t, sec, frac;
1096
1097
  /*
1098
   * Look for an Enhanced Packet Block, a Simple Packet Block,
1099
   * or a Packet Block.
1100
   */
1101
96.0k
  for (;;) {
1102
    /*
1103
     * Read the block type and length; those are common
1104
     * to all blocks.
1105
     */
1106
96.0k
    status = read_block(fp, p, &cursor, p->errbuf);
1107
96.0k
    if (status == 0)
1108
447
      return (1);  /* EOF */
1109
95.5k
    if (status == -1)
1110
233
      return (-1);  /* error */
1111
95.3k
    switch (cursor.block_type) {
1112
1113
668
    case BT_EPB:
1114
      /*
1115
       * Get a pointer to the fixed-length portion of the
1116
       * EPB.
1117
       */
1118
668
      epbp = get_from_block_data(&cursor, sizeof(*epbp),
1119
668
          p->errbuf);
1120
668
      if (epbp == NULL)
1121
2
        return (-1);  /* error */
1122
1123
      /*
1124
       * Byte-swap it if necessary.
1125
       */
1126
666
      if (p->swapped) {
1127
        /* these were written in opposite byte order */
1128
125
        interface_id = SWAPLONG(epbp->interface_id);
1129
125
        hdr->caplen = SWAPLONG(epbp->caplen);
1130
125
        hdr->len = SWAPLONG(epbp->len);
1131
125
        t = ((uint64_t)SWAPLONG(epbp->timestamp_high)) << 32 |
1132
125
            SWAPLONG(epbp->timestamp_low);
1133
541
      } else {
1134
541
        interface_id = epbp->interface_id;
1135
541
        hdr->caplen = epbp->caplen;
1136
541
        hdr->len = epbp->len;
1137
541
        t = ((uint64_t)epbp->timestamp_high) << 32 |
1138
541
            epbp->timestamp_low;
1139
541
      }
1140
666
      goto found;
1141
1142
2.95k
    case BT_SPB:
1143
      /*
1144
       * Get a pointer to the fixed-length portion of the
1145
       * SPB.
1146
       */
1147
2.95k
      spbp = get_from_block_data(&cursor, sizeof(*spbp),
1148
2.95k
          p->errbuf);
1149
2.95k
      if (spbp == NULL)
1150
2
        return (-1);  /* error */
1151
1152
      /*
1153
       * SPB packets are assumed to have arrived on
1154
       * the first interface.
1155
       */
1156
2.95k
      interface_id = 0;
1157
1158
      /*
1159
       * Byte-swap it if necessary.
1160
       */
1161
2.95k
      if (p->swapped) {
1162
        /* these were written in opposite byte order */
1163
841
        hdr->len = SWAPLONG(spbp->len);
1164
841
      } else
1165
2.10k
        hdr->len = spbp->len;
1166
1167
      /*
1168
       * The SPB doesn't give the captured length;
1169
       * it's the minimum of the snapshot length
1170
       * and the packet length.
1171
       */
1172
2.95k
      hdr->caplen = hdr->len;
1173
2.95k
      if (hdr->caplen > (bpf_u_int32)p->snapshot)
1174
1.06k
        hdr->caplen = p->snapshot;
1175
2.95k
      t = 0;  /* no time stamps */
1176
2.95k
      goto found;
1177
1178
541
    case BT_PB:
1179
      /*
1180
       * Get a pointer to the fixed-length portion of the
1181
       * PB.
1182
       */
1183
541
      pbp = get_from_block_data(&cursor, sizeof(*pbp),
1184
541
          p->errbuf);
1185
541
      if (pbp == NULL)
1186
2
        return (-1);  /* error */
1187
1188
      /*
1189
       * Byte-swap it if necessary.
1190
       */
1191
539
      if (p->swapped) {
1192
        /* these were written in opposite byte order */
1193
238
        interface_id = SWAPSHORT(pbp->interface_id);
1194
238
        hdr->caplen = SWAPLONG(pbp->caplen);
1195
238
        hdr->len = SWAPLONG(pbp->len);
1196
238
        t = ((uint64_t)SWAPLONG(pbp->timestamp_high)) << 32 |
1197
238
            SWAPLONG(pbp->timestamp_low);
1198
301
      } else {
1199
301
        interface_id = pbp->interface_id;
1200
301
        hdr->caplen = pbp->caplen;
1201
301
        hdr->len = pbp->len;
1202
301
        t = ((uint64_t)pbp->timestamp_high) << 32 |
1203
301
            pbp->timestamp_low;
1204
301
      }
1205
539
      goto found;
1206
1207
89.7k
    case BT_IDB:
1208
      /*
1209
       * Interface Description Block.  Get a pointer
1210
       * to its fixed-length portion.
1211
       */
1212
89.7k
      idbp = get_from_block_data(&cursor, sizeof(*idbp),
1213
89.7k
          p->errbuf);
1214
89.7k
      if (idbp == NULL)
1215
3
        return (-1);  /* error */
1216
1217
      /*
1218
       * Byte-swap it if necessary.
1219
       */
1220
89.7k
      if (p->swapped) {
1221
1.05k
        idbp->linktype = SWAPSHORT(idbp->linktype);
1222
1.05k
        idbp->snaplen = SWAPLONG(idbp->snaplen);
1223
1.05k
      }
1224
1225
      /*
1226
       * If the link-layer type or snapshot length
1227
       * differ from the ones for the first IDB we
1228
       * saw, quit.
1229
       *
1230
       * XXX - just discard packets from those
1231
       * interfaces?
1232
       */
1233
89.7k
      if (p->linktype != idbp->linktype) {
1234
36
        pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1235
36
            "an interface has a type %u different from the type of the first interface",
1236
36
            idbp->linktype);
1237
36
        return (-1);
1238
36
      }
1239
1240
      /*
1241
       * Check against the *adjusted* value of this IDB's
1242
       * snapshot length.
1243
       */
1244
89.7k
      if ((bpf_u_int32)p->snapshot !=
1245
89.7k
          pcap_adjust_snapshot(p->linktype, idbp->snaplen)) {
1246
85
        pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1247
85
            "an interface has a snapshot length %u different from the type of the first interface",
1248
85
            idbp->snaplen);
1249
85
        return (-1);
1250
85
      }
1251
1252
      /*
1253
       * Try to add this interface.
1254
       */
1255
89.6k
      if (!add_interface(p, &cursor, p->errbuf))
1256
13
        return (-1);
1257
89.6k
      break;
1258
1259
89.6k
    case BT_SHB:
1260
      /*
1261
       * Section Header Block.  Get a pointer
1262
       * to its fixed-length portion.
1263
       */
1264
638
      shbp = get_from_block_data(&cursor, sizeof(*shbp),
1265
638
          p->errbuf);
1266
638
      if (shbp == NULL)
1267
3
        return (-1);  /* error */
1268
1269
      /*
1270
       * Assume the byte order of this section is
1271
       * the same as that of the previous section.
1272
       * We'll check for that later.
1273
       */
1274
635
      if (p->swapped) {
1275
214
        shbp->byte_order_magic =
1276
214
            SWAPLONG(shbp->byte_order_magic);
1277
214
        shbp->major_version =
1278
214
            SWAPSHORT(shbp->major_version);
1279
214
      }
1280
1281
      /*
1282
       * Make sure the byte order doesn't change;
1283
       * pcap_is_swapped() shouldn't change its
1284
       * return value in the middle of reading a capture.
1285
       */
1286
635
      switch (shbp->byte_order_magic) {
1287
1288
402
      case BYTE_ORDER_MAGIC:
1289
        /*
1290
         * OK.
1291
         */
1292
402
        break;
1293
1294
2
      case SWAPLONG(BYTE_ORDER_MAGIC):
1295
        /*
1296
         * Byte order changes.
1297
         */
1298
2
        pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1299
2
            "the file has sections with different byte orders");
1300
2
        return (-1);
1301
1302
231
      default:
1303
        /*
1304
         * Not a valid SHB.
1305
         */
1306
231
        pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1307
231
            "the file has a section with a bad byte order magic field");
1308
231
        return (-1);
1309
635
      }
1310
1311
      /*
1312
       * Make sure the major version is the version
1313
       * we handle.
1314
       */
1315
402
      if (shbp->major_version != PCAP_NG_VERSION_MAJOR) {
1316
11
        pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1317
11
            "unknown pcapng savefile major version number %u",
1318
11
            shbp->major_version);
1319
11
        return (-1);
1320
11
      }
1321
1322
      /*
1323
       * Reset the interface count; this section should
1324
       * have its own set of IDBs.  If any of them
1325
       * don't have the same interface type, snapshot
1326
       * length, or resolution as the first interface
1327
       * we saw, we'll fail.  (And if we don't see
1328
       * any IDBs, we'll fail when we see a packet
1329
       * block.)
1330
       */
1331
391
      ps->ifcount = 0;
1332
391
      break;
1333
1334
823
    default:
1335
      /*
1336
       * Not a packet block, IDB, or SHB; ignore it.
1337
       */
1338
823
      break;
1339
95.3k
    }
1340
95.3k
  }
1341
1342
4.15k
found:
1343
  /*
1344
   * Is the interface ID an interface we know?
1345
   */
1346
4.15k
  if (interface_id >= ps->ifcount) {
1347
    /*
1348
     * Yes.  Fail.
1349
     */
1350
90
    pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1351
90
        "a packet arrived on interface %u, but there's no Interface Description Block for that interface",
1352
90
        interface_id);
1353
90
    return (-1);
1354
90
  }
1355
1356
4.06k
  if (hdr->caplen > (bpf_u_int32)p->snapshot) {
1357
62
    pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1358
62
        "invalid packet capture length %u, bigger than "
1359
62
        "snaplen of %d", hdr->caplen, p->snapshot);
1360
62
    return (-1);
1361
62
  }
1362
1363
  /*
1364
   * Convert the time stamp to seconds and fractions of a second,
1365
   * with the fractions being in units of the file-supplied resolution.
1366
   */
1367
4.00k
  sec = t / ps->ifaces[interface_id].tsresol + ps->ifaces[interface_id].tsoffset;
1368
4.00k
  frac = t % ps->ifaces[interface_id].tsresol;
1369
1370
  /*
1371
   * Convert the fractions from units of the file-supplied resolution
1372
   * to units of the user-requested resolution.
1373
   */
1374
4.00k
  switch (ps->ifaces[interface_id].scale_type) {
1375
1376
2.00k
  case PASS_THROUGH:
1377
    /*
1378
     * The interface resolution is what the user wants,
1379
     * so we're done.
1380
     */
1381
2.00k
    break;
1382
1383
436
  case SCALE_UP_DEC:
1384
    /*
1385
     * The interface resolution is less than what the user
1386
     * wants; scale the fractional part up to the units of
1387
     * the resolution the user requested by multiplying by
1388
     * the quotient of the user-requested resolution and the
1389
     * file-supplied resolution.
1390
     *
1391
     * Those resolutions are both powers of 10, and the user-
1392
     * requested resolution is greater than the file-supplied
1393
     * resolution, so the quotient in question is an integer.
1394
     * We've calculated that quotient already, so we just
1395
     * multiply by it.
1396
     */
1397
436
    frac *= ps->ifaces[interface_id].scale_factor;
1398
436
    break;
1399
1400
419
  case SCALE_UP_BIN:
1401
    /*
1402
     * The interface resolution is less than what the user
1403
     * wants; scale the fractional part up to the units of
1404
     * the resolution the user requested by multiplying by
1405
     * the quotient of the user-requested resolution and the
1406
     * file-supplied resolution.
1407
     *
1408
     * The file-supplied resolution is a power of 2, so the
1409
     * quotient is not an integer, so, in order to do this
1410
     * entirely with integer arithmetic, we multiply by the
1411
     * user-requested resolution and divide by the file-
1412
     * supplied resolution.
1413
     *
1414
     * XXX - Is there something clever we could do here,
1415
     * given that we know that the file-supplied resolution
1416
     * is a power of 2?  Doing a multiplication followed by
1417
     * a division runs the risk of overflowing, and involves
1418
     * two non-simple arithmetic operations.
1419
     */
1420
419
    frac *= ps->user_tsresol;
1421
419
    frac /= ps->ifaces[interface_id].tsresol;
1422
419
    break;
1423
1424
505
  case SCALE_DOWN_DEC:
1425
    /*
1426
     * The interface resolution is greater than what the user
1427
     * wants; scale the fractional part up to the units of
1428
     * the resolution the user requested by multiplying by
1429
     * the quotient of the user-requested resolution and the
1430
     * file-supplied resolution.
1431
     *
1432
     * Those resolutions are both powers of 10, and the user-
1433
     * requested resolution is less than the file-supplied
1434
     * resolution, so the quotient in question isn't an
1435
     * integer, but its reciprocal is, and we can just divide
1436
     * by the reciprocal of the quotient.  We've calculated
1437
     * the reciprocal of that quotient already, so we must
1438
     * divide by it.
1439
     */
1440
505
    frac /= ps->ifaces[interface_id].scale_factor;
1441
505
    break;
1442
1443
1444
641
  case SCALE_DOWN_BIN:
1445
    /*
1446
     * The interface resolution is greater than what the user
1447
     * wants; convert the fractional part to units of the
1448
     * resolution the user requested by multiplying by the
1449
     * quotient of the user-requested resolution and the
1450
     * file-supplied resolution.  We do that by multiplying
1451
     * by the user-requested resolution and dividing by the
1452
     * file-supplied resolution, as the quotient might not
1453
     * fit in an integer.
1454
     *
1455
     * The file-supplied resolution is a power of 2, so the
1456
     * quotient is not an integer, and neither is its
1457
     * reciprocal, so, in order to do this entirely with
1458
     * integer arithmetic, we multiply by the user-requested
1459
     * resolution and divide by the file-supplied resolution.
1460
     *
1461
     * XXX - Is there something clever we could do here,
1462
     * given that we know that the file-supplied resolution
1463
     * is a power of 2?  Doing a multiplication followed by
1464
     * a division runs the risk of overflowing, and involves
1465
     * two non-simple arithmetic operations.
1466
     */
1467
641
    frac *= ps->user_tsresol;
1468
641
    frac /= ps->ifaces[interface_id].tsresol;
1469
641
    break;
1470
4.00k
  }
1471
#ifdef _WIN32
1472
  /*
1473
   * tv_sec and tv_used in the Windows struct timeval are both
1474
   * longs.
1475
   */
1476
  hdr->ts.tv_sec = (long)sec;
1477
  hdr->ts.tv_usec = (long)frac;
1478
#else
1479
  /*
1480
   * tv_sec in the UN*X struct timeval is a time_t; tv_usec is
1481
   * suseconds_t in UN*Xes that work the way the current Single
1482
   * UNIX Standard specify - but not all older UN*Xes necessarily
1483
   * support that type, so just cast to int.
1484
   */
1485
4.00k
  hdr->ts.tv_sec = (time_t)sec;
1486
4.00k
  hdr->ts.tv_usec = (int)frac;
1487
4.00k
#endif
1488
1489
  /*
1490
   * Get a pointer to the packet data.
1491
   */
1492
4.00k
  *data = get_from_block_data(&cursor, hdr->caplen, p->errbuf);
1493
4.00k
  if (*data == NULL)
1494
96
    return (-1);
1495
1496
3.90k
  if (p->swapped)
1497
1.09k
    swap_pseudo_headers(p->linktype, hdr, *data);
1498
1499
3.90k
  return (0);
1500
4.00k
}