wiretap: add cleanup routine.

The cleanup routine has been added to exit section of the applications.
Those which required a exit restyle have been patched as well.

Change-Id: I3a8787f0718ac7fef00dc58176869c7510fda7b1
Reviewed-on: https://code.wireshark.org/review/19949
Petri-Dish: Dario Lombardo <lomato@gmail.com>
Reviewed-by: Peter Wu <peter@lekensteyn.nl>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Dario Lombardo <lomato@gmail.com>
This commit is contained in:
Dario Lombardo 2017-02-04 16:26:34 +01:00
parent ae0bdcc78c
commit 7c0c580c4b
27 changed files with 355 additions and 165 deletions

View File

@ -1709,6 +1709,7 @@ main(int argc, char *argv[])
exit:
g_free(hash_buf);
wtap_cleanup();
return overall_error_status;
}

View File

@ -124,8 +124,17 @@ capture_opts_init(capture_options *capture_opts)
void
capture_opts_cleanup(capture_options *capture_opts)
{
g_array_free(capture_opts->ifaces, TRUE);
g_array_free(capture_opts->all_ifaces, TRUE);
if (!capture_opts)
return;
if (capture_opts->ifaces) {
g_array_free(capture_opts->ifaces, TRUE);
capture_opts->ifaces = NULL;
}
if (capture_opts->all_ifaces) {
g_array_free(capture_opts->all_ifaces, TRUE);
capture_opts->all_ifaces = NULL;
}
}
/* log content of capture_opts */

View File

@ -216,6 +216,7 @@ main(int argc, char *argv[])
}
wtap_cleanup();
return overall_error_status;
}

View File

@ -107,10 +107,12 @@ libwiretap.so.0 libwiretap0 #MINVER#
wtap_get_savable_file_types_subtypes@Base 1.12.0~rc1
wtap_has_open_info@Base 1.12.0~rc1
wtap_init@Base 2.3.0
wtap_cleanup@Base 2.3.0
wtap_iscompressed@Base 1.9.1
wtap_open_offline@Base 1.9.1
wtap_opttype_register_custom_block_type@Base 2.1.2
wtap_opttypes_initialize@Base 2.1.2
wtap_opttypes_cleanup@Base 2.3.0
wtap_pcap_encap_to_wtap_encap@Base 1.9.1
wtap_phdr@Base 1.9.1
wtap_phdr_cleanup@Base 1.99.2

View File

@ -177,6 +177,7 @@ libwsutil.so.0 libwsutil0 #MINVER#
ws_buffer_free@Base 1.99.0
ws_buffer_init@Base 1.99.0
ws_buffer_remove_start@Base 1.99.0
ws_buffer_cleanup@Base 2.3.0
ws_hexstrtou16@Base 2.3.0
ws_hexstrtou32@Base 2.3.0
ws_hexstrtou64@Base 2.3.0

106
editcap.c
View File

