Coverage Report

Created: 2025-11-16 07:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libpcap-1.9.1/sf-pcapng.c
Line
Count
Source
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
674
#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.25k
#define BT_SHB      0x0A0D0D0A
88
2.07k
#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.78k
#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.36k
#define PCAP_NG_VERSION_MAJOR 1
107
1.74k
#define PCAP_NG_VERSION_MINOR 0
108
109
/*
110
 * Interface Description Block.
111
 */
112
121k
#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
2.13k
#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
683
#define IF_TSOFFSET 14  /* time stamp offset for this interface */
137
138
/*
139
 * Enhanced Packet Block.
140
 */
141
741
#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.52k
#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
749
#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.86k
#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.30k
  (sizeof (struct block_header) + \
246
1.30k
   sizeof (struct enhanced_packet_block) + \
247
1.30k
   (max_snaplen) + 131072 + \
248
1.30k
   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
261k
{
258
261k
  size_t amt_read;
259
260
261k
  amt_read = fread(buf, 1, bytes_to_read, fp);
261
261k
  if (amt_read != bytes_to_read) {
262
862
    if (ferror(fp)) {
263
0
      pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
264
0
          errno, "error reading dump file");
265
862
    } else {
266
862
      if (amt_read == 0 && !fail_on_eof)
267
483
        return (0);  /* EOF */
268
379
      pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
269
379
          "truncated pcapng dump file; tried to read %" PRIsize " bytes, only got %" PRIsize,
270
379
          bytes_to_read, amt_read);
271
379
    }
272
379
    return (-1);
273
862
  }
274
260k
  return (1);
275
261k
}
276
277
static int
278
read_block(FILE *fp, pcap_t *p, struct block_cursor *cursor, char *errbuf)
279
130k
{
280
130k
  struct pcap_ng_sf *ps;
281
130k
  int status;
282
130k
  struct block_header bhdr;
283
130k
  struct block_trailer *btrlr;
284
130k
  u_char *bdata;
285
130k
  size_t data_remaining;
286
287
130k
  ps = p->priv;
288
289
130k
  status = read_bytes(fp, &bhdr, sizeof(bhdr), 0, errbuf);
290
130k
  if (status <= 0)
291
634
    return (status);  /* error or EOF */
292
293
129k
  if (p->swapped) {
294
4.34k
    bhdr.block_type = SWAPLONG(bhdr.block_type);
295
4.34k
    bhdr.total_length = SWAPLONG(bhdr.total_length);
296
4.34k
  }
297
298
  /*
299
   * Is this block "too small" - i.e., is it shorter than a block
300
   * header plus a block trailer?
301
   */
302
129k
  if (bhdr.total_length < sizeof(struct block_header) +
303
129k
      sizeof(struct block_trailer)) {
304
22
    pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
305
22
        "block in pcapng dump file has a length of %u < %" PRIsize,
306
22
        bhdr.total_length,
307
22
        sizeof(struct block_header) + sizeof(struct block_trailer));
308
22
    return (-1);
309
22
  }
310
311
  /*
312
   * Is the block total length a multiple of 4?
313
   */
314
129k
  if ((bhdr.total_length % 4) != 0) {
315
    /*
316
     * No.  Report that as an error.
317
     */
318
33
    pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
319
33
        "block in pcapng dump file has a length of %u that is not a multiple of 4" PRIsize,
320
33
        bhdr.total_length);
321
33
    return (-1);
322
33
  }
323
324
  /*
325
   * Is the buffer big enough?
326
   */
327
129k
  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
610
    void *bigger_buffer;
333
334
610
    if (bhdr.total_length > ps->max_blocksize) {
335
150
      pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "pcapng block size %u > maximum %u", bhdr.total_length,
336
150
          ps->max_blocksize);
337
150
      return (-1);
338
150
    }
339
460
    bigger_buffer = realloc(p->buffer, bhdr.total_length);
340
460
    if (bigger_buffer == NULL) {
341
0
      pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE, "out of memory");
342
0
      return (-1);
343
0
    }
344
460
    p->buffer = bigger_buffer;
345
460
  }
