aboutsummaryrefslogtreecommitdiffstats
path: root/editcap.c
diff options
context:
space:
mode:
authorGuy Harris <gharris@sonic.net>2021-08-09 22:53:29 -0700
committerGuy Harris <gharris@sonic.net>2021-08-09 23:45:37 -0700
commit158810c7134f593cf9ac7da78161a8458eb1b0ef (patch)
treea6dec5b8d2f669aeea5c130999c93d1fcd0a3618 /editcap.c
parent6e12643f198500245ee6eff999804e468481a7b3 (diff)
editcap: if -T was specified, change the linktype of all interfaces.
Don't just change the linktype of the file (if it has one) and the linktypes of all the packets, change the linktype of all interfaces as well. Fixes #17520.
Diffstat (limited to 'editcap.c')
-rw-r--r--editcap.c64
1 files changed, 56 insertions, 8 deletions
diff --git a/editcap.c b/editcap.c
index f7feb51582..f775359194 100644
--- a/editcap.c
+++ b/editcap.c
@@ -1020,18 +1020,43 @@ editcap_dump_open(const char *filename, const wtap_dump_params *params,
WTAP_BLOCK_IF_ID_AND_INFO) != BLOCK_NOT_SUPPORTED) {
for (guint i = 0; i < idbs_seen->len; i++) {
wtap_block_t if_data = g_array_index(idbs_seen, wtap_block_t, i);
+ wtap_block_t if_data_copy;
/*
- * Add this IDB to the file to which we're currently writing.
+ * Make a copy of this IDB, so that we can change the
+ * encapsulation type without trashing the original.
*/
- if (!wtap_dump_add_idb(pdh, if_data, err, err_info)) {
+ if_data_copy = wtap_block_make_copy(if_data);
+
+ /*
+ * If an encapsulation type was specified, override the
+ * encapsulation type of the interface.
+ */
+ if (out_frame_type != -2) {
+ wtapng_if_descr_mandatory_t *if_mand;
+
+ if_mand = (wtapng_if_descr_mandatory_t *)wtap_block_get_mandatory_data(if_data_copy);
+ if_mand->wtap_encap = out_frame_type;
+ }
+
+ /*
+ * Add this possibly-modified IDB to the file to which
+ * we're currently writing.
+ */
+ if (!wtap_dump_add_idb(pdh, if_data_copy, err, err_info)) {
int close_err;
gchar *close_err_info;
wtap_dump_close(pdh, &close_err, &close_err_info);
g_free(close_err_info);
+ wtap_block_unref(if_data_copy);
return NULL;
}
+
+ /*
+ * Release the copy - wtap_dump_add_idb() makes its own copy.
+ */
+ wtap_block_unref(if_data_copy);
}
}
@@ -1057,16 +1082,39 @@ process_new_idbs(wtap *wth, wtap_dumper *pdh, GArray *idbs_seen,
wtap_block_t if_data_copy;
/*
- * Add this IDB to the file to which we're currently writing.
+ * Make a copy of this IDB, so that we can change the
+ * encapsulation type without trashing the original.
*/
- if (!wtap_dump_add_idb(pdh, if_data, err, err_info))
+ if_data_copy = wtap_block_make_copy(if_data);
+
+ /*
+ * If an encapsulation type was specified, override the
+ * encapsulation type of the interface.
+ */
+ if (out_frame_type != -2) {
+ wtapng_if_descr_mandatory_t *if_mand;
+
+ if_mand = (wtapng_if_descr_mandatory_t *)wtap_block_get_mandatory_data(if_data_copy);
+ if_mand->wtap_encap = out_frame_type;
+ }
+
+ /*
+ * Add this possibly-modified IDB to the file to which
+ * we're currently writing.
+ */
+ if (!wtap_dump_add_idb(pdh, if_data_copy, err, err_info))
return FALSE;
/*
- * Also add it to the set of IDBs we've seen, in case we
- * start writing to another file (which would be of the
- * same type as the current file, and thus will also require
- * interface IDs).
+ * Release the copy - wtap_dump_add_idb() makes its own copy.
+ */
+ wtap_block_unref(if_data_copy);
+
+ /*
+ * Also add an unmodified copy to the set of IDBs we've seen,
+ * in case we start writing to another file (which would be
+ * of the same type as the current file, and thus will also
+ * require interface IDs).
*/
if_data_copy = wtap_block_make_copy(if_data);
g_array_append_val(idbs_seen, if_data_copy);