@ -94,6 +94,9 @@
#include "ringbuffer.h" /* For RINGBUFFER_MAX_NUM_FILES */
#define INVALID_OPTION 1
#define INVALID_FILE 2
/*
* Some globals so we can pass things to various routines
*/
@ -338,7 +341,7 @@ selected(guint recno)
return 0;
}
static void
static gboolean
set_time_adjustment(char *optarg_str_p)
{
char *frac, *end;
@ -346,7 +349,7 @@ set_time_adjustment(char *optarg_str_p)
size_t frac_digits;
if (!optarg_str_p)
return;
return TRUE;
/* skip leading whitespace */
while (*optarg_str_p == ' ' || *optarg_str_p == '\t')
@ -368,12 +371,12 @@ set_time_adjustment(char *optarg_str_p)
|| val == LONG_MIN || val == LONG_MAX) {
fprintf(stderr, "editcap: \"%s\" isn't a valid time adjustment\n",
optarg_str_p);
exit(1);
return FALSE;
}
if (val < 0) { /* implies '--' since we caught '-' above */
fprintf(stderr, "editcap: \"%s\" isn't a valid time adjustment\n",
optarg_str_p);
exit(1);
return FALSE;
}
}
time_adj.tv.secs = val;
@ -390,10 +393,10 @@ set_time_adjustment(char *optarg_str_p)
|| val > ONE_BILLION || val == LONG_MIN || val == LONG_MAX) {
fprintf(stderr, "editcap: \"%s\" isn't a valid time adjustment\n",
optarg_str_p);
exit(1);
return FALSE;
}
} else {
return; /* no fractional digits */
return TRUE; /* no fractional digits */
}
/* adjust fractional portion from fractional to numerator
@ -405,9 +408,10 @@ set_time_adjustment(char *optarg_str_p)
}
time_adj.tv.nsecs = (int)val;
return TRUE;
}
static void
static gboolean
set_strict_time_adj(char *optarg_str_p)
{
char *frac, *end;
@ -415,7 +419,7 @@ set_strict_time_adj(char *optarg_str_p)
size_t frac_digits;
if (!optarg_str_p)
return;
return TRUE;
/* skip leading whitespace */
while (*optarg_str_p == ' ' || *optarg_str_p == '\t')
@ -441,12 +445,12 @@ set_strict_time_adj(char *optarg_str_p)
|| val == LONG_MIN || val == LONG_MAX) {
fprintf(stderr, "editcap: \"%s\" isn't a valid time adjustment\n",
optarg_str_p);
exit(1);
return FALSE;
}
if (val < 0) { /* implies '--' since we caught '-' above */
fprintf(stderr, "editcap: \"%s\" isn't a valid time adjustment\n",
optarg_str_p);
exit(1);
return FALSE;
}
}
strict_time_adj.tv.secs = val;
@ -463,10 +467,10 @@ set_strict_time_adj(char *optarg_str_p)
|| val > ONE_BILLION || val == LONG_MIN || val == LONG_MAX) {
fprintf(stderr, "editcap: \"%s\" isn't a valid time adjustment\n",
optarg_str_p);
exit(1);
return FALSE;
}
} else {
return; /* no fractional digits */
return TRUE; /* no fractional digits */
}
/* adjust fractional portion from fractional to numerator
@ -478,9 +482,10 @@ set_strict_time_adj(char *optarg_str_p)
}
strict_time_adj.tv.nsecs = (int)val;
return TRUE;
}
static void
static gboolean
set_rel_time(char *optarg_str_p)
{
char *frac, *end;
@ -488,7 +493,7 @@ set_rel_time(char *optarg_str_p)
size_t frac_digits;
if (!optarg_str_p)
return;
return TRUE;
/* skip leading whitespace */
while (*optarg_str_p == ' ' || *optarg_str_p == '\t')
@ -508,12 +513,12 @@ set_rel_time(char *optarg_str_p)
|| val == LONG_MIN || val == LONG_MAX) {
fprintf(stderr, "1: editcap: \"%s\" isn't a valid rel time value\n",
optarg_str_p);
exit(1);
return FALSE;
}
if (val < 0) { /* implies '--' since we caught '-' above */
fprintf(stderr, "2: editcap: \"%s\" isn't a valid rel time value\n",
optarg_str_p);
exit(1);
return FALSE;
}
}
relative_time_window.secs = val;
@ -530,10 +535,10 @@ set_rel_time(char *optarg_str_p)
|| val > ONE_BILLION || val == LONG_MIN || val == LONG_MAX) {
fprintf(stderr, "3: editcap: \"%s\" isn't a valid rel time value\n",
optarg_str_p);
exit(1);
return FALSE;
}
} else {
return; /* no fractional digits */
return TRUE; /* no fractional digits */
}
/* adjust fractional portion from fractional to numerator
@ -545,6 +550,7 @@ set_rel_time(char *optarg_str_p)
}
relative_time_window.nsecs = (int)val;
return TRUE;
}
#define LINUX_SLL_OFFSETP 14
@ -993,6 +999,7 @@ main(int argc, char *argv[])
GArray *shb_hdrs = NULL;
GArray *nrb_hdrs = NULL;
char *shb_user_appl;
int ret = EXIT_SUCCESS;
cmdarg_err_init(failure_message, failure_message_cont);
@ -1069,7 +1076,8 @@ main(int argc, char *argv[])
if ((sscanf(optarg, "%u:%n", &frame_number, &string_start_index) < 1) || (string_start_index == 0)) {
fprintf(stderr, "editcap: \"%s\" isn't a valid <frame>:<comment>\n\n",
optarg);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
/* Lazily create the table */
@ -1091,7 +1099,8 @@ main(int argc, char *argv[])
if (!strptime(optarg,"%Y-%m-%d %T", &starttm)) {
fprintf(stderr, "editcap: \"%s\" isn't a valid time format\n\n",
optarg);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
check_startstop = TRUE;
@ -1110,7 +1119,8 @@ main(int argc, char *argv[])
if (!strptime(optarg,"%Y-%m-%d %T", &stoptm)) {
fprintf(stderr, "editcap: \"%s\" isn't a valid time format\n\n",
optarg);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
check_startstop = TRUE;
stoptm.tm_isdst = -1;
@ -1138,7 +1148,8 @@ main(int argc, char *argv[])
default:
fprintf(stderr, "editcap: \"%s\" isn't a valid chop length or offset:length\n",
optarg);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
break;
}
@ -1171,7 +1182,8 @@ main(int argc, char *argv[])
if (dup_window > MAX_DUP_DEPTH) {
fprintf(stderr, "editcap: \"%d\" duplicate window value must be between 0 and %d inclusive.\n",
dup_window, MAX_DUP_DEPTH);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
break;
@ -1180,7 +1192,8 @@ main(int argc, char *argv[])
if (p == optarg || err_prob < 0.0 || err_prob > 1.0) {
fprintf(stderr, "editcap: probability \"%s\" must be between 0.0 and 1.0\n",
optarg);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
srand( (unsigned int) (time(NULL) + ws_getpid()) );
break;
@ -1191,7 +1204,8 @@ main(int argc, char *argv[])
fprintf(stderr, "editcap: \"%s\" isn't a valid capture file type\n\n",
optarg);
list_capture_types();
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
break;
@ -1201,7 +1215,7 @@ main(int argc, char *argv[])
"See https://www.wireshark.org for more information.\n",
get_ws_vcs_version_info());
print_usage(stdout);
exit(0);
goto clean_exit;
break;
case 'i': /* break capture file based on time interval */
@ -1229,12 +1243,18 @@ main(int argc, char *argv[])
break;
case 'S':
set_strict_time_adj(optarg);
if (!set_strict_time_adj(optarg)) {
ret = INVALID_OPTION;
goto clean_exit;
}
do_strict_time_adjustment = TRUE;
break;
case 't':
set_time_adjustment(optarg);
if (!set_time_adjustment(optarg)) {
ret = INVALID_OPTION;
goto clean_exit;
}
break;
case 'T':
@ -1243,7 +1263,8 @@ main(int argc, char *argv[])
fprintf(stderr, "editcap: \"%s\" isn't a valid encapsulation type\n\n",
optarg);
list_encap_types();
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
break;
@ -1257,14 +1278,17 @@ main(int argc, char *argv[])
show_version("Editcap (Wireshark)", comp_info_str, runtime_info_str);
g_string_free(comp_info_str, TRUE);
g_string_free(runtime_info_str, TRUE);
exit(0);
goto clean_exit;
break;
case 'w':
dup_detect = FALSE;
dup_detect_by_time = TRUE;
dup_window = MAX_DUP_DEPTH;
set_rel_time(optarg);
if (!set_rel_time(optarg)) {
ret = INVALID_OPTION;
goto clean_exit;
}
break;
case '?': /* Bad options if GNU getopt */
@ -1279,7 +1303,8 @@ main(int argc, char *argv[])
print_usage(stderr);
break;
}
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
break;
}
} /* processing commmand-line options */
@ -1290,7 +1315,8 @@ main(int argc, char *argv[])
if ((argc - optind) < 1) {
print_usage(stderr);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
if (check_startstop && !stoptime) {
@ -1309,13 +1335,15 @@ main(int argc, char *argv[])
if (starttime > stoptime) {
fprintf(stderr, "editcap: start time is after the stop time\n");
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
if (split_packet_count != 0 && secs_per_block != 0) {
fprintf(stderr, "editcap: can't split on both packet count and time interval\n");
fprintf(stderr, "editcap: at the same time\n");
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
wth = wtap_open_offline(argv[optind], WTAP_TYPE_AUTO, &read_err, &read_err_info, FALSE);
@ -1327,7 +1355,8 @@ main(int argc, char *argv[])
fprintf(stderr, "(%s)\n", read_err_info);
g_free(read_err_info);
}
exit(2);
ret = INVALID_FILE;
goto clean_exit;
}
if (verbose) {
@ -1867,8 +1896,9 @@ main(int argc, char *argv[])
wtap_block_array_free(nrb_hdrs);
g_free(idb_inf);
wtap_close(wth);
return 0;
clean_exit:
wtap_cleanup();
return ret;
error_on_exit:
wtap_block_array_free(shb_hdrs);

View File

@ -98,6 +98,9 @@ col_cleanup(column_info *cinfo)
int i;
col_item_t* col_item;
if (!cinfo)
return;
for (i = 0; i < cinfo->num_cols; i++) {
col_item = &cinfo->columns[i];
g_free(col_item->fmt_matx);

View File

@ -2785,7 +2785,7 @@ int main(int argc, char **argv) {
end:
/* clean up stuff */
extcap_base_cleanup(&extcap_conf);
wtap_cleanup();
return ret;
}

View File

@ -101,10 +101,22 @@ free_filter_entry(gpointer data)
void free_filter_lists(void)
{
if (capture_filters) {
g_list_free_full(capture_filters, free_filter_entry);
capture_filters = NULL;
}
if (display_filters) {
g_list_free_full(display_filters, free_filter_entry);
display_filters = NULL;
}
if (capture_edited_filters) {
g_list_free_full(capture_edited_filters, free_filter_entry);
capture_edited_filters = NULL;
}
if (display_edited_filters) {
g_list_free_full(display_edited_filters, free_filter_entry);
display_edited_filters = NULL;
}
}
static GList *

View File

@ -262,7 +262,7 @@ main(int argc, char *argv[])
gchar *err_info = NULL;
int err_fileno;
char *out_filename = NULL;
merge_result status;
merge_result status = MERGE_OK;
idb_merge_mode mode = IDB_MERGE_MODE_MAX;
gboolean use_stdout = FALSE;
merge_progress_callback_t cb;
@ -338,7 +338,8 @@ main(int argc, char *argv[])
fprintf(stderr, "mergecap: \"%s\" isn't a valid capture file type\n",
optarg);
list_capture_types();
exit(1);
status = MERGE_ERR_INVALID_OPTION;
goto clean_exit;
}
break;
@ -348,7 +349,7 @@ main(int argc, char *argv[])
"See https://www.wireshark.org for more information.\n",
get_ws_vcs_version_info());
print_usage(stdout);
exit(0);
goto clean_exit;
break;
case 'I':
@ -357,7 +358,8 @@ main(int argc, char *argv[])
fprintf(stderr, "mergecap: \"%s\" isn't a valid IDB merge mode\n",
optarg);
list_idb_merge_modes();
exit(1);
status = MERGE_ERR_INVALID_OPTION;
goto clean_exit;
}
break;
@ -375,7 +377,7 @@ main(int argc, char *argv[])
show_version("Mergecap (Wireshark)", comp_info_str, runtime_info_str);
g_string_free(comp_info_str, TRUE);
g_string_free(runtime_info_str, TRUE);
exit(0);
goto clean_exit;
break;
case 'w':
@ -393,7 +395,8 @@ main(int argc, char *argv[])
default:
print_usage(stderr);
}
exit(1);
status = MERGE_ERR_INVALID_OPTION;
goto clean_exit;
break;
}
}
@ -408,7 +411,8 @@ main(int argc, char *argv[])
if (!out_filename) {
fprintf(stderr, "mergecap: an output filename must be set with -w\n");
fprintf(stderr, " run with -h for help\n");
return 1;
status = MERGE_ERR_INVALID_OPTION;
goto clean_exit;
}
if (in_file_count < 1) {
fprintf(stderr, "mergecap: No input files were specified\n");
@ -418,7 +422,8 @@ main(int argc, char *argv[])
/* setting IDB merge mode must use PCAPNG output */
if (mode != IDB_MERGE_MODE_MAX && file_type != WTAP_FILE_TYPE_SUBTYPE_PCAPNG) {
fprintf(stderr, "The IDB merge mode can only be used with PCAPNG output format\n");
return 1;
status = MERGE_ERR_INVALID_OPTION;
goto clean_exit;
}
/* if they didn't set IDB merge mode, set it to our default */
@ -478,6 +483,8 @@ main(int argc, char *argv[])
g_free(err_info);
clean_exit:
wtap_cleanup();
return (status == MERGE_OK) ? 0 : 2;
}

