Wireshark-dev: Re: [Wireshark-dev] RFD: Limiting scope of ep_ memory
From: Jakub Zawadzki <darkjames-ws@xxxxxxxxxxxx>
Date: Sun, 14 Oct 2012 23:20:23 +0200
On Fri, Oct 12, 2012 at 02:02:53PM +0000, Anders Broman wrote: > Why not make a patch that developers can try out and start debugging? Attached. PS. I'd rather want to hear comments, rather than debugging...
diff --git a/epan/epan.c b/epan/epan.c index 6437bad..6880005 100644 --- a/epan/epan.c +++ b/epan/epan.c @@ -192,10 +192,26 @@ void epan_dissect_run(epan_dissect_t *edt, void* pseudo_header, const guint8* data, frame_data *fd, column_info *cinfo) { - /* free all memory allocated during previous packet */ ep_free_all(); dissect_packet(edt, pseudo_header, data, fd, cinfo); + + /* free all memory allocated */ + ep_free_all(); +} + +void +epan_dissect_run_with_taps(epan_dissect_t *edt, void* pseudo_header, + const guint8* data, frame_data *fd, column_info *cinfo) +{ + ep_free_all(); + + tap_queue_init(edt); + dissect_packet(edt, pseudo_header, data, fd, cinfo); + tap_push_tapped_queue(edt); + + /* free all memory allocated */ + ep_free_all(); } void diff --git a/epan/epan.h b/epan/epan.h index 00ec257..fa2a4e4 100644 --- a/epan/epan.h +++ b/epan/epan.h @@ -154,6 +154,11 @@ void epan_dissect_run(epan_dissect_t *edt, void* pseudo_header, const guint8* data, frame_data *fd, column_info *cinfo); +void +epan_dissect_run_with_taps(epan_dissect_t *edt, void* pseudo_header, + const guint8* data, frame_data *fd, column_info *cinfo); + + /** Prime a proto_tree using the fields/protocols used in a dfilter. */ void epan_dissect_prime_dfilter(epan_dissect_t *edt, const dfilter_t *dfcode); diff --git a/epan/frame_data.h b/epan/frame_data.h index 87994ca..282364e 100644 --- a/epan/frame_data.h +++ b/epan/frame_data.h @@ -85,8 +85,7 @@ typedef struct { */ typedef struct { tvbuff_t *tvb; - gboolean name_initialized; - const char *name; + char *name; } data_source; /* Utility routines used by packet*.c */ diff --git a/epan/libwireshark.def b/epan/libwireshark.def index 3b82f64..0264f5e 100644 --- a/epan/libwireshark.def +++ b/epan/libwireshark.def @@ -411,6 +411,7 @@ epan_dissect_init epan_dissect_new epan_dissect_prime_dfilter epan_dissect_run +epan_dissect_run_with_taps epan_get_compiled_version_info epan_get_runtime_version_info epan_get_version @@ -1049,9 +1050,7 @@ t38_T30_data_vals DATA t38_T30_indicator_vals DATA t38_add_address T_h323_message_body_vals DATA -tap_push_tapped_queue tap_build_interesting -tap_queue_init tap_queue_packet tcp_dissect_pdus tap_listeners_require_dissection diff --git a/epan/packet.c b/epan/packet.c index cd0f6f1..b7b176a 100644 --- a/epan/packet.c +++ b/epan/packet.c @@ -220,22 +220,16 @@ add_new_data_source(packet_info *pinfo, tvbuff_t *tvb, const char *name) { data_source *src; - src = ep_alloc(sizeof (data_source)); + src = g_malloc(sizeof(data_source)); src->tvb = tvb; - src->name_initialized = FALSE; - src->name = name; + src->name = g_strdup(name); pinfo->data_src = g_slist_append(pinfo->data_src, src); } const char* get_data_source_name(data_source *src) { - if (!src->name_initialized) { - src->name = ep_strdup_printf("%s (%u bytes)", src->name, tvb_length(src->tvb)); - src->name_initialized = TRUE; - } - - return src->name; + return ep_strdup_printf("%s (%u bytes)", src->name, tvb_length(src->tvb)); } /* @@ -245,6 +239,14 @@ void free_data_sources(packet_info *pinfo) { if (pinfo->data_src) { + GSList *l; + + for (l = pinfo->data_src; l; l = l->next) { + data_source *src = l->data; + + g_free(src->name); + g_free(src); + } g_slist_free(pinfo->data_src); pinfo->data_src = NULL; } diff --git a/file.c b/file.c index 46c4888..d1442c6 100644 --- a/file.c +++ b/file.c @@ -1123,9 +1123,7 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf, epan_dissect_prime_dfilter(&edt, dfcode); } - tap_queue_init(&edt); - epan_dissect_run(&edt, pseudo_header, buf, fdata, cinfo); - tap_push_tapped_queue(&edt); + epan_dissect_run_with_taps(&edt, pseudo_header, buf, fdata, cinfo); /* If we have a display filter, apply it if we're refiltering, otherwise leave the "passed_dfilter" flag alone. @@ -2297,9 +2295,7 @@ retap_packet(capture_file *cf _U_, frame_data *fdata, epan_dissect_t edt; epan_dissect_init(&edt, args->construct_protocol_tree, FALSE); - tap_queue_init(&edt); - epan_dissect_run(&edt, pseudo_header, pd, fdata, args->cinfo); - tap_push_tapped_queue(&edt); + epan_dissect_run_with_taps(&edt, pseudo_header, pd, fdata, args->cinfo); epan_dissect_cleanup(&edt); return TRUE; diff --git a/rawshark.c b/rawshark.c index d6f319a..d59da3c 100644 --- a/rawshark.c +++ b/rawshark.c @@ -1060,8 +1060,6 @@ process_packet(capture_file *cf, gint64 offset, const struct wtap_pkthdr *whdr, } } - tap_queue_init(&edt); - printf("%lu", (unsigned long int) cf->count); frame_data_set_before_dissect(&fdata, &cf->elapsed_time, @@ -1070,9 +1068,7 @@ process_packet(capture_file *cf, gint64 offset, const struct wtap_pkthdr *whdr, /* We only need the columns if we're printing packet info but we're *not* verbose; in verbose mode, we print the protocol tree, not the protocol summary. */ - epan_dissect_run(&edt, &pseudo_header, pd, &fdata, &cf->cinfo); - - tap_push_tapped_queue(&edt); + epan_dissect_run_with_taps(&edt, &pseudo_header, pd, &fdata, &cf->cinfo); frame_data_set_after_dissect(&fdata, &cum_bytes); prev_dis_frame = fdata; diff --git a/tshark.c b/tshark.c index b3f75e9..208195f 100644 --- a/tshark.c +++ b/tshark.c @@ -2632,8 +2632,6 @@ process_packet_second_pass(capture_file *cf, frame_data *fdata, col_custom_prime_edt(&edt, &cf->cinfo); - tap_queue_init(&edt); - /* We only need the columns if either 1) some tap needs the columns @@ -2647,9 +2645,7 @@ process_packet_second_pass(capture_file *cf, frame_data *fdata, else cinfo = NULL; - epan_dissect_run(&edt, pseudo_header, pd, fdata, cinfo); - - tap_push_tapped_queue(&edt); + epan_dissect_run_with_taps(&edt, pseudo_header, pd, fdata, cinfo); /* Run the read filter if we have one. */ if (cf->rfcode) @@ -3087,8 +3083,6 @@ process_packet(capture_file *cf, gint64 offset, const struct wtap_pkthdr *whdr, col_custom_prime_edt(&edt, &cf->cinfo); - tap_queue_init(&edt); - /* We only need the columns if either 1) some tap needs the columns @@ -3105,9 +3099,7 @@ process_packet(capture_file *cf, gint64 offset, const struct wtap_pkthdr *whdr, frame_data_set_before_dissect(&fdata, &cf->elapsed_time, &first_ts, prev_dis, prev_cap); - epan_dissect_run(&edt, pseudo_header, pd, &fdata, cinfo); - - tap_push_tapped_queue(&edt); + epan_dissect_run_with_taps(&edt, pseudo_header, pd, &fdata, cinfo); /* Run the read filter if we have one. */ if (cf->rfcode) diff --git a/ui/gtk/rlc_lte_graph.c b/ui/gtk/rlc_lte_graph.c index d9f8280..66bd348 100644 --- a/ui/gtk/rlc_lte_graph.c +++ b/ui/gtk/rlc_lte_graph.c @@ -888,9 +888,7 @@ static rlc_lte_tap_info *select_rlc_lte_session(capture_file *cf, struct segment epan_dissect_init(&edt, TRUE, FALSE); epan_dissect_prime_dfilter(&edt, sfcode); - tap_queue_init(&edt); - epan_dissect_run(&edt, &cf->pseudo_header, cf->pd, fdata, NULL); - tap_push_tapped_queue(&edt); + epan_dissect_run_with_taps(&edt, &cf->pseudo_header, cf->pd, fdata, NULL); epan_dissect_cleanup(&edt); remove_tap_listener(&th); diff --git a/ui/gtk/tcp_graph.c b/ui/gtk/tcp_graph.c index 3240701..b745e46 100644 --- a/ui/gtk/tcp_graph.c +++ b/ui/gtk/tcp_graph.c @@ -1935,9 +1935,7 @@ static struct tcpheader *select_tcpip_session (capture_file *cf, struct segment epan_dissect_init(&edt, TRUE, FALSE); epan_dissect_prime_dfilter(&edt, sfcode); - tap_queue_init(&edt); - epan_dissect_run(&edt, &cf->pseudo_header, cf->pd, fdata, NULL); - tap_push_tapped_queue(&edt); + epan_dissect_run_with_taps(&edt, &cf->pseudo_header, cf->pd, fdata, NULL); epan_dissect_cleanup(&edt); remove_tap_listener(&th);
- Follow-Ups:
- Re: [Wireshark-dev] RFD: Limiting scope of ep_ memory
- From: Martin Mathieson
- Re: [Wireshark-dev] RFD: Limiting scope of ep_ memory
- References:
- [Wireshark-dev] RFD: Limiting scope of ep_ memory
- From: Jakub Zawadzki
- Re: [Wireshark-dev] RFD: Limiting scope of ep_ memory
- From: Evan Huus
- Re: [Wireshark-dev] RFD: Limiting scope of ep_ memory
- From: Anders Broman
- [Wireshark-dev] RFD: Limiting scope of ep_ memory
- Prev by Date: Re: [Wireshark-dev] parsing an IPv6 address from a text string
- Next by Date: Re: [Wireshark-dev] RFD: Limiting scope of ep_ memory
- Previous by thread: Re: [Wireshark-dev] RFD: Limiting scope of ep_ memory
- Next by thread: Re: [Wireshark-dev] RFD: Limiting scope of ep_ memory
- Index(es):