346
347
  /*
348
   * Copy the stuff we've read to the buffer, and read the rest
349
   * of the block.
350
   */
351
129k
  memcpy(p->buffer, &bhdr, sizeof(bhdr));
352
129k
  bdata = (u_char *)p->buffer + sizeof(bhdr);
353
129k
  data_remaining = bhdr.total_length - sizeof(bhdr);
354
129k
  if (read_bytes(fp, bdata, data_remaining, 1, errbuf) == -1)
355
125
    return (-1);
356
357
  /*
358
   * Get the block size from the trailer.
359
   */
360
129k
  btrlr = (struct block_trailer *)(bdata + data_remaining - sizeof (struct block_trailer));
361
129k
  if (p->swapped)
362
4.23k
    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
129k
  if (bhdr.total_length != btrlr->total_length) {
369
    /*
370
     * No.
371
     */
372
115
    pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
373
115
        "block total length in header and trailer don't match");
374
115
    return (-1);
375
115
  }
376
377
  /*
378
   * Initialize the cursor.
379
   */
380
129k
  cursor->data = bdata;
381
129k
  cursor->data_remaining = data_remaining - sizeof(struct block_trailer);
382
129k
  cursor->block_type = bhdr.block_type;
383
129k
  return (1);
384
129k
}
385
386
static void *
387
get_from_block_data(struct block_cursor *cursor, size_t chunk_size,
388
    char *errbuf)
389
397k
{
390
397k
  void *data;
391
392
  /*
393
   * Make sure we have the specified amount of data remaining in
394
   * the block data.
395
   */
396
397k
  if (cursor->data_remaining < chunk_size) {
397
127
    pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
398
127
        "block of type %u in pcapng dump file is too short",
399
127
        cursor->block_type);
400
127
    return (NULL);
401
127
  }
402
403
  /*
404
   * Return the current pointer, and skip past the chunk.
405
   */
406
397k
  data = cursor->data;
407
397k
  cursor->data += chunk_size;
408
397k
  cursor->data_remaining -= chunk_size;
409
397k
  return (data);
410
397k
}
411
412
static struct option_header *
413
get_opthdr_from_block_data(pcap_t *p, struct block_cursor *cursor, char *errbuf)
414
133k
{
415
133k
  struct option_header *opthdr;
416
417
133k
  opthdr = get_from_block_data(cursor, sizeof(*opthdr), errbuf);
418
133k
  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
133k
  if (p->swapped) {
429
2.39k
    opthdr->option_code = SWAPSHORT(opthdr->option_code);
430
2.39k
    opthdr->option_length = SWAPSHORT(opthdr->option_length);
431
2.39k
  }
432
433
133k
  return (opthdr);
434
133k
}
435
436
static void *
437
get_optvalue_from_block_data(struct block_cursor *cursor,
438
    struct option_header *opthdr, char *errbuf)
