diff --git a/mergecap.c b/mergecap.c index 41be4e228c..7a08390d96 100644 --- a/mergecap.c +++ b/mergecap.c @@ -416,6 +416,15 @@ main(int argc, char *argv[]) cfile_close_failure_message(out_filename, err, err_info); break; + case MERGE_ERR_INVALID_OPTION: + if (err_info) { + cmdarg_err("%s", err_info); + } + else { + cmdarg_err("Unspecified error with merge option"); + } + break; + default: cmdarg_err("Unknown merge_files error %d", status); break; diff --git a/wiretap/merge.c b/wiretap/merge.c index a5dfc0b050..3f366d4f89 100644 --- a/wiretap/merge.c +++ b/wiretap/merge.c @@ -1417,6 +1417,22 @@ merge_files(const gchar* out_filename, const int file_type, guint32 *err_framenum) { ws_assert(out_filename != NULL); + ws_assert(in_file_count > 0); + ws_assert(in_filenames != NULL); + ws_assert(err_info != NULL); + + /* #19402: ensure we aren't appending to one of our inputs */ + if (do_append) { + unsigned int i; + for (i = 0; i < in_file_count; i++) { + if (files_identical(out_filename, in_filenames[i])) { + *err_info = ws_strdup_printf("Output file %s is same as input file %s; " + "appending would create infinite loop", + out_filename, in_filenames[i]); + return MERGE_ERR_INVALID_OPTION; + } + } + } return merge_files_common(out_filename, NULL, NULL, file_type, in_filenames, in_file_count,