View File

@ -49,6 +49,10 @@
#include "randpkt_core/randpkt_core.h"
#define INVALID_OPTION 1
#define INVALID_TYPE 2
#define CLOSE_ERROR 2
/*
* General errors are reported with an console message in randpkt.
*/
@ -104,9 +108,8 @@ usage(gboolean is_error)
g_strfreev(longname_list);
fprintf(output, "\nIf type is not specified, a random packet will be chosen\n\n");
exit(is_error ? 1 : 0);
}
int
main(int argc, char **argv)
{
@ -120,6 +123,7 @@ main(int argc, char **argv)
guint8* type = NULL;
int allrandom = FALSE;
wtap_dumper *savedump;
int ret = EXIT_SUCCESS;
static const struct option long_options[] = {
{"help", no_argument, NULL, 'h'},
{0, 0, 0, 0 }
@ -174,7 +178,8 @@ main(int argc, char **argv)
produce_max_bytes = get_positive_int(optarg, "max bytes");
if (produce_max_bytes > 65536) {
cmdarg_err("max bytes is > 65536");
return 1;
ret = INVALID_OPTION;
goto clean_exit;
}
break;
@ -188,6 +193,7 @@ main(int argc, char **argv)
case 'h':
usage(FALSE);
goto clean_exit;
break;
case 'r':
@ -196,6 +202,8 @@ main(int argc, char **argv)
default:
usage(TRUE);
ret = INVALID_OPTION;
goto clean_exit;
break;
}
}
@ -206,6 +214,8 @@ main(int argc, char **argv)
}
else {
usage(TRUE);
ret = INVALID_OPTION;
goto clean_exit;
}
if (!allrandom) {
@ -213,22 +223,31 @@ main(int argc, char **argv)
g_free(type);
example = randpkt_find_example(produce_type);
if (!example)
return 1;
if (!example) {
ret = INVALID_OPTION;
goto clean_exit;
}
randpkt_example_init(example, produce_filename, produce_max_bytes);
ret = randpkt_example_init(example, produce_filename, produce_max_bytes);
if (ret != EXIT_SUCCESS)
goto clean_exit;
randpkt_loop(example, produce_count);
} else {
if (type) {
fprintf(stderr, "Can't set type in random mode\n");
return 2;
ret = INVALID_TYPE;
goto clean_exit;
}
produce_type = randpkt_parse_type(NULL);
example = randpkt_find_example(produce_type);
if (!example)
return 1;
randpkt_example_init(example, produce_filename, produce_max_bytes);
if (!example) {
ret = INVALID_OPTION;
goto clean_exit;
}
ret = randpkt_example_init(example, produce_filename, produce_max_bytes);
if (ret != EXIT_SUCCESS)
goto clean_exit;
while (produce_count-- > 0) {
randpkt_loop(example, 1);
@ -237,15 +256,20 @@ main(int argc, char **argv)
savedump = example->dump;
example = randpkt_find_example(produce_type);
if (!example)
return 1;
if (!example) {
ret = INVALID_OPTION;
goto clean_exit;
}
example->dump = savedump;
}
}
if (!randpkt_example_close(example))
return 2;
return 0;
if (!randpkt_example_close(example)) {
ret = CLOSE_ERROR;
}
clean_exit:
wtap_cleanup();
return ret;
}
/*

View File

@ -34,6 +34,9 @@
#define array_length(x) (sizeof x / sizeof x[0])
#define INVALID_LEN 1
#define WRITE_ERROR 2
GRand *pkt_rand = NULL;
/* Types of produceable packets */
@ -696,7 +699,7 @@ gboolean randpkt_example_close(randpkt_example* example)
return ok;
}
void randpkt_example_init(randpkt_example* example, char* produce_filename, int produce_max_bytes)
int randpkt_example_init(randpkt_example* example, char* produce_filename, int produce_max_bytes)
{
int err;
@ -718,7 +721,7 @@ void randpkt_example_init(randpkt_example* example, char* produce_filename, int
}
if (!example->dump) {
fprintf(stderr, "randpkt: Error writing to %s\n", example->filename);
exit(2);
return WRITE_ERROR;
}
/* reduce max_bytes by # of bytes already in sample */
@ -726,10 +729,12 @@ void randpkt_example_init(randpkt_example* example, char* produce_filename, int
fprintf(stderr, "randpkt: Sample packet length is %d, which is greater than "
"or equal to\n", example->sample_length);
fprintf(stderr, "your requested max_bytes value of %d\n", produce_max_bytes);
exit(1);
return INVALID_LEN;
} else {
example->produce_max_bytes = produce_max_bytes - example->sample_length;
}
return EXIT_SUCCESS;
}
/* Parse command-line option "type" and return enum type */