439
133k
{
440
133k
  size_t padded_option_len;
441
133k
  void *optvalue;
442
443
  /* Pad option length to 4-byte boundary */
444
133k
  padded_option_len = opthdr->option_length;
445
133k
  padded_option_len = ((padded_option_len + 3)/4)*4;
446
447
133k
  optvalue = get_from_block_data(cursor, padded_option_len, errbuf);
448
133k
  if (optvalue == NULL) {
449
    /*
450
     * Option value is cut short.
451
     */
452
35
    return (NULL);
453
35
  }
454
455
133k
  return (optvalue);
456
133k
}
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
121k
{
462
121k
  struct option_header *opthdr;
463
121k
  void *optvalue;
464
121k
  int saw_tsresol, saw_tsoffset;
465
121k
  uint8_t tsresol_opt;
466
121k
  u_int i;
467
468
121k
  saw_tsresol = 0;
469
121k
  saw_tsoffset = 0;
470
254k
  while (cursor->data_remaining != 0) {
471
    /*
472
     * Get the option header.
473
     */
474
133k
    opthdr = get_opthdr_from_block_data(p, cursor, errbuf);
475
133k
    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
133k
    optvalue = get_optvalue_from_block_data(cursor, opthdr,
486
133k
        errbuf);
487
133k
    if (optvalue == NULL) {
488
      /*
489
       * Option value is cut short.
490
       */
491
35
      return (-1);
492
35
    }
493
494
133k
    switch (opthdr->option_code) {
495
496
674
    case OPT_ENDOFOPT:
497
674
      if (opthdr->option_length != 0) {
498
12
        pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
499
12
            "Interface Description Block has opt_endofopt option with length %u != 0",
500
12
            opthdr->option_length);
501
12
        return (-1);
502
12
      }
503
662
      goto done;
504
505
2.13k
    case IF_TSRESOL:
506
2.13k
      if (opthdr->option_length != 1) {
507
6
        pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
508
6
            "Interface Description Block has if_tsresol option with length %u != 1",
509
6
            opthdr->option_length);
510
6
        return (-1);
511
6
      }
512
2.13k
      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
2.13k
      saw_tsresol = 1;
518
2.13k
      memcpy(&tsresol_opt, optvalue, sizeof(tsresol_opt));
519
2.13k
      if (tsresol_opt & 0x80) {
520
        /*
521
         * Resolution is negative power of 2.
522
         */
523
1.21k
        uint8_t tsresol_shift = (tsresol_opt & 0x7F);
524
525
1.21k
        if (tsresol_shift > 63) {
526
          /*
527
           * Resolution is too high; 2^-{res}
528
           * won't fit in a 64-bit value.
529
           */
530
7
          pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
531
7
              "Interface Description Block if_tsresol option resolution 2^-%u is too high",
532
7
              tsresol_shift);
533
7
          return (-1);
534
7
        }
535
1.20k
        *is_binary = 1;
536
1.20k
        *tsresol = ((uint64_t)1) << tsresol_shift;
537
1.20k
      } else {
538
        /*
539
         * Resolution is negative power of 10.
540
         */
541
917
        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
915
        *is_binary = 0;
556
915
        *tsresol = 1;
557
5.59k
        for (i = 0; i < tsresol_opt; i++)
558
4.67k
          *tsresol *= 10;
559
915
      }
560
2.12k
      break;
561
562
2.12k
    case IF_TSOFFSET:
563
683
      if (opthdr->option_length != 8) {
564
4
        pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
565
4
            "Interface Description Block has if_tsoffset option with length %u != 8",
566
4
            opthdr->option_length);
567
4
        return (-1);
568
4
      }
569
679
      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
677
      saw_tsoffset = 1;
575
677
      memcpy(tsoffset, optvalue, sizeof(*tsoffset));
576
677
      if (p->swapped)
577
419
        *tsoffset = SWAPLL(*tsoffset);
578
677
      break;
579
580
130k
    default:
581
130k
      break;
582
133k
    }
583
133k
  }
584
585
121k
done:
586
121k
  return (0);
587
121k
}
588
589
static int
590
add_interface(pcap_t *p, struct block_cursor *cursor, char *errbuf)
591
121k
{
592
121k
  struct pcap_ng_sf *ps;
593
121k
  uint64_t tsresol;
594
121k
  uint64_t tsoffset;
595
121k
  int is_binary;
596
597
121k
  ps = p->priv;
598
599
  /*
600
   * Count this interface.
601
   */
602
121k
  ps->ifcount++;
603
604
  /*
605
   * Grow the array of per-interface information as necessary.
606
   */
607
121k
  if (ps->ifcount > ps->ifaces_size) {
608
    /*
609
     * We need to grow the array.
610
     */
611
2.29k
    bpf_u_int32 new_ifaces_size;
612
2.29k
    struct pcap_ng_if *new_ifaces;
613
614
2.29k
    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.34k
      new_ifaces_size = 1;
632
1.34k
      new_ifaces = malloc(sizeof (struct pcap_ng_if));
633
1.34k
    } 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
941
      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
941
      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
941
      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
941
      new_ifaces = realloc(ps->ifaces, new_ifaces_size * sizeof (struct pcap_ng_if));
684
941
    }
685
2.29k
    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.29k
    ps->ifaces_size = new_ifaces_size;
696
2.29k
    ps->ifaces = new_ifaces;
697
2.29k
  }
698
699
  /*
700
   * Set the default time stamp resolution and offset.
701
   */
