summaryrefslogtreecommitdiff
path: root/ui/tap-sequence-analysis.c
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2015-10-25 22:52:30 +0100
committerGerald Combs <gerald@wireshark.org>2015-10-26 23:57:51 +0000
commit1ea43c26e68d92838a7d91dce4fe9686b09f12c7 (patch)
tree65c8b3f84f589530b16fc6159974f1813aa8968d /ui/tap-sequence-analysis.c
parentd141562efb18f777c122405941bd5ef8c21513b1 (diff)
downloadwireshark-1ea43c26e68d92838a7d91dce4fe9686b09f12c7.tar.gz
Only store frame number and not a pointer to frame_data structure in seq_analysis_item_t
Qt GUI allows to keep windows open after closing the capture file. Let's not access to freed memory. Bug: 11573 Change-Id: I9e70d818a4b228af319961ec512b6b9725792477 Reviewed-on: https://code.wireshark.org/review/11270 Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Gerald Combs <gerald@wireshark.org>
Diffstat (limited to 'ui/tap-sequence-analysis.c')
-rw-r--r--ui/tap-sequence-analysis.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/ui/tap-sequence-analysis.c b/ui/tap-sequence-analysis.c
index e4635abeb5..9ea84ee3dd 100644
--- a/ui/tap-sequence-analysis.c
+++ b/ui/tap-sequence-analysis.c
@@ -105,7 +105,7 @@ seq_analysis_frame_packet( void *ptr, packet_info *pinfo, epan_dissect_t *edt _U
if (!sai) return FALSE;
- sai->fd = pinfo->fd;
+ sai->frame_number = pinfo->fd->num;
sai->port_src=pinfo->srcport;
sai->port_dst=pinfo->destport;
@@ -197,7 +197,7 @@ seq_analysis_tcp_packet( void *ptr _U_, packet_info *pinfo, epan_dissect_t *edt
seq_analysis_item_t *sai;
sai = (seq_analysis_item_t *)g_malloc0(sizeof(seq_analysis_item_t));
- sai->fd = pinfo->fd;
+ sai->frame_number = pinfo->fd->num;
if (sainfo->any_addr) {
copy_address(&(sai->src_addr),&(pinfo->net_src));
copy_address(&(sai->dst_addr),&(pinfo->net_dst));
@@ -250,8 +250,9 @@ static void sequence_analysis_item_set_timestamp(gpointer data, gpointer user_da
{
gchar time_str[COL_MAX_LEN];
seq_analysis_item_t *seq_item = (seq_analysis_item_t *)data;
- const struct epan_session *epan = (const struct epan_session *)user_data;
- set_fd_time(epan, seq_item->fd, time_str);
+ const capture_file *cf = (const capture_file *)user_data;
+ frame_data *fd = frame_data_sequence_find(cf->frames, seq_item->frame_number);
+ set_fd_time(cf->epan, fd, time_str);
seq_item->time_str = g_strdup(time_str);
}
@@ -287,7 +288,7 @@ sequence_analysis_list_get(capture_file *cf, seq_analysis_info_t *sainfo)
/* SEQ_ANALYSIS_DEBUG("%d items", g_queue_get_length(sainfo->items)); */
/* Fill in the timestamps */
- g_queue_foreach(sainfo->items, sequence_analysis_item_set_timestamp, cf->epan);
+ g_queue_foreach(sainfo->items, sequence_analysis_item_set_timestamp, cf);
}
static void sequence_analysis_item_free(gpointer data)
@@ -310,10 +311,10 @@ sequence_analysis_sort_compare(gconstpointer a, gconstpointer b, gpointer user_d
const seq_analysis_item_t *entry_a = (const seq_analysis_item_t *)a;
const seq_analysis_item_t *entry_b = (const seq_analysis_item_t *)b;
- if(entry_a->fd->num < entry_b->fd->num)
+ if(entry_a->frame_number < entry_b->frame_number)
return -1;
- if(entry_a->fd->num > entry_b->fd->num)
+ if(entry_a->frame_number > entry_b->frame_number)
return 1;
return 0;
@@ -484,6 +485,7 @@ sequence_analysis_dump_to_file(const char *pathname, seq_analysis_info_t *sainfo
guint32 i, display_items, display_nodes;
guint32 start_position, end_position, item_width, header_length;
seq_analysis_item_t *sai;
+ frame_data *fd;
guint16 first_conv_num = 0;
gboolean several_convs = FALSE;
gboolean first_packet = TRUE;
@@ -631,12 +633,13 @@ sequence_analysis_dump_to_file(const char *pathname, seq_analysis_info_t *sainfo
fprintf(of, "%s", label_string->str);
}
+ fd = frame_data_sequence_find(cf->frames, sai->frame_number);
#if 0
/* write the time */
- g_string_printf(label_string, "|%.3f", nstime_to_sec(&sai->fd->rel_ts));
+ g_string_printf(label_string, "|%.3f", nstime_to_sec(&fd->rel_ts));
#endif
/* Write the time, using the same format as in the time col */
- set_fd_time(cf->epan, sai->fd, time_str);
+ set_fd_time(cf->epan, fd, time_str);
g_string_printf(label_string, "|%s", time_str);
enlarge_string(label_string, 10, ' ');
fprintf(of, "%s", label_string->str);