aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2014-11-22 20:47:59 -0500
committerAnders Broman <a.broman58@gmail.com>2014-11-25 15:18:05 +0000
commite3a04bb392824781b8a3ef6ec98a37ef96c6c827 (patch)
treec51c48f12e302c76bc2c1619d24b9787384db261 /epan
parent7f22ce7f6610333f4b40dfad6cde22e352abae6f (diff)
Ensure dissector data parameter is used instead of pinfo->private_data when passing data between dissectors using the "media_type" subdissector.
Change-Id: I82cbfed770b41404bc42cb6a4413db07d04dffdc Reviewed-on: https://code.wireshark.org/review/5462 Reviewed-by: Michael Mann <mmann78@netscape.net> Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-http.c20
-rw-r--r--epan/dissectors/packet-imf.c8
-rw-r--r--epan/dissectors/packet-isup.c6
-rw-r--r--epan/dissectors/packet-jxta.c11
-rw-r--r--epan/dissectors/packet-msrp.c5
-rw-r--r--epan/dissectors/packet-multipart.c17
-rw-r--r--epan/dissectors/packet-sip.c8
-rw-r--r--epan/dissectors/packet-spdy.c20
8 files changed, 23 insertions, 72 deletions
diff --git a/epan/dissectors/packet-http.c b/epan/dissectors/packet-http.c
index 64c27e8a07..b535d9cb8c 100644
--- a/epan/dissectors/packet-http.c
+++ b/epan/dissectors/packet-http.c
@@ -1267,8 +1267,6 @@ dissect_http_message(tvbuff_t *tvb, int offset, packet_info *pinfo,
* There's stuff left over; process it.
*/
tvbuff_t *next_tvb;
- void *save_private_data = NULL;
- gboolean private_data_changed = FALSE;
gint chunks_decoded = 0;
char *media_str = NULL;
@@ -1434,15 +1432,9 @@ dissect_http_message(tvbuff_t *tvb, int offset, packet_info *pinfo,
* Content-Type value. Is there any subdissector
* for that content type?
*/
- save_private_data = pinfo->private_data;
- private_data_changed = TRUE;
+ if (headers.content_type_parameters)
+ media_str = wmem_strdup(wmem_packet_scope(), headers.content_type_parameters);
- if (headers.content_type_parameters) {
- pinfo->private_data = wmem_strdup(wmem_packet_scope(), headers.content_type_parameters);
- media_str = (char*)pinfo->private_data;
- }
- else
- pinfo->private_data = NULL;
/*
* Calling the string handle for the media type
* dissector table will set pinfo->match_string
@@ -1477,7 +1469,7 @@ dissect_http_message(tvbuff_t *tvb, int offset, packet_info *pinfo,
/*
* We have a subdissector - call it.
*/
- dissected = call_dissector_only(handle, next_tvb, pinfo, tree, NULL);
+ dissected = call_dissector_only(handle, next_tvb, pinfo, tree, media_str);
if (!dissected)
expert_add_info(pinfo, http_tree, &ei_http_subdissector_failed);
}
@@ -1514,12 +1506,6 @@ dissect_http_message(tvbuff_t *tvb, int offset, packet_info *pinfo,
body_dissected:
/*
- * Do *not* attempt at freeing the private data;
- * it may be in use by subdissectors.
- */
- if (private_data_changed) /*restore even NULL value*/
- pinfo->private_data = save_private_data;
- /*
* We've processed "datalen" bytes worth of data
* (which may be no data at all); advance the
* offset past whatever data we've processed.
diff --git a/epan/dissectors/packet-imf.c b/epan/dissectors/packet-imf.c
index 2747c086c7..b8c044101d 100644
--- a/epan/dissectors/packet-imf.c
+++ b/epan/dissectors/packet-imf.c
@@ -806,15 +806,9 @@ dissect_imf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/* now dissect the MIME based upon the content type */
if(content_type_str && media_type_dissector_table) {
- void* pd_save;
- pd_save = pinfo->private_data;
- pinfo->private_data = parameters;
-
next_tvb = tvb_new_subset_remaining(tvb, end_offset);
- dissector_try_string(media_type_dissector_table, content_type_str, next_tvb, pinfo, tree, NULL);
-
- pinfo->private_data = pd_save;
+ dissector_try_string(media_type_dissector_table, content_type_str, next_tvb, pinfo, tree, parameters);
} else {
/* just show the lines or highlight the rest of the buffer as message text */
diff --git a/epan/dissectors/packet-isup.c b/epan/dissectors/packet-isup.c
index a12b1cb06d..8a651dc92e 100644
--- a/epan/dissectors/packet-isup.c
+++ b/epan/dissectors/packet-isup.c
@@ -10684,7 +10684,7 @@ dissect_bicc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
static int
-dissect_application_isup(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+dissect_application_isup(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
/* Set up structures needed to add the protocol subtree and manage it */
proto_item *ti;
@@ -10694,8 +10694,8 @@ dissect_application_isup(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
gchar *content_type_parameter_str;
guint8 itu_isup_variant = ISUP_ITU_STANDARD_VARIANT; /* Default */
- if (pinfo->private_data) {
- content_type_parameter_str = ascii_strdown_inplace((gchar *)pinfo->private_data);
+ if (data) {
+ content_type_parameter_str = ascii_strdown_inplace((gchar *)data);
if (strstr(content_type_parameter_str, "ansi")) {
isup_standard = ANSI_STANDARD;
col_append_str(pinfo->cinfo, COL_PROTOCOL, "/ISUP(ANSI)");
diff --git a/epan/dissectors/packet-jxta.c b/epan/dissectors/packet-jxta.c
index d73d796f03..2e4ec17010 100644
--- a/epan/dissectors/packet-jxta.c
+++ b/epan/dissectors/packet-jxta.c
@@ -2049,16 +2049,12 @@ static int dissect_media( const gchar* fullmediatype, tvbuff_t * tvb, packet_inf
gchar *mediatype = wmem_strdup(wmem_packet_scope(), fullmediatype);
gchar *parms_at = strchr(mediatype, ';');
const char *save_match_string = pinfo->match_string;
- void * save_private_data = pinfo->private_data;
char *media_str = NULL;
/* Based upon what is done in packet-media.c we set up type and params */
if (NULL != parms_at) {
- pinfo->private_data = wmem_strdup( wmem_packet_scope(), parms_at + 1 );
- media_str = (char*)pinfo->private_data;
+ media_str = wmem_strdup( wmem_packet_scope(), parms_at + 1 );
*parms_at = '\0';
- } else {
- pinfo->private_data = NULL;
}
/* Set the version that goes to packet-media.c before converting case */
@@ -2088,7 +2084,7 @@ static int dissect_media( const gchar* fullmediatype, tvbuff_t * tvb, packet_inf
}
}
} else {
- dissected = dissector_try_string(media_type_dissector_table, mediatype, tvb, pinfo, tree, NULL) ? tvb_length(tvb) : 0;
+ dissected = dissector_try_string(media_type_dissector_table, mediatype, tvb, pinfo, tree, media_str) ? tvb_length(tvb) : 0;
if( dissected != (int) tvb_length(tvb) ) {
/* g_message( "%s : %d expected, %d dissected", mediatype, tvb_length(tvb), dissected ); */
@@ -2100,12 +2096,11 @@ static int dissect_media( const gchar* fullmediatype, tvbuff_t * tvb, packet_inf
}
pinfo->match_string = save_match_string;
- pinfo->private_data = save_private_data;
}
if(0 == dissected) {
/* display it as raw data */
- dissected = call_dissector_only(data_handle, tvb, pinfo, tree, NULL);
+ dissected = call_dissector(data_handle, tvb, pinfo, tree);
}
return dissected;
diff --git a/epan/dissectors/packet-msrp.c b/epan/dissectors/packet-msrp.c
index 368c5e5fb0..35ba5152c4 100644
--- a/epan/dissectors/packet-msrp.c
+++ b/epan/dissectors/packet-msrp.c
@@ -689,13 +689,10 @@ dissect_msrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
/* give the content type parameters to sub dissectors */
if ( media_type_str_lower_case != NULL ) {
- void *save_private_data = pinfo->private_data;
- pinfo->private_data = content_type_parameter_str;
found_match = dissector_try_string(media_type_dissector_table,
media_type_str_lower_case,
next_tvb, pinfo,
- msrp_data_tree, NULL);
- pinfo->private_data = save_private_data;
+ msrp_data_tree, content_type_parameter_str);
/* If no match dump as text */
}
if ( found_match != TRUE )
diff --git a/epan/dissectors/packet-multipart.c b/epan/dissectors/packet-multipart.c
index c01722e3c9..2e3afcdeb3 100644
--- a/epan/dissectors/packet-multipart.c
+++ b/epan/dissectors/packet-multipart.c
@@ -395,7 +395,7 @@ static char *find_parameter(char *parameters, const char *key, int *retlen)
* leading hyphens. (quote from rfc2046)
*/
static multipart_info_t *
-get_multipart_info(packet_info *pinfo)
+get_multipart_info(packet_info *pinfo, const char *str)
{
const char *start;
int len = 0;
@@ -404,7 +404,7 @@ get_multipart_info(packet_info *pinfo)
char *parameters;
gint dummy;
- if ((type == NULL) || (pinfo->private_data == NULL)) {
+ if ((type == NULL) || (str == NULL)) {
/*
* We need both a content type AND parameters
* for multipart dissection.
@@ -413,7 +413,7 @@ get_multipart_info(packet_info *pinfo)
}
/* Clean up the parameters */
- parameters = unfold_and_compact_mime_header((const char *)pinfo->private_data, &dummy);
+ parameters = unfold_and_compact_mime_header(str, &dummy);
start = find_parameter(parameters, "boundary=", &len);
@@ -709,7 +709,6 @@ process_body_part(proto_tree *tree, tvbuff_t *tvb, const guint8 *boundary,
/*
* subdissection
*/
- void *save_private_data = pinfo->private_data;
gboolean dissected;
/*
@@ -725,18 +724,17 @@ process_body_part(proto_tree *tree, tvbuff_t *tvb, const guint8 *boundary,
}
- pinfo->private_data = parameters;
/*
* First try the dedicated multipart dissector table
*/
dissected = dissector_try_string(multipart_media_subdissector_table,
- content_type_str, tmp_tvb, pinfo, subtree, NULL);
+ content_type_str, tmp_tvb, pinfo, subtree, parameters);
if (! dissected) {
/*
* Fall back to the default media dissector table
*/
dissected = dissector_try_string(media_type_dissector_table,
- content_type_str, tmp_tvb, pinfo, subtree, NULL);
+ content_type_str, tmp_tvb, pinfo, subtree, parameters);
}
if (! dissected) {
const char *save_match_string = pinfo->match_string;
@@ -744,7 +742,6 @@ process_body_part(proto_tree *tree, tvbuff_t *tvb, const guint8 *boundary,
call_dissector_with_data(media_handle, tmp_tvb, pinfo, subtree, parameters);
pinfo->match_string = save_match_string;
}
- pinfo->private_data = save_private_data;
parameters = NULL; /* Shares same memory as content_type_str */
} else {
call_dissector(data_handle, tmp_tvb, pinfo, subtree);
@@ -772,12 +769,12 @@ process_body_part(proto_tree *tree, tvbuff_t *tvb, const guint8 *boundary,
* Call this method to actually dissect the multipart body.
* NOTE - Only do so if a boundary string has been found!
*/
-static int dissect_multipart(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+static int dissect_multipart(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
proto_tree *subtree;
proto_item *ti;
proto_item *type_ti;
- multipart_info_t *m_info = get_multipart_info(pinfo);
+ multipart_info_t *m_info = get_multipart_info(pinfo, (const char*)data);
gint header_start = 0;
guint8 *boundary;
gint boundary_len;
diff --git a/epan/dissectors/packet-sip.c b/epan/dissectors/packet-sip.c
index d559c4f1a4..8e26934266 100644
--- a/epan/dissectors/packet-sip.c
+++ b/epan/dissectors/packet-sip.c
@@ -3727,9 +3727,6 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
/* give the content type parameters to sub dissectors */
if ( media_type_str_lower_case != NULL ) {
- void *save_private_data = pinfo->private_data;
- pinfo->private_data = content_type_parameter_str;
-
/* SDP needs a transport layer to determine request/response */
if (!strcmp(media_type_str_lower_case, "application/sdp")) {
/* Resends don't count */
@@ -3777,7 +3774,7 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
found_match = dissector_try_string(media_type_dissector_table,
media_type_str_lower_case,
next_tvb, pinfo,
- message_body_tree, NULL);
+ message_body_tree, content_type_parameter_str);
DENDENT();
DPRINT(("done calling dissector_try_string() with found_match=%s",
found_match?"TRUE":"FALSE"));
@@ -3790,12 +3787,11 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
found_match = dissector_try_string(media_type_dissector_table,
"multipart/",
next_tvb, pinfo,
- message_body_tree, NULL);
+ message_body_tree, content_type_parameter_str);
DENDENT();
DPRINT(("done calling dissector_try_string() with found_match=%s",
found_match?"TRUE":"FALSE"));
}
- pinfo->private_data = save_private_data;
/* If no match dump as text */
}
if ( found_match != TRUE )
diff --git a/epan/dissectors/packet-spdy.c b/epan/dissectors/packet-spdy.c
index b6987f0f58..d2aee32869 100644
--- a/epan/dissectors/packet-spdy.c
+++ b/epan/dissectors/packet-spdy.c
@@ -746,9 +746,7 @@ static int dissect_spdy_data_payload(tvbuff_t *tvb,
tvbuff_t *next_tvb = NULL;
tvbuff_t *data_tvb = NULL;
spdy_stream_info_t *si = NULL;
- void *save_private_data = NULL;
guint8 *copied_data;
- gboolean private_data_changed = FALSE;
gboolean is_single_chunk = FALSE;
gboolean have_entire_body;
char *media_str = NULL;
@@ -904,14 +902,8 @@ static int dissect_spdy_data_payload(tvbuff_t *tvb,
* Content-Type value. Is there any subdissector
* for that content type?
*/
- save_private_data = pinfo->private_data;
- private_data_changed = TRUE;
-
if (si->content_type_parameters) {
- pinfo->private_data = wmem_strdup(wmem_packet_scope(), si->content_type_parameters);
- media_str = (char*)pinfo->private_data;
- } else {
- pinfo->private_data = NULL;
+ media_str = wmem_strdup(wmem_packet_scope(), si->content_type_parameters);
}
/*
* Calling the string handle for the media type
@@ -926,7 +918,7 @@ static int dissect_spdy_data_payload(tvbuff_t *tvb,
/*
* We have a subdissector - call it.
*/
- dissected = call_dissector(handle, data_tvb, pinfo, spdy_tree);
+ dissected = call_dissector_with_data(handle, data_tvb, pinfo, spdy_tree, media_str);
} else {
dissected = FALSE;
}
@@ -944,17 +936,11 @@ static int dissect_spdy_data_payload(tvbuff_t *tvb,
body_dissected:
/*
- * Do *not* attempt at freeing the private data;
- * it may be in use by subdissectors.
- */
- if (private_data_changed) { /*restore even NULL value*/
- pinfo->private_data = save_private_data;
- }
- /*
* We've processed frame->length bytes worth of data
* (which may be no data at all); advance the
* offset past whatever data we've processed.
*/
+ ;
}
return frame->length;
}