702
121k
  tsresol = 1000000;  /* microsecond resolution */
703
121k
  is_binary = 0;    /* which is a power of 10 */
704
121k
  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
121k
  if (process_idb_options(p, cursor, &tsresol, &tsoffset, &is_binary,
711
121k
      errbuf) == -1)
712
70
    return (0);
713
714
121k
  ps->ifaces[ps->ifcount - 1].tsresol = tsresol;
715
121k
  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
121k
  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
119k
    ps->ifaces[ps->ifcount - 1].scale_type = PASS_THROUGH;
727
119k
  } 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
1.06k
    if (is_binary)
733
606
      ps->ifaces[ps->ifcount - 1].scale_type = SCALE_DOWN_BIN;
734
463
    else {
735
      /*
736
       * Calculate the scale factor.
737
       */
738
463
      ps->ifaces[ps->ifcount - 1].scale_factor = tsresol/ps->user_tsresol;
739
463
      ps->ifaces[ps->ifcount - 1].scale_type = SCALE_DOWN_DEC;
740
463
    }
741
1.06k
  } else {
742
    /*
743
     * The resolution is less than what the user wants,
744
     * so we have to scale the timestamps up.
745
     */
746
1.04k
    if (is_binary)
747
600
      ps->ifaces[ps->ifcount - 1].scale_type = SCALE_UP_BIN;
748
441
    else {
749
      /*
750
       * Calculate the scale factor.
751
       */
752
441
      ps->ifaces[ps->ifcount - 1].scale_factor = ps->user_tsresol/tsresol;
753
441
      ps->ifaces[ps->ifcount - 1].scale_type = SCALE_UP_DEC;
754
441
    }
755
1.04k
  }
756
121k
  return (1);
757
121k
}
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.20k
{
767
7.20k
  bpf_u_int32 magic_int;
768
7.20k
  size_t amt_read;
769
7.20k
  bpf_u_int32 total_length;
770
7.20k
  bpf_u_int32 byte_order_magic;
771
7.20k
  struct block_header *bhdrp;
772
7.20k
  struct section_header_block *shbp;
773
7.20k
  pcap_t *p;
774
7.20k
  int swapped = 0;
775
7.20k
  struct pcap_ng_sf *ps;
776
7.20k
  int status;
777
7.20k
  struct block_cursor cursor;
778
7.20k
  struct interface_description_block *idbp;
779
780
  /*
781
   * Assume no read errors.
782
   */
783
7.20k
  *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.20k
  memcpy(&magic_int, magic, sizeof(magic_int));
790
7.20k
  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.02k
    return (NULL);  /* nope */
801
5.02k
  }
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.18k
  amt_read = fread(&total_length, 1, sizeof(total_length), fp);
815
2.18k
  if (amt_read < sizeof(total_length)) {
816
7
    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
7
    return (NULL);
828
7
  }
829
2.17k
  amt_read = fread(&byte_order_magic, 1, sizeof(byte_order_magic), fp);
830
2.17k
  if (amt_read < sizeof(byte_order_magic)) {
831
4
    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
4
    return (NULL);
843
4
  }
844
2.17k
  if (byte_order_magic != BYTE_ORDER_MAGIC) {
845
779
    byte_order_magic = SWAPLONG(byte_order_magic);
846
779
    if (byte_order_magic != BYTE_ORDER_MAGIC) {
847
      /*
848
       * Not a pcapng file.
849
       */
850
199
      return (NULL);
851
199
    }
852
580
    swapped = 1;
853
580
    total_length = SWAPLONG(total_length);
854
580
  }
855
856
  /*
857
   * Check the sanity of the total length.
858
   */
859
1.97k
  if (total_length < sizeof(*bhdrp) + sizeof(*shbp) + sizeof(struct block_trailer) ||
860
1.96k
            (total_length > BT_SHB_INSANE_MAX)) {
861
106
    pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
862
106
        "Section Header Block in pcapng dump file has invalid length %" PRIsize " < _%u_ < %u (BT_SHB_INSANE_MAX)",
863
106
        sizeof(*bhdrp) + sizeof(*shbp) + sizeof(struct block_trailer),
864
106
        total_length,
865
106
        BT_SHB_INSANE_MAX);
866
867
106
    *err = 1;
868
106
    return (NULL);
869
106
  }
870
871
  /*
872
   * OK, this is a good pcapng file.
873
   * Allocate a pcap_t for it.
874
   */
875
1.86k
  p = pcap_open_offline_common(errbuf, sizeof (struct pcap_ng_sf));
876
1.86k
  if (p == NULL) {
877
    /* Allocation failed. */
878
0
    *err = 1;
879
0
    return (NULL);
880
0
  }
881
1.86k
  p->swapped = swapped;
882
1.86k
  ps = p->priv;
883
884
  /*
885
   * What precision does the user want?
886
   */
887
1.86k
  switch (precision) {
888
889
1.86k
  case PCAP_TSTAMP_PRECISION_MICRO:
890
1.86k
    ps->user_tsresol = 1000000;
891
1.86k
    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.86k
  }
904
905
1.86k
  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.86k
  p->bufsize = 2048;
924
1.86k
  if (p->bufsize < total_length)
925
86
    p->bufsize = total_length;
926
1.86k
  p->buffer = malloc(p->bufsize);
927
1.86k
  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.86k
  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.86k
  bhdrp = (struct block_header *)p->buffer;
940
1.86k
  shbp = (struct section_header_block *)((u_char *)p->buffer + sizeof(struct block_header));
941
1.86k
  bhdrp->block_type = magic_int;
942
1.86k
  bhdrp->total_length = total_length;
943
1.86k
  shbp->byte_order_magic = byte_order_magic;
944
1.86k
  if (read_bytes(fp,
945
1.86k
      (u_char *)p->buffer + (sizeof(magic_int) + sizeof(total_length) + sizeof(byte_order_magic)),
946
1.86k
      total_length - (sizeof(magic_int) + sizeof(total_length) + sizeof(byte_order_magic)),
947
1.86k
      1, errbuf) == -1)
948
103
    goto fail;
949
950
1.76k
  if (p->swapped) {
951
    /*
952
     * Byte-swap the fields we've read.
953
     */
954
515
    shbp->major_version = SWAPSHORT(shbp->major_version);
955
515
    shbp->minor_version = SWAPSHORT(shbp->minor_version);
956
957
    /*
958
     * XXX - we don't care about the section length.
959
     */
960
515
  }
961
  /* currently only SHB version 1.0 is supported */
962
1.76k
  if (! (shbp->major_version == PCAP_NG_VERSION_MAJOR &&
963
1.74k
         shbp->minor_version == PCAP_NG_VERSION_MINOR)) {
964
52
    pcap_snprintf(errbuf, PCAP_ERRBUF_SIZE,
965
52
        "unsupported pcapng savefile version %u.%u",
966
52
        shbp->major_version, shbp->minor_version);
967
52
    goto fail;
968
52
  }
969
1.71k
  p->version_major = shbp->major_version;
970
1.71k
  p->version_minor = shbp->minor_version;
971
972
  /*
973
   * Save the time stamp resolution the user requested.
974
   */
975
1.71k
  p->opt.tstamp_precision = precision;
976
977
  /*
978
   * Now start looking for an Interface Description Block.
979
   */
980
3.40k
  for (;;) {
981
    /*
982
     * Read the next block.
983
     */
984
3.40k
    status = read_block(fp, p, &cursor, errbuf);
985
3.40k
    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.38k
    if (status == -1)
992
333
      goto fail;  /* error */
993
3.04k
    switch (cursor.block_type) {
994
995
1.35k
    case BT_IDB:
996
      /*
997
       * Get a pointer to the fixed-length portion of the
998
       * IDB.
999
       */
1000
1.35k
      idbp = get_from_block_data(&cursor, sizeof(*idbp),
1001
1.35k
          errbuf);
1002
1.35k
      if (idbp == NULL)
1003
3
        goto fail;  /* error */
1004
1005
      /*
1006
       * Byte-swap it if necessary.
1007
       */
1008
1.34k
      if (p->swapped) {
1009
362
        idbp->linktype = SWAPSHORT(idbp->linktype);
1010
362
        idbp->snaplen = SWAPLONG(idbp->snaplen);
1011
362
      }
1012
1013
      /*
1014
       * Try to add this interface.
1015
       */
1016
1.34k
      if (!add_interface(p, &cursor, errbuf))
1017
55
        goto fail;
1018
1019
1.29k
      goto done;
1020
1021
1.29k
    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.69k
    default:
1034
      /*
1035
       * Just ignore it.
1036
       */
1037
1.69k
      break;
1038
3.04k
    }
1039
3.04k
  }