View File

@ -55,7 +55,7 @@ int randpkt_parse_type(char *string);
randpkt_example* randpkt_find_example(int type);
/* Init a new example */
void randpkt_example_init(randpkt_example* example, char* produce_filename, int produce_max_bytes);
int randpkt_example_init(randpkt_example* example, char* produce_filename, int produce_max_bytes);
/* Loop the packet generation */
void randpkt_loop(randpkt_example* example, guint64 produce_count);

View File

@ -121,6 +121,12 @@
static const gchar decode_as_arg_template[] = "<layer_type>==<selector>,<decode_as_protocol>";
#endif
#define INVALID_OPTION 1
#define INIT_ERROR 2
#define INVALID_DFILTER 2
#define OPEN_ERROR 2
#define FORMAT_ERROR 2
static guint32 cum_bytes;
static const frame_data *ref;
static frame_data ref_frame;
@ -442,6 +448,7 @@ main(int argc, char *argv[])
GPtrArray *disp_fields = g_ptr_array_new();
guint fc;
gboolean skip_pcap_header = FALSE;
int ret = EXIT_SUCCESS;
static const struct option long_options[] = {
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'v'},
@ -532,8 +539,10 @@ main(int argc, char *argv[])
dissectors, and we must do it before we read the preferences, in
case any dissectors register preferences. */
if (!epan_init(register_all_protocols, register_all_protocol_handoffs,
NULL, NULL))
return 2;
NULL, NULL)) {
ret = INIT_ERROR;
goto clean_exit;
}
prefs_p = read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
&pf_open_errno, &pf_read_errno, &pf_path);
@ -613,7 +622,8 @@ main(int argc, char *argv[])
case 'd': /* Payload type */
if (!set_link_type(optarg)) {
cmdarg_err("Invalid link type or protocol \"%s\"", optarg);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
break;
case 'F': /* Read field to display */
@ -625,7 +635,7 @@ main(int argc, char *argv[])
"See https://www.wireshark.org for more information.\n",
get_ws_vcs_version_info());
print_usage(stdout);
exit(0);
goto clean_exit;
break;
case 'l': /* "Line-buffer" standard output */
/* This isn't line-buffering, strictly speaking, it's just
@ -647,10 +657,10 @@ main(int argc, char *argv[])
limit.rlim_cur = get_positive_int(optarg, "memory limit");
limit.rlim_max = get_positive_int(optarg, "memory limit");
if(setrlimit(RLIMIT_AS, &limit) != 0)
{
if(setrlimit(RLIMIT_AS, &limit) != 0) {
cmdarg_err("setrlimit() returned error");
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
break;
#endif
@ -662,7 +672,8 @@ main(int argc, char *argv[])
if (badopt != '\0') {
cmdarg_err("-N specifies unknown resolving option '%c'; valid options are 'd', m', 'n', 'N', and 't'",
badopt);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
break;
case 'o': /* Override preference from command line */
@ -673,13 +684,15 @@ main(int argc, char *argv[])
case PREFS_SET_SYNTAX_ERR:
cmdarg_err("Invalid -o flag \"%s\"", optarg);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
break;
case PREFS_SET_NO_SUCH_PREF:
case PREFS_SET_OBSOLETE:
cmdarg_err("-o flag \"%s\" specifies unknown preference", optarg);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
break;
}
break;
@ -695,7 +708,8 @@ main(int argc, char *argv[])
}
else {
cmdarg_err("Too many display filters");
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
break;
case 's': /* Skip PCAP header */
@ -704,7 +718,8 @@ main(int argc, char *argv[])
case 'S': /* Print string representations */
if (!parse_field_string_format(optarg)) {
cmdarg_err("Invalid field string format");
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
break;
case 't': /* Time stamp type */
@ -741,7 +756,8 @@ main(int argc, char *argv[])
"\"u\" for absolute UTC, \"ud\" for absolute UTC with YYYY-MM-DD date,");
cmdarg_err_cont(
"or \"udoy\" for absolute UTC with YYYY/DOY date.");
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
break;
case 'v': /* Show version and exit */
@ -749,13 +765,14 @@ main(int argc, char *argv[])
show_version("Rawshark (Wireshark)", comp_info_str, runtime_info_str);
g_string_free(comp_info_str, TRUE);
g_string_free(runtime_info_str, TRUE);
exit(0);
goto clean_exit;
break;
}
default:
case '?': /* Bad flag - print usage message */
print_usage(stderr);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
break;
}
}
@ -784,7 +801,8 @@ main(int argc, char *argv[])
if (n_rfilters != 0) {
cmdarg_err("Read filters were specified both with \"-R\" "
"and with additional command-line arguments");
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
rfilters[n_rfilters] = get_args_as_string(argc, argv, optind);
}
@ -793,12 +811,14 @@ main(int argc, char *argv[])
/* Make sure we got a dissector handle for our payload. */
if (encap == WTAP_ENCAP_UNKNOWN) {
cmdarg_err("No valid payload dissector specified.");
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
if (arg_error) {
print_usage(stderr);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
@ -829,12 +849,8 @@ main(int argc, char *argv[])
if (!dfilter_compile(rfilters[i], &rfcodes[n_rfcodes], &err_msg)) {
cmdarg_err("%s", err_msg);
g_free(err_msg);
epan_free(cfile.epan);
epan_cleanup();
#ifdef HAVE_EXTCAP
extcap_cleanup();
#endif
exit(2);
ret = INVALID_DFILTER;
goto clean_exit;
}
n_rfcodes++;
}
@ -853,12 +869,8 @@ main(int argc, char *argv[])
relinquish_special_privs_perm();
if (raw_cf_open(&cfile, pipe_name) != CF_OK) {
epan_free(cfile.epan);
epan_cleanup();
#ifdef HAVE_EXTCAP
extcap_cleanup();
#endif
exit(2);
ret = OPEN_ERROR;
goto clean_exit;
}
/* Do we need to PCAP header and magic? */
@ -869,7 +881,8 @@ main(int argc, char *argv[])
ssize_t bytes = ws_read(fd, buf, (int)bytes_left);
if (bytes <= 0) {
cmdarg_err("Not enough bytes for pcap header.");
exit(2);
ret = FORMAT_ERROR;
goto clean_exit;
}
bytes_left -= bytes;
}
@ -877,25 +890,24 @@ main(int argc, char *argv[])
/* Process the packets in the file */
if (!load_cap_file(&cfile)) {
epan_free(cfile.epan);
epan_cleanup();
#ifdef HAVE_EXTCAP
extcap_cleanup();
#endif
exit(2);
ret = OPEN_ERROR;
goto clean_exit;
}
} else {
/* If you want to capture live packets, use TShark. */
cmdarg_err("Input file or pipe name not specified.");
exit(2);
ret = OPEN_ERROR;
goto clean_exit;
}
clean_exit:
epan_free(cfile.epan);
epan_cleanup();
#ifdef HAVE_EXTCAP
extcap_cleanup();
#endif
return 0;
wtap_cleanup();
return ret;
}
/**

View File

@ -51,6 +51,10 @@
#include <wsutil/report_err.h>
#define INVALID_OPTION 1
#define OPEN_ERROR 2
#define OUTPUT_FILE_ERROR 1
/* Show command-line usage */
static void
print_usage(FILE *output)
@ -182,6 +186,7 @@ main(int argc, char *argv[])
GArray *shb_hdrs = NULL;
wtapng_iface_descriptions_t *idb_inf = NULL;
GArray *nrb_hdrs = NULL;
int ret = EXIT_SUCCESS;
GPtrArray *frames;
FrameRecord_t *prevFrame = NULL;
@ -259,17 +264,18 @@ main(int argc, char *argv[])
"See https://www.wireshark.org for more information.\n",
get_ws_vcs_version_info());
print_usage(stdout);
exit(0);
goto clean_exit;
case 'v':
comp_info_str = get_compiled_version_info(NULL, NULL);
runtime_info_str = get_runtime_version_info(NULL);
show_version("Reordercap (Wireshark)", comp_info_str, runtime_info_str);
g_string_free(comp_info_str, TRUE);
g_string_free(runtime_info_str, TRUE);
exit(0);
goto clean_exit;
case '?':
print_usage(stderr);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
}
@ -281,7 +287,8 @@ main(int argc, char *argv[])
}
else {
print_usage(stderr);
exit(1);
ret = INVALID_OPTION;
goto clean_exit;
}
/* Open infile */
@ -295,7 +302,8 @@ main(int argc, char *argv[])
fprintf(stderr, "(%s)\n", err_info);
g_free(err_info);
}
exit(2);
ret = OPEN_ERROR;
goto clean_exit;
}
DEBUG_PRINT("file_type_subtype is %d\n", wtap_file_type_subtype(wth));
@ -320,7 +328,8 @@ main(int argc, char *argv[])
outfile, wtap_strerror(err));
wtap_block_array_free(shb_hdrs);
wtap_block_array_free(nrb_hdrs);
exit(1);
ret = OUTPUT_FILE_ERROR;
goto clean_exit;
}
/* Allocate the array of frame pointers. */
@ -394,7 +403,8 @@ main(int argc, char *argv[])
wtap_strerror(err));
wtap_block_array_free(shb_hdrs);
wtap_block_array_free(nrb_hdrs);
exit(1);
ret = OUTPUT_FILE_ERROR;
goto clean_exit;
}
wtap_block_array_free(shb_hdrs);
wtap_block_array_free(nrb_hdrs);
@ -402,7 +412,9 @@ main(int argc, char *argv[])
/* Finally, close infile and release resources. */
wtap_close(wth);
return 0;
clean_exit:
wtap_cleanup();
return ret;
}
/*

View File

@ -299,6 +299,7 @@ main(int argc, char *argv[])
clean_exit:
col_cleanup(&cfile.cinfo);
free_filter_lists();
wtap_cleanup();
return ret;
}

107
tfshark.c
View File

@ -94,6 +94,11 @@
#include <wsutil/plugins.h>
#endif
#define INVALID_OPTION 1
#define INIT_ERROR 2
#define INVALID_FILTER 2
#define OPEN_ERROR 2
static guint32 cum_bytes;
static const frame_data *ref;
static frame_data ref_frame;
@ -519,8 +524,10 @@ main(int argc, char *argv[])
dissectors, and we must do it before we read the preferences, in
case any dissectors register preferences. */
if (!epan_init(register_all_protocols, register_all_protocol_handoffs, NULL,
NULL))
return 2;
NULL)) {
exit_status = INIT_ERROR;
goto clean_exit;
}
/* Register all tap listeners; we do this before we parse the arguments,
as the "-z" argument can specify a registered tap. */
@ -588,10 +595,11 @@ main(int argc, char *argv[])
glossary_option_help();
else {
cmdarg_err("Invalid \"%s\" option for -G flag, enter -G ? for more help.", argv[2]);
return 1;
exit_status = INVALID_OPTION;
goto clean_exit;
}
}
return 0;
goto clean_exit;
}
prefs_p = read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
@ -698,7 +706,8 @@ main(int argc, char *argv[])
if (!output_fields_set_option(output_fields, optarg)) {
cmdarg_err("\"%s\" is not a valid field output option=value pair.", optarg);
output_fields_list_options(stderr);
return 1;
exit_status = INVALID_OPTION;
goto clean_exit;
}
break;
@ -708,7 +717,7 @@ main(int argc, char *argv[])
"See https://www.wireshark.org for more information.\n",
get_ws_vcs_version_info());
print_usage(stdout);
return 0;
goto clean_exit;
break;
case 'l': /* "Line-buffer" standard output */
/* This isn't line-buffering, strictly speaking, it's just
@ -739,7 +748,8 @@ main(int argc, char *argv[])
case PREFS_SET_NO_SUCH_PREF:
case PREFS_SET_OBSOLETE:
cmdarg_err("-o flag \"%s\" specifies unknown preference", optarg);
return 1;
exit_status = INVALID_OPTION;
goto clean_exit;
break;
}
break;
@ -796,7 +806,8 @@ main(int argc, char *argv[])
"\t packets, or a multi-line view of the details of each of the\n"
"\t packets, depending on whether the -V flag was specified.\n"
"\t This is the default.");
return 1;
exit_status = INVALID_OPTION;
goto clean_exit;
}
break;
case 'v': /* Show version and exit */
@ -805,16 +816,7 @@ main(int argc, char *argv[])
show_version("TFShark (Wireshark)", comp_info_str, runtime_info_str);
g_string_free(comp_info_str, TRUE);
g_string_free(runtime_info_str, TRUE);
/* We don't really have to cleanup here, but it's a convenient way to test
* start-up and shut-down of the epan library without any UI-specific
* cruft getting in the way. Makes the results of running
* $ ./tools/valgrind-wireshark -n
* much more useful. */
epan_cleanup();
#ifdef HAVE_EXTCAP
extcap_cleanup();
#endif
return 0;
goto clean_exit;
case 'O': /* Only output these protocols */
/* already processed; just ignore it now */
break;
@ -839,25 +841,29 @@ main(int argc, char *argv[])
if (strcmp("help", optarg) == 0) {
fprintf(stderr, "tfshark: The available statistics for the \"-z\" option are:\n");
list_stat_cmd_args();
return 0;
goto clean_exit;
}
if (!process_stat_cmd_arg(optarg)) {
cmdarg_err("Invalid -z argument \"%s\"; it must be one of:", optarg);
list_stat_cmd_args();
return 1;
exit_status = INVALID_OPTION;
goto clean_exit;
}
break;
case 'd': /* Decode as rule */
case 'K': /* Kerberos keytab file */
case 't': /* Time stamp type */
case 'u': /* Seconds type */
if (!dissect_opts_handle_opt(opt, optarg))
return 1;
if (!dissect_opts_handle_opt(opt, optarg)) {
exit_status = INVALID_OPTION;
goto clean_exit;
}
break;
default:
case '?': /* Bad flag - print usage message */
print_usage(stderr);
return 1;
exit_status = INVALID_OPTION;
goto clean_exit;
break;
}
}
@ -871,7 +877,8 @@ main(int argc, char *argv[])
cmdarg_err("\"-Tfields\" was specified, but no fields were "
"specified with \"-e\".");
return 1;
exit_status = INVALID_OPTION;
goto clean_exit;
}
/* If no capture filter or display filter has been specified, and there are
@ -883,7 +890,8 @@ main(int argc, char *argv[])
if (dfilter != NULL) {
cmdarg_err("Display filters were specified both with \"-d\" "
"and with additional command-line arguments.");
return 1;
exit_status = INVALID_OPTION;
goto clean_exit;
}
dfilter = get_args_as_string(argc, argv, optind);
}
@ -895,13 +903,15 @@ main(int argc, char *argv[])
if (arg_error) {
print_usage(stderr);
return 1;
exit_status = INVALID_OPTION;
goto clean_exit;
}
if (print_hex) {
if (output_action != WRITE_TEXT) {
cmdarg_err("Raw packet hex data can only be printed as text or PostScript");
return 1;
exit_status = INVALID_OPTION;
goto clean_exit;
}
}
@ -910,7 +920,8 @@ main(int argc, char *argv[])
if (!print_details) {
cmdarg_err("-O requires -V");
return 1;
exit_status = INVALID_OPTION;
goto clean_exit;
}
output_only_tables = g_hash_table_new (g_str_hash, g_str_equal);
@ -921,7 +932,8 @@ main(int argc, char *argv[])
if (rfilter != NULL && !perform_two_pass_analysis) {
cmdarg_err("-R without -2 is deprecated. For single-pass filtering use -Y.");
return 1;
exit_status = INVALID_OPTION;
goto clean_exit;
}
/* Notify all registered modules that have had any of their preferences
@ -948,11 +960,8 @@ main(int argc, char *argv[])
if (!dfilter_compile(rfilter, &rfcode, &err_msg)) {
cmdarg_err("%s", err_msg);
g_free(err_msg);
epan_cleanup();
#ifdef HAVE_EXTCAP
extcap_cleanup();
#endif
return 2;
exit_status = INVALID_FILTER;
goto clean_exit;
}
}
cfile.rfcode = rfcode;
@ -961,11 +970,8 @@ main(int argc, char *argv[])
if (!dfilter_compile(dfilter, &dfcode, &err_msg)) {
cmdarg_err("%s", err_msg);
g_free(err_msg);
epan_cleanup();
#ifdef HAVE_EXTCAP
extcap_cleanup();
#endif
return 2;
exit_status = INVALID_FILTER;
goto clean_exit;
}
}
cfile.dfcode = dfcode;
@ -1009,11 +1015,8 @@ main(int argc, char *argv[])
/* TODO: if tfshark is ever changed to give the user a choice of which
open_routine reader to use, then the following needs to change. */
if (cf_open(&cfile, cf_name, WTAP_TYPE_AUTO, FALSE, &err) != CF_OK) {
epan_cleanup();
#ifdef HAVE_EXTCAP
extcap_cleanup();
#endif
return 2;
exit_status = OPEN_ERROR;
goto clean_exit;
}
/* Process the packets in the file */
@ -1049,6 +1052,8 @@ main(int argc, char *argv[])
draw_tap_listeners(TRUE);
funnel_dump_all_text_windows();
clean_exit:
epan_free(cfile.epan);
epan_cleanup();
#ifdef HAVE_EXTCAP
@ -1058,6 +1063,8 @@ main(int argc, char *argv[])
output_fields_free(output_fields);
output_fields = NULL;
col_cleanup(&cfile.cinfo);
wtap_cleanup();
return exit_status;
}
@ -1254,7 +1261,7 @@ process_packet_second_pass(capture_file *cf, epan_dissect_t *edt, frame_data *fd
if (ferror(stdout)) {
show_print_file_io_error(errno);
exit(2);
return FALSE;
}
}
prev_dis = fdata;
@ -1445,7 +1452,8 @@ load_cap_file(capture_file *cf, int max_packet_count, gint64 max_byte_count)
process_packet_second_pass(cf, edt, fdata, &cf->phdr, &buf, tap_flags);
}
#else
process_packet_second_pass(cf, edt, fdata, &cf->phdr, &buf, tap_flags);
if (!process_packet_second_pass(cf, edt, fdata, &cf->phdr, &buf, tap_flags))
return 2;
#endif
}
@ -1479,8 +1487,9 @@ load_cap_file(capture_file *cf, int max_packet_count, gint64 max_byte_count)
framenum++;
process_packet(cf, edt, data_offset, &file_phdr/*wtap_phdr(cf->wth)*/,
raw_data, tap_flags);
if (!process_packet(cf, edt, data_offset, &file_phdr/*wtap_phdr(cf->wth)*/,
raw_data, tap_flags))
return 2;
/* Stop reading if we have the maximum number of packets;
* When the -c option has not been used, max_packet_count
@ -1673,7 +1682,7 @@ process_packet(capture_file *cf, epan_dissect_t *edt, gint64 offset,
if (ferror(stdout)) {
show_print_file_io_error(errno);
exit(2);
return FALSE;
}
}

View File

@ -2202,6 +2202,7 @@ clean_exit:
#endif
col_cleanup(&cfile.cinfo);
free_filter_lists();
wtap_cleanup();
return exit_status;
}

View File

@ -2816,6 +2816,7 @@ clean_exit:
#endif
col_cleanup(&cfile.cinfo);
free_filter_lists();
wtap_cleanup();
return ret;
}

View File

@ -947,6 +947,7 @@ clean_exit:
capture_opts_cleanup(&global_capture_opts);
#endif
col_cleanup(&CaptureFile::globalCapFile()->cinfo);
wtap_cleanup();
return ret_val;
}

View File

@ -59,7 +59,8 @@ typedef enum {
MERGE_ERR_CANT_READ_INFILE,
MERGE_ERR_BAD_PHDR_INTERFACE_ID,
MERGE_ERR_CANT_WRITE_OUTFILE,
MERGE_ERR_CANT_CLOSE_OUTFILE
MERGE_ERR_CANT_CLOSE_OUTFILE,
MERGE_ERR_INVALID_OPTION
} merge_result;

View File

@ -936,6 +936,13 @@ static void wtap_init_encap_types(void) {
g_array_append_vals(encap_table_arr,encap_table_base,wtap_num_encap_types);
}
static void wtap_cleanup_encap_types(void) {
if (encap_table_arr) {
g_array_free(encap_table_arr, TRUE);
encap_table_arr = NULL;
}
}
int wtap_get_num_encap_types(void) {
return wtap_num_encap_types;
}
@ -1428,6 +1435,17 @@ wtap_init(void)
#endif
}
/*
* Cleanup the library
*/
void
wtap_cleanup(void)
{
wtap_cleanup_encap_types();
wtap_opttypes_cleanup();
ws_buffer_cleanup();
}
/*
* Editor modelines - http://www.wireshark.org/tools/modelines.html
*

View File

@ -1972,6 +1972,9 @@ void wtap_deregister_file_type_subtype(const int file_type_subtype);
WS_DLL_PUBLIC
int wtap_register_encap_type(const char* name, const char* short_name);
/*** Cleanup the interal library structures */
WS_DLL_PUBLIC
void wtap_cleanup(void);
/**
* Wiretap error codes.

View File

@ -1231,3 +1231,23 @@ void wtap_opttypes_initialize(void)
wtap_opttype_option_register(&isb_block, OPT_ISB_OSDROP, &isb_osdrop);
wtap_opttype_option_register(&isb_block, OPT_ISB_USRDELIV, &isb_usrdeliv);
}
void wtap_opttypes_cleanup(void)
{
if (blocktype_list[WTAP_BLOCK_NG_SECTION]->options) {
g_array_free(blocktype_list[WTAP_BLOCK_NG_SECTION]->options, TRUE);
blocktype_list[WTAP_BLOCK_NG_SECTION]->options = NULL;
}
if (blocktype_list[WTAP_BLOCK_IF_DESCR]->options) {
g_array_free(blocktype_list[WTAP_BLOCK_IF_DESCR]->options, TRUE);
blocktype_list[WTAP_BLOCK_IF_DESCR]->options = NULL;
}
if (blocktype_list[WTAP_BLOCK_NG_NRB]->options) {
g_array_free(blocktype_list[WTAP_BLOCK_NG_NRB]->options, TRUE);
blocktype_list[WTAP_BLOCK_NG_NRB]->options = NULL;
}
if (blocktype_list[WTAP_BLOCK_IF_STATS]->options) {
g_array_free(blocktype_list[WTAP_BLOCK_IF_STATS]->options, TRUE);
blocktype_list[WTAP_BLOCK_IF_STATS]->options = NULL;
}
}

View File

@ -520,6 +520,10 @@ WS_DLL_PUBLIC void wtap_block_foreach_option(wtap_block_t block, wtap_block_fore
WS_DLL_PUBLIC int wtap_opttype_register_custom_block_type(const char* name, const char* description, wtap_block_create_func create,
wtap_mand_free_func free_mand, wtap_mand_copy_func copy_mand);
/** Cleanup the internal structures
*/
WS_DLL_PUBLIC void wtap_opttypes_cleanup(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@ -178,6 +178,16 @@ ws_buffer_append_buffer(Buffer* buffer, Buffer* src_buffer)
}
#endif
void
ws_buffer_cleanup(void)
{
if (small_buffers) {
g_ptr_array_set_free_func(small_buffers, g_free);
g_ptr_array_free(small_buffers, TRUE);
small_buffers = NULL;
}
}
/*
* Editor modelines - http://www.wireshark.org/tools/modelines.html
*

View File

@ -48,6 +48,8 @@ WS_DLL_PUBLIC
void ws_buffer_append(Buffer* buffer, guint8 *from, gsize bytes);
WS_DLL_PUBLIC
void ws_buffer_remove_start(Buffer* buffer, gsize bytes);
WS_DLL_PUBLIC
void ws_buffer_cleanup(void);
#ifdef SOME_FUNCTIONS_ARE_DEFINES
# define ws_buffer_clean(buffer) ws_buffer_remove_start((buffer), ws_buffer_length(buffer))