pcapng: process uint32 options like uint64 options.

Move the extraction of the option value from the option content from the
callers of pcapng_process_uint32_option() to
pcapng_process_uint32_option() itself.
This commit is contained in:
Guy Harris 2021-08-27 01:28:46 -07:00
parent 0e3782831a
commit 4b7bfe35c5
2 changed files with 56 additions and 23 deletions

View File

@ -519,16 +519,58 @@ pcapng_process_uint8_option(wtapng_block_t *wblock,
void
pcapng_process_uint32_option(wtapng_block_t *wblock,
guint16 option_code, guint16 option_length,
guint32 option_content)
const section_info_t *section_info,
pcapng_opt_byte_order_e byte_order,
guint16 option_code, guint16 option_length,
const guint8 *option_content)
{
guint32 uint32;
if (option_length == 4) {
/* Don't cast a guint8 * into a guint32 *--the
* guint8 * may not point to something that's
* aligned correctly.
*
* XXX - options are aligned on 32-bit boundaries, so, while
* it may be true that 64-bit options aren't guaranteed to be
* aligned on 64-bit bounaries, it shouldn't be true that 32-bit
* options aren't guaranteed to be aligned on 32-bit boundaries.
*/
memcpy(&uint32, option_content, sizeof(guint32));
switch (byte_order) {
case OPT_SECTION_BYTE_ORDER:
if (section_info->byte_swapped) {
uint32 = GUINT32_SWAP_LE_BE(uint32);
}
break;
case OPT_BIG_ENDIAN:
uint32 = GUINT32_FROM_BE(uint32);
break;
case OPT_LITTLE_ENDIAN:
uint32 = GUINT32_FROM_LE(uint32);
break;
default:
/*
* This should not happen - this is called by pcapng_process_options(),
* which returns an error for an invalid byte_order argument, and
* otherwise passes the known-to-be-valid byte_order argument to
* us.
*
* Just ignore the option.
*/
return;
}
/*
* If this option can appear only once in a block, this call
* will fail on the second and later occurrences of the option;
* we silently ignore the failure.
*/
wtap_block_add_uint32_option(wblock->block, option_code, option_content);
wtap_block_add_uint32_option(wblock->block, option_code, uint32);
}
}
@ -1597,7 +1639,6 @@ pcapng_process_packet_block_option(wtapng_block_t *wblock,
const guint8 *option_content,
int *err, gchar **err_info)
{
guint32 tmp32;
guint64 tmp64;
/*
@ -1626,15 +1667,10 @@ pcapng_process_packet_block_option(wtapng_block_t *wblock,
/* XXX - free anything? */
return FALSE;
}
/* Don't cast a guint8 * into a guint32 *--the
* guint8 * may not point to something that's
* aligned correctly.
*/
memcpy(&tmp32, option_content, sizeof(guint32));
if (section_info->byte_swapped)
tmp32 = GUINT32_SWAP_LE_BE(tmp32);
pcapng_process_uint32_option(wblock, option_code, option_length, tmp32);
ws_debug("pack_flags 0x%08x", tmp32);
pcapng_process_uint32_option(wblock, section_info,
OPT_SECTION_BYTE_ORDER,
option_code, option_length,
option_content);
break;
case(OPT_EPB_HASH):
ws_debug("epb_hash %u currently not handled - ignoring %u bytes",
@ -1674,15 +1710,10 @@ pcapng_process_packet_block_option(wtapng_block_t *wblock,
/* XXX - free anything? */
return FALSE;
}
/* Don't cast a guint8 * into a guint32 *--the
* guint8 * may not point to something that's
* aligned correctly.
*/
memcpy(&tmp32, option_content, sizeof(guint32));
if (section_info->byte_swapped)
tmp32 = GUINT32_SWAP_LE_BE(tmp32);
pcapng_process_uint32_option(wblock, option_code, option_length, tmp32);
ws_debug("queue %u", tmp32);
pcapng_process_uint32_option(wblock, section_info,
OPT_SECTION_BYTE_ORDER,
option_code, option_length,
option_content);
break;
case(OPT_EPB_VERDICT):
if (option_length < 1) {

View File

@ -156,8 +156,10 @@ void pcapng_process_uint8_option(wtapng_block_t *wblock,
WS_DLL_PUBLIC
void pcapng_process_uint32_option(wtapng_block_t *wblock,
const section_info_t *section_info,
pcapng_opt_byte_order_e byte_order,
guint16 option_code, guint16 option_length,
guint32 option_content);
const guint8 *option_content);
WS_DLL_PUBLIC
void pcapng_process_timestamp_option(wtapng_block_t *wblock,