From 800a856fb4784e31347e15a8ec825d2daeb62350 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Mon, 12 Jun 2017 14:23:32 +0200 Subject: Qt: fix hang on exiting Qt while loading capture file testCaptureFileClose can also be invoked while reading an existing capture file (the original comment only applied to GTK+, not Qt). When the user quits Wireshark while reading an offline pcap, this could result in a confusing "Unsaved packets" dialog. Fix this by checking the actual capture session state. After fixing this, the next issue is that cf_close trips on an assertion ("cf->state != FILE_READ_IN_PROGRESS"). To address this problem, do not close the capture file immediately, but signal to the reader (cf_read) that this should be done (similar to the quit logic in GTK+). Bug: 13563 Change-Id: I12d4b813557bf354199320df2ed8609070fdc58a Reviewed-on: https://code.wireshark.org/review/22096 Petri-Dish: Peter Wu Tested-by: Petri Dish Buildbot Reviewed-by: Peter Wu --- file.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'file.c') diff --git a/file.c b/file.c index a0b4784100..b8423cca71 100644 --- a/file.c +++ b/file.c @@ -541,6 +541,7 @@ cf_read(capture_file *cf, gboolean reloading) volatile gboolean create_proto_tree; guint tap_flags; gboolean compiled; + volatile gboolean is_read_aborted = FALSE; /* Compile the current display filter. * We assume this will not fail since cf->dfilter is only set in @@ -642,6 +643,13 @@ cf_read(capture_file *cf, gboolean reloading) } } + if (cf->state == FILE_READ_ABORTED) { + /* Well, the user decided to exit Wireshark. Break out of the + loop, and let the code below (which is called even if there + aren't any packets left to read) exit. */ + is_read_aborted = TRUE; + break; + } if (cf->stop_flag) { /* Well, the user decided to abort the read. He/She will be warned and it might be enough for him/her to work with the already loaded @@ -717,6 +725,16 @@ cf_read(capture_file *cf, gboolean reloading) packet_list_select_first_row(); } + if (is_read_aborted) { + /* + * Well, the user decided to exit Wireshark while reading this *offline* + * capture file (Live captures are handled by something like + * cf_continue_tail). Clean up accordingly. + */ + cf_close(cf); + return CF_READ_ABORTED; + } + if (cf->stop_flag) { simple_message_box(ESD_TYPE_WARN, NULL, "The remaining packets in the file were discarded.\n" -- cgit v1.2.1