1040
1041
1.29k
done:
1042
1.29k
  p->tzoff = 0; /* XXX - not used in pcap */
1043
1.29k
  p->linktype = linktype_to_dlt(idbp->linktype);
1044
1.29k
  p->snapshot = pcap_adjust_snapshot(p->linktype, idbp->snaplen);
1045
1.29k
  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.29k
  if (MAX_BLOCKSIZE_FOR_SNAPLEN(max_snaplen_for_dlt(p->linktype)) > ps->max_blocksize)
1053
12
    ps->max_blocksize = MAX_BLOCKSIZE_FOR_SNAPLEN(max_snaplen_for_dlt(p->linktype));
1054
1055
1.29k
  p->next_packet_op = pcap_ng_next_packet;
1056
1.29k
  p->cleanup_op = pcap_ng_cleanup;
1057
1058
1.29k
  return (p);
1059
1060
575
fail:
1061
575
  free(ps->ifaces);
1062
575
  free(p->buffer);
1063
575
  free(p);
1064
575
  *err = 1;
1065
575
  return (NULL);
1066
1.71k
}
1067
1068
static void
1069
pcap_ng_cleanup(pcap_t *p)
1070
1.29k
{
1071
1.29k
  struct pcap_ng_sf *ps = p->priv;
1072
1073
1.29k
  free(ps->ifaces);
1074
1.29k
  sf_cleanup(p);
1075
1.29k
}
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.05k
{
1085
5.05k
  struct pcap_ng_sf *ps = p->priv;
1086
5.05k
  struct block_cursor cursor;
1087
5.05k
  int status;
1088
5.05k
  struct enhanced_packet_block *epbp;
1089
5.05k
  struct simple_packet_block *spbp;
1090
5.05k
  struct packet_block *pbp;
1091
5.05k
  bpf_u_int32 interface_id = 0xFFFFFFFF;
1092
5.05k
  struct interface_description_block *idbp;
1093
5.05k
  struct section_header_block *shbp;
1094
5.05k
  FILE *fp = p->rfile;
1095
5.05k
  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
126k
  for (;;) {
1102
    /*
1103
     * Read the block type and length; those are common
1104
     * to all blocks.
1105
     */
1106
126k
    status = read_block(fp, p, &cursor, p->errbuf);
1107
126k
    if (status == 0)
1108
461
      return (1);  /* EOF */
1109
126k
    if (status == -1)
1110
263
      return (-1);  /* error */
1111
126k
    switch (cursor.block_type) {
1112
1113
738
    case BT_EPB:
1114
      /*
1115
       * Get a pointer to the fixed-length portion of the
1116
       * EPB.
1117
       */
1118
738
      epbp = get_from_block_data(&cursor, sizeof(*epbp),
1119
738
          p->errbuf);
1120
738
      if (epbp == NULL)
1121
2
        return (-1);  /* error */
1122
1123
      /*
1124
       * Byte-swap it if necessary.
1125
       */
1126
736
      if (p->swapped) {
1127
        /* these were written in opposite byte order */
1128
186
        interface_id = SWAPLONG(epbp->interface_id);
1129
186
        hdr->caplen = SWAPLONG(epbp->caplen);
1130
186
        hdr->len = SWAPLONG(epbp->len);
1131
186
        t = ((uint64_t)SWAPLONG(epbp->timestamp_high)) << 32 |
1132
186
            SWAPLONG(epbp->timestamp_low);
1133
550
      } else {
1134
550
        interface_id = epbp->interface_id;
1135
550
        hdr->caplen = epbp->caplen;
1136
550
        hdr->len = epbp->len;
1137
550
        t = ((uint64_t)epbp->timestamp_high) << 32 |
1138
550
            epbp->timestamp_low;
1139
550
      }
1140
736
      goto found;
1141
1142
2.51k
    case BT_SPB:
1143
      /*
1144
       * Get a pointer to the fixed-length portion of the
1145
       * SPB.
1146
       */
1147
2.51k
      spbp = get_from_block_data(&cursor, sizeof(*spbp),
1148
2.51k
          p->errbuf);
1149
2.51k
      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.51k
      interface_id = 0;
1157
1158
      /*
1159
       * Byte-swap it if necessary.
1160
       */
1161
2.51k
      if (p->swapped) {
1162
        /* these were written in opposite byte order */
1163
488
        hdr->len = SWAPLONG(spbp->len);
1164
488
      } else
1165
2.02k
        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.51k
      hdr->caplen = hdr->len;
1173
2.51k
      if (hdr->caplen > (bpf_u_int32)p->snapshot)
1174
923
        hdr->caplen = p->snapshot;
1175
2.51k
      t = 0;  /* no time stamps */
1176
2.51k
      goto found;
1177
1178
742
    case BT_PB:
1179
      /*
1180
       * Get a pointer to the fixed-length portion of the
1181
       * PB.
1182
       */
1183
742
      pbp = get_from_block_data(&cursor, sizeof(*pbp),
1184
742
          p->errbuf);
1185
742
      if (pbp == NULL)
1186
2
        return (-1);  /* error */
1187
1188
      /*
1189
       * Byte-swap it if necessary.
1190
       */
1191
740
      if (p->swapped) {
1192
        /* these were written in opposite byte order */
1193
412
        interface_id = SWAPSHORT(pbp->interface_id);
1194
412
        hdr->caplen = SWAPLONG(pbp->caplen);
1195
412
        hdr->len = SWAPLONG(pbp->len);
1196
412
        t = ((uint64_t)SWAPLONG(pbp->timestamp_high)) << 32 |
1197
412
            SWAPLONG(pbp->timestamp_low);
1198
412
      } else {
1199
328
        interface_id = pbp->interface_id;
1200
328
        hdr->caplen = pbp->caplen;
1201
328
        hdr->len = pbp->len;
1202
328
        t = ((uint64_t)pbp->timestamp_high) << 32 |
1203
328
            pbp->timestamp_low;
1204
328
      }
1205
740
      goto found;
1206
1207
120k
    case BT_IDB:
1208
      /*
1209
       * Interface Description Block.  Get a pointer
1210
       * to its fixed-length portion.
1211
       */
1212
120k
      idbp = get_from_block_data(&cursor, sizeof(*idbp),
1213
120k
          p->errbuf);
1214
120k
      if (idbp == NULL)
1215
2
        return (-1);  /* error */
1216
1217
      /*
1218
       * Byte-swap it if necessary.
1219
       */
1220
120k
      if (p->swapped) {
1221
1.67k
        idbp->linktype = SWAPSHORT(idbp->linktype);
1222
1.67k
        idbp->snaplen = SWAPLONG(idbp->snaplen);
1223
1.67k
      }
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
120k
      if (p->linktype != idbp->linktype) {
1234
34
        pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1235
34
            "an interface has a type %u different from the type of the first interface",
1236
34
            idbp->linktype);
1237
34
        return (-1);
1238
34
      }
1239
1240
      /*
1241
       * Check against the *adjusted* value of this IDB's
1242
       * snapshot length.
1243
       */
1244
120k
      if ((bpf_u_int32)p->snapshot !=
1245
120k
          pcap_adjust_snapshot(p->linktype, idbp->snaplen)) {
1246
59
        pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1247
59
            "an interface has a snapshot length %u different from the type of the first interface",
1248
59
            idbp->snaplen);
1249
59
        return (-1);
1250
59
      }
1251
1252
      /*
1253
       * Try to add this interface.
1254
       */
1255
120k
      if (!add_interface(p, &cursor, p->errbuf))
1256
15
        return (-1);
1257
120k
      break;
1258
1259
120k
    case BT_SHB:
1260
      /*
1261
       * Section Header Block.  Get a pointer
1262
       * to its fixed-length portion.
1263
       */
1264
1.04k
      shbp = get_from_block_data(&cursor, sizeof(*shbp),
1265
1.04k
          p->errbuf);
1266
1.04k
      if (shbp == NULL)
1267
2
        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
1.04k
      if (p->swapped) {
1275
477
        shbp->byte_order_magic =
1276
477
            SWAPLONG(shbp->byte_order_magic);
1277
477
        shbp->major_version =
1278
477
            SWAPSHORT(shbp->major_version);
1279
477
      }
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
1.04k
      switch (shbp->byte_order_magic) {
1287
1288
832
      case BYTE_ORDER_MAGIC:
1289
        /*
1290
         * OK.
1291
         */
1292
832
        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
213
      default:
1303
        /*
1304
         * Not a valid SHB.
1305
         */
1306
213
        pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1307
213
            "the file has a section with a bad byte order magic field");
1308
213
        return (-1);
1309
1.04k
      }
