wiretap: have the "for each option" routine return a success/fail indication.

Have the routine it calls return a Boolean value, with "true" meaning
"keep going" and "false" meaning "stop iterating and return a failure
indication".  If the callback routine never returns "false", the routine
returns "true" as a success indication.
This commit is contained in:
Guy Harris 2021-06-27 13:25:16 -07:00
parent 695b4c5bee
commit c1082bd99e
4 changed files with 72 additions and 105 deletions

View File

@ -994,7 +994,7 @@ static void erf_dump_priv_init_gen_time(erf_dump_t *dump_priv) {
} }
static void erf_write_wtap_option_to_capture_tag(wtap_block_t block _U_, static gboolean erf_write_wtap_option_to_capture_tag(wtap_block_t block _U_,
guint option_id, guint option_id,
wtap_opttype_e option_type _U_, wtap_opttype_e option_type _U_,
wtap_optval_t *optval, wtap_optval_t *optval,
@ -1024,9 +1024,11 @@ static void erf_write_wtap_option_to_capture_tag(wtap_block_t block _U_,
if (tag_ptr) if (tag_ptr)
g_ptr_array_add(section_ptr->tags, tag_ptr); g_ptr_array_add(section_ptr->tags, tag_ptr);
return TRUE; /* we always succeed */
} }
static void erf_write_wtap_option_to_host_tag(wtap_block_t block _U_, static gboolean erf_write_wtap_option_to_host_tag(wtap_block_t block _U_,
guint option_id, guint option_id,
wtap_opttype_e option_type _U_, wtap_opttype_e option_type _U_,
wtap_optval_t *optval, wtap_optval_t *optval,
@ -1056,9 +1058,11 @@ static void erf_write_wtap_option_to_host_tag(wtap_block_t block _U_,
if (tag_ptr) if (tag_ptr)
g_ptr_array_add(section_ptr->tags, tag_ptr); g_ptr_array_add(section_ptr->tags, tag_ptr);
return TRUE; /* we always succeed */
} }
static void erf_write_wtap_option_to_interface_tag(wtap_block_t block _U_, static gboolean erf_write_wtap_option_to_interface_tag(wtap_block_t block _U_,
guint option_id, guint option_id,
wtap_opttype_e option_type _U_, wtap_opttype_e option_type _U_,
wtap_optval_t *optval, wtap_optval_t *optval,
@ -1164,6 +1168,7 @@ static void erf_write_wtap_option_to_interface_tag(wtap_block_t block _U_,
if (tag_ptr) if (tag_ptr)
g_ptr_array_add(section_ptr->tags, tag_ptr); g_ptr_array_add(section_ptr->tags, tag_ptr);
return TRUE; /* we always succeed */
} }
static void erf_populate_section_length_by_tags(struct erf_meta_section *section_ptr) { static void erf_populate_section_length_by_tags(struct erf_meta_section *section_ptr) {

View File

@ -3573,7 +3573,7 @@ static guint32 pcapng_compute_custom_option_size(size_t custom_data_len)
return (guint32)size; return (guint32)size;
} }
static void compute_shb_option_size(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t* optval, void* user_data) static gboolean compute_shb_option_size(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t* optval, void* user_data)
{ {
pcapng_block_size_t* block_size = (pcapng_block_size_t*)user_data; pcapng_block_size_t* block_size = (pcapng_block_size_t*)user_data;
guint32 size = 0; guint32 size = 0;
@ -3605,13 +3605,13 @@ static void compute_shb_option_size(wtap_block_t block _U_, guint option_id, wta
} }
block_size->size += 4; block_size->size += 4;
} }
return TRUE; /* we always succeed */
} }
typedef struct pcapng_write_block_t typedef struct pcapng_write_block_t
{ {
wtap_dumper *wdh; wtap_dumper *wdh;
int *err; int *err;
gboolean success;
} }
pcapng_write_block_t; pcapng_write_block_t;
@ -3667,7 +3667,6 @@ static gboolean pcapng_write_custom_option(wtap_dumper *wdh, guint option_id, cu
return TRUE; return TRUE;
} }
static gboolean pcapng_write_option_eofopt(wtap_dumper *wdh, int *err) static gboolean pcapng_write_option_eofopt(wtap_dumper *wdh, int *err)
{ {
struct pcapng_option_header option_hdr; struct pcapng_option_header option_hdr;
@ -3790,36 +3789,29 @@ static gboolean pcapng_write_option_uint64(wtap_dumper *wdh, guint option_id, gu
return TRUE; return TRUE;
} }
static void write_wtap_shb_option(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t *optval, void* user_data) static gboolean write_wtap_shb_option(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t *optval, void* user_data)
{ {
pcapng_write_block_t* write_block = (pcapng_write_block_t*)user_data; pcapng_write_block_t* write_block = (pcapng_write_block_t*)user_data;
/* Don't continue if there has been an error */
if (!write_block->success)
return;
switch(option_id) switch(option_id)
{ {
case OPT_COMMENT: case OPT_COMMENT:
case OPT_SHB_HARDWARE: case OPT_SHB_HARDWARE:
case OPT_SHB_OS: case OPT_SHB_OS:
case OPT_SHB_USERAPPL: case OPT_SHB_USERAPPL:
if (!pcapng_write_option_string(write_block->wdh, option_id, optval->stringval, write_block->err)) { if (!pcapng_write_option_string(write_block->wdh, option_id, optval->stringval, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
break; break;
case OPT_CUSTOM_STR_COPY: case OPT_CUSTOM_STR_COPY:
case OPT_CUSTOM_BIN_COPY: case OPT_CUSTOM_BIN_COPY:
if (!pcapng_write_custom_option(write_block->wdh, option_id, &optval->custom_opt, write_block->err)) { if (!pcapng_write_custom_option(write_block->wdh, option_id, &optval->custom_opt, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
break; break;
default: default:
/* Unknown options - write by datatype? */ /* Unknown options - write by datatype? */
break; break;
} }
return TRUE; /* success */
} }
/* Write a section header block. /* Write a section header block.
@ -3885,10 +3877,8 @@ pcapng_write_section_header_block(wtap_dumper *wdh, int *err)
/* Write options */ /* Write options */
block_data.wdh = wdh; block_data.wdh = wdh;
block_data.err = err; block_data.err = err;
block_data.success = TRUE; if (!wtap_block_foreach_option(wdh_shb, write_wtap_shb_option,
wtap_block_foreach_option(wdh_shb, write_wtap_shb_option, &block_data); &block_data))
if (!block_data.success)
return FALSE; return FALSE;
/* Write end of options */ /* Write end of options */
@ -4539,7 +4529,7 @@ pcapng_write_decryption_secrets_block(wtap_dumper *wdh, wtap_block_t sdata, int
#define NRES_BLOCK_MAX_SIZE (1024*1024) #define NRES_BLOCK_MAX_SIZE (1024*1024)
static void static gboolean
compute_nrb_option_size(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t* optval, void* user_data) compute_nrb_option_size(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t* optval, void* user_data)
{ {
pcapng_block_size_t* block_size = (pcapng_block_size_t*)user_data; pcapng_block_size_t* block_size = (pcapng_block_size_t*)user_data;
@ -4576,9 +4566,10 @@ compute_nrb_option_size(wtap_block_t block _U_, guint option_id, wtap_opttype_e
} }
block_size->size += 4; block_size->size += 4;
} }
return TRUE; /* we always succeed */
} }
static void static gboolean
put_nrb_option(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t* optval, void* user_data) put_nrb_option(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t* optval, void* user_data)
{ {
guint8 **opt_ptrp = (guint8 **)user_data; guint8 **opt_ptrp = (guint8 **)user_data;
@ -4661,6 +4652,7 @@ put_nrb_option(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_ty
/* Unknown options - size by datatype? */ /* Unknown options - size by datatype? */
break; break;
} }
return TRUE; /* we always succeed */
} }
static void static void
@ -4952,7 +4944,7 @@ pcapng_write_name_resolution_block(wtap_dumper *wdh, int *err)
return TRUE; return TRUE;
} }
static void compute_isb_option_size(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t *optval, void* user_data) static gboolean compute_isb_option_size(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t *optval, void* user_data)
{ {
pcapng_block_size_t* block_size = (pcapng_block_size_t*)user_data; pcapng_block_size_t* block_size = (pcapng_block_size_t*)user_data;
guint32 size = 0; guint32 size = 0;
@ -4992,52 +4984,42 @@ static void compute_isb_option_size(wtap_block_t block _U_, guint option_id, wta
} }
block_size->size += 4; block_size->size += 4;
} }
return TRUE; /* we always succeed */
} }
static void write_wtap_isb_option(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t *optval, void* user_data) static gboolean write_wtap_isb_option(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t *optval, void* user_data)
{ {
pcapng_write_block_t* write_block = (pcapng_write_block_t*)user_data; pcapng_write_block_t* write_block = (pcapng_write_block_t*)user_data;
/* Don't continue if there has been an error */
if (!write_block->success)
return;
switch(option_id) switch(option_id)
{ {
case OPT_COMMENT: case OPT_COMMENT:
if (!pcapng_write_option_string(write_block->wdh, option_id, optval->stringval, write_block->err)) { if (!pcapng_write_option_string(write_block->wdh, option_id, optval->stringval, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
break; break;
case OPT_CUSTOM_STR_COPY: case OPT_CUSTOM_STR_COPY:
case OPT_CUSTOM_BIN_COPY: case OPT_CUSTOM_BIN_COPY:
if (!pcapng_write_custom_option(write_block->wdh, option_id, &optval->custom_opt, write_block->err)) { if (!pcapng_write_custom_option(write_block->wdh, option_id, &optval->custom_opt, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
break; break;
case OPT_ISB_STARTTIME: case OPT_ISB_STARTTIME:
case OPT_ISB_ENDTIME: case OPT_ISB_ENDTIME:
if (!pcapng_write_option_timestamp(write_block->wdh, option_id, optval->uint64val, write_block->err)) { if (!pcapng_write_option_timestamp(write_block->wdh, option_id, optval->uint64val, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
break; break;
case OPT_ISB_IFRECV: case OPT_ISB_IFRECV:
case OPT_ISB_IFDROP: case OPT_ISB_IFDROP:
case OPT_ISB_FILTERACCEPT: case OPT_ISB_FILTERACCEPT:
case OPT_ISB_OSDROP: case OPT_ISB_OSDROP:
case OPT_ISB_USRDELIV: case OPT_ISB_USRDELIV:
if (!pcapng_write_option_uint64(write_block->wdh, option_id, optval->uint64val, write_block->err)) { if (!pcapng_write_option_uint64(write_block->wdh, option_id, optval->uint64val, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
break; break;
default: default:
/* Unknown options - write by datatype? */ /* Unknown options - write by datatype? */
break; break;
} }
return TRUE; /* success */
} }
static gboolean static gboolean
@ -5082,10 +5064,8 @@ pcapng_write_interface_statistics_block(wtap_dumper *wdh, wtap_block_t if_stats,
if (block_size.size > 0) { if (block_size.size > 0) {
block_data.wdh = wdh; block_data.wdh = wdh;
block_data.err = err; block_data.err = err;
block_data.success = TRUE; if (!wtap_block_foreach_option(if_stats, write_wtap_isb_option,
wtap_block_foreach_option(if_stats, write_wtap_isb_option, &block_data); &block_data))
if (!block_data.success)
return FALSE; return FALSE;
/* Write end of options */ /* Write end of options */
@ -5101,7 +5081,7 @@ pcapng_write_interface_statistics_block(wtap_dumper *wdh, wtap_block_t if_stats,
return TRUE; return TRUE;
} }
static void compute_idb_option_size(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t *optval, void* user_data) static gboolean compute_idb_option_size(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t *optval, void* user_data)
{ {
pcapng_block_size_t* block_size = (pcapng_block_size_t*)user_data; pcapng_block_size_t* block_size = (pcapng_block_size_t*)user_data;
guint32 size = 0; guint32 size = 0;
@ -5163,9 +5143,10 @@ static void compute_idb_option_size(wtap_block_t block _U_, guint option_id, wta
} }
block_size->size += 4; block_size->size += 4;
} }
return TRUE; /* we always succeed */
} }
static void write_wtap_idb_option(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t *optval, void* user_data) static gboolean write_wtap_idb_option(wtap_block_t block _U_, guint option_id, wtap_opttype_e option_type _U_, wtap_optval_t *optval, void* user_data)
{ {
pcapng_write_block_t* write_block = (pcapng_write_block_t*)user_data; pcapng_write_block_t* write_block = (pcapng_write_block_t*)user_data;
struct pcapng_option_header option_hdr; struct pcapng_option_header option_hdr;
@ -5178,29 +5159,21 @@ static void write_wtap_idb_option(wtap_block_t block _U_, guint option_id, wtap_
case OPT_IDB_DESCR: case OPT_IDB_DESCR:
case OPT_IDB_OS: case OPT_IDB_OS:
case OPT_IDB_HARDWARE: case OPT_IDB_HARDWARE:
if (!pcapng_write_option_string(write_block->wdh, option_id, optval->stringval, write_block->err)) { if (!pcapng_write_option_string(write_block->wdh, option_id, optval->stringval, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
break; break;
case OPT_CUSTOM_STR_COPY: case OPT_CUSTOM_STR_COPY:
case OPT_CUSTOM_BIN_COPY: case OPT_CUSTOM_BIN_COPY:
if (!pcapng_write_custom_option(write_block->wdh, option_id, &optval->custom_opt, write_block->err)) { if (!pcapng_write_custom_option(write_block->wdh, option_id, &optval->custom_opt, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
break; break;
case OPT_IDB_SPEED: case OPT_IDB_SPEED:
if (!pcapng_write_option_uint64(write_block->wdh, option_id, optval->uint64val, write_block->err)) { if (!pcapng_write_option_uint64(write_block->wdh, option_id, optval->uint64val, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
break; break;
case OPT_IDB_TSRESOL: case OPT_IDB_TSRESOL:
if (!pcapng_write_option_uint8(write_block->wdh, option_id, optval->uint8val, write_block->err)) { if (!pcapng_write_option_uint8(write_block->wdh, option_id, optval->uint8val, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
break; break;
case OPT_IDB_FILTER: case OPT_IDB_FILTER:
{ {
@ -5220,7 +5193,7 @@ static void write_wtap_idb_option(wtap_block_t block _U_, guint option_id, wtap_
* *
* XXX - truncate it? Report an error? * XXX - truncate it? Report an error?
*/ */
return; return TRUE;
} }
break; break;
@ -5235,13 +5208,13 @@ static void write_wtap_idb_option(wtap_block_t block _U_, guint option_id, wtap_
* *
* XXX - truncate it? Report an error? * XXX - truncate it? Report an error?
*/ */
return; return TRUE;
} }
break; break;
default: default:
/* Unknown filter type; don't write anything. */ /* Unknown filter type; don't write anything. */
return; return TRUE;
} }
size = (guint32)(filter_data_len + 1); size = (guint32)(filter_data_len + 1);
if ((size % 4)) { if ((size % 4)) {
@ -5252,63 +5225,52 @@ static void write_wtap_idb_option(wtap_block_t block _U_, guint option_id, wtap_
option_hdr.type = option_id; option_hdr.type = option_id;
option_hdr.value_length = size; option_hdr.value_length = size;
if (!wtap_dump_file_write(write_block->wdh, &option_hdr, 4, write_block->err)) { if (!wtap_dump_file_write(write_block->wdh, &option_hdr, 4, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
write_block->wdh->bytes_dumped += 4; write_block->wdh->bytes_dumped += 4;
/* Write the filter type */ /* Write the filter type */
if (!wtap_dump_file_write(write_block->wdh, &filter_type, 1, write_block->err)) { if (!wtap_dump_file_write(write_block->wdh, &filter_type, 1, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
write_block->wdh->bytes_dumped += 1; write_block->wdh->bytes_dumped += 1;
switch (filter->type) { switch (filter->type) {
case if_filter_pcap: case if_filter_pcap:
/* Write the filter string */ /* Write the filter string */
if (!wtap_dump_file_write(write_block->wdh, filter->data.filter_str, filter_data_len, write_block->err)) { if (!wtap_dump_file_write(write_block->wdh, filter->data.filter_str, filter_data_len, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
write_block->wdh->bytes_dumped += filter_data_len; write_block->wdh->bytes_dumped += filter_data_len;
break; break;
case if_filter_bpf: case if_filter_bpf:
if (!wtap_dump_file_write(write_block->wdh, filter->data.bpf_prog.bpf_prog, filter_data_len, write_block->err)) { if (!wtap_dump_file_write(write_block->wdh, filter->data.bpf_prog.bpf_prog, filter_data_len, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
write_block->wdh->bytes_dumped += filter_data_len; write_block->wdh->bytes_dumped += filter_data_len;
break; break;
default: default:
ws_assert_not_reached(); ws_assert_not_reached();
return; return TRUE;
} }
/* write padding (if any) */ /* write padding (if any) */
if (pad != 0) { if (pad != 0) {
if (!wtap_dump_file_write(write_block->wdh, &zero_pad, pad, write_block->err)) { if (!wtap_dump_file_write(write_block->wdh, &zero_pad, pad, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
write_block->wdh->bytes_dumped += pad; write_block->wdh->bytes_dumped += pad;
} }
} }
break; break;
case OPT_IDB_FCSLEN: case OPT_IDB_FCSLEN:
if (!pcapng_write_option_uint8(write_block->wdh, option_id, optval->uint8val, write_block->err)) { if (!pcapng_write_option_uint8(write_block->wdh, option_id, optval->uint8val, write_block->err))
write_block->success = FALSE; return FALSE;
return;
}
break; break;
default: default:
/* Unknown options - size by datatype? */ /* Unknown options - size by datatype? */
break; break;
} }
return TRUE;
} }
static gboolean static gboolean
@ -5365,10 +5327,8 @@ pcapng_write_if_descr_block(wtap_dumper *wdh, wtap_block_t int_data, int *err)
/* Write options */ /* Write options */
block_data.wdh = wdh; block_data.wdh = wdh;
block_data.err = err; block_data.err = err;
block_data.success = TRUE; if (!wtap_block_foreach_option(int_data, write_wtap_idb_option,
wtap_block_foreach_option(int_data, write_wtap_idb_option, &block_data); &block_data))
if (!block_data.success)
return FALSE; return FALSE;
/* Write end of options */ /* Write end of options */

View File

@ -354,7 +354,7 @@ wtap_block_t wtap_block_make_copy(wtap_block_t block)
return block_copy; return block_copy;
} }
void wtap_block_foreach_option(wtap_block_t block, wtap_block_foreach_func func, void* user_data) gboolean wtap_block_foreach_option(wtap_block_t block, wtap_block_foreach_func func, void* user_data)
{ {
guint i; guint i;
wtap_option_t *opt; wtap_option_t *opt;
@ -363,8 +363,10 @@ void wtap_block_foreach_option(wtap_block_t block, wtap_block_foreach_func func,
for (i = 0; i < block->options->len; i++) { for (i = 0; i < block->options->len; i++) {
opt = &g_array_index(block->options, wtap_option_t, i); opt = &g_array_index(block->options, wtap_option_t, i);
opttype = GET_OPTION_TYPE(block->info->options, opt->option_id); opttype = GET_OPTION_TYPE(block->info->options, opt->option_id);
func(block, opt->option_id, opttype->data_type, &opt->value, user_data); if (!func(block, opt->option_id, opttype->data_type, &opt->value, user_data))
return FALSE;
} }
return TRUE;
} }
static wtap_opttype_return_val static wtap_opttype_return_val

View File

@ -693,8 +693,8 @@ WS_DLL_PUBLIC void wtap_block_copy(wtap_block_t dest_block, wtap_block_t src_blo
*/ */
WS_DLL_PUBLIC wtap_block_t wtap_block_make_copy(wtap_block_t block); WS_DLL_PUBLIC wtap_block_t wtap_block_make_copy(wtap_block_t block);
typedef void (*wtap_block_foreach_func)(wtap_block_t block, guint option_id, wtap_opttype_e option_type, wtap_optval_t *option, void *user_data); typedef gboolean (*wtap_block_foreach_func)(wtap_block_t block, guint option_id, wtap_opttype_e option_type, wtap_optval_t *option, void *user_data);
WS_DLL_PUBLIC void wtap_block_foreach_option(wtap_block_t block, wtap_block_foreach_func func, void* user_data); WS_DLL_PUBLIC gboolean wtap_block_foreach_option(wtap_block_t block, wtap_block_foreach_func func, void* user_data);
/** Cleanup the internal structures /** Cleanup the internal structures
*/ */