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