1310
1311
      /*
1312
       * Make sure the major version is the version
1313
       * we handle.
1314
       */
1315
832
      if (shbp->major_version != PCAP_NG_VERSION_MAJOR) {
1316
3
        pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1317
3
            "unknown pcapng savefile major version number %u",
1318
3
            shbp->major_version);
1319
3
        return (-1);
1320
3
      }
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
829
      ps->ifcount = 0;
1332
829
      break;
1333
1334
838
    default:
1335
      /*
1336
       * Not a packet block, IDB, or SHB; ignore it.
1337
       */
1338
838
      break;
1339
126k
    }
1340
126k
  }
1341
1342
3.99k
found:
1343
  /*
1344
   * Is the interface ID an interface we know?
1345
   */
1346
3.99k
  if (interface_id >= ps->ifcount) {
1347
    /*
1348
     * Yes.  Fail.
1349
     */
1350
92
    pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1351
92
        "a packet arrived on interface %u, but there's no Interface Description Block for that interface",
1352
92
        interface_id);
1353
92
    return (-1);
1354
92
  }
1355
1356
3.89k
  if (hdr->caplen > (bpf_u_int32)p->snapshot) {
1357
55
    pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
1358
55
        "invalid packet capture length %u, bigger than "
1359
55
        "snaplen of %d", hdr->caplen, p->snapshot);
1360
55
    return (-1);
1361
55
  }
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
3.84k
  sec = t / ps->ifaces[interface_id].tsresol + ps->ifaces[interface_id].tsoffset;
1368
3.84k
  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
3.84k
  switch (ps->ifaces[interface_id].scale_type) {
1375
1376
1.84k
  case PASS_THROUGH:
1377
    /*
1378
     * The interface resolution is what the user wants,
1379
     * so we're done.
1380
     */
1381
1.84k
    break;
1382
1383
424
  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
424
    frac *= ps->ifaces[interface_id].scale_factor;
1398
424
    break;
1399
1400
408
  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
408
    frac *= ps->user_tsresol;
1421
408
    frac /= ps->ifaces[interface_id].tsresol;
1422
408
    break;
1423
1424
546
  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
546
    frac /= ps->ifaces[interface_id].scale_factor;
1441
546
    break;
1442
1443
1444
618
  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
618
    frac *= ps->user_tsresol;
1468
618
    frac /= ps->ifaces[interface_id].tsresol;
1469
618
    break;
1470
3.84k
  }
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
3.84k
  hdr->ts.tv_sec = (time_t)sec;
1486
3.84k
  hdr->ts.tv_usec = (int)frac;
1487
3.84k
#endif
1488
1489
  /*
1490
   * Get a pointer to the packet data.
1491
   */
1492
3.84k
  *data = get_from_block_data(&cursor, hdr->caplen, p->errbuf);
1493
3.84k
  if (*data == NULL)
1494
79
    return (-1);
1495
1496
3.76k
  if (p->swapped)
1497
986
    swap_pseudo_headers(p->linktype, hdr, *data);
1498
1499
3.76k
  return (0);
1500
3.84k
}