Do not use ephemeral memory when adding a new data source

svn path=/trunk/; revision=51423
This commit is contained in:
Pascal Quantin 2013-08-19 10:39:43 +00:00
parent b38ec03858
commit 81b6d6aab3
11 changed files with 38 additions and 19 deletions

View File

@ -572,7 +572,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
saved_offset = offset - 1;
i = num_fields * 7;
required_octs = (i / 8) + ((i % 8) ? 1 : 0);
buf = (gchar*)ep_alloc(required_octs);
buf = (gchar*)g_malloc(required_octs);
for (i=0; i < required_octs; i++)
{
oct = tvb_get_guint8(tvb, saved_offset);
@ -581,6 +581,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
saved_offset++;
}
tvb_out = tvb_new_child_real_data(tvb, buf, required_octs, required_octs);
tvb_set_free_cb(tvb_out, g_free);
add_new_data_source(g_pinfo, tvb_out, "Characters");
offset = 0;
bit = 0;
@ -634,7 +635,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
saved_offset = offset - 1;
i = num_fields * 7;
required_octs = (i / 8) + ((i % 8) ? 1 : 0);
buf = (gchar*)ep_alloc(required_octs);
buf = (gchar*)g_malloc(required_octs);
for (i=0; i < required_octs; i++)
{
oct = tvb_get_guint8(tvb, saved_offset);
@ -643,6 +644,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
saved_offset++;
}
tvb_out = tvb_new_child_real_data(tvb, buf, required_octs, required_octs);
tvb_set_free_cb(tvb_out, g_free);
add_new_data_source(g_pinfo, tvb_out, "Characters");
offset = 0;
bit = 0;
@ -664,7 +666,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
{
saved_offset = offset - 1;
required_octs = 2*num_fields;
buf = (gchar*)ep_alloc(required_octs);
buf = (gchar*)g_malloc(required_octs);
for (i=0; i < required_octs; i++)
{
oct = tvb_get_guint8(tvb, saved_offset);
@ -673,6 +675,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
saved_offset++;
}
tvb_out = tvb_new_child_real_data(tvb, buf, required_octs, required_octs);
tvb_set_free_cb(tvb_out, g_free);
add_new_data_source(g_pinfo, tvb_out, "Characters");
offset = 0;
if (g_pinfo->private_data && (GPOINTER_TO_UINT(g_pinfo->private_data) == TRUE)) {
@ -699,7 +702,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
else if (encoding == 0x07)/* Latin/Hebrew */
{
saved_offset = offset - 1;
buf = (gchar*)ep_alloc(num_fields);
buf = (gchar*)g_malloc(num_fields);
for (i=0; i < num_fields; i++)
{
oct = tvb_get_guint8(tvb, saved_offset);
@ -708,6 +711,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
saved_offset++;
}
tvb_out = tvb_new_child_real_data(tvb, buf, num_fields, num_fields);
tvb_set_free_cb(tvb_out, g_free);
add_new_data_source(g_pinfo, tvb_out, "Characters");
offset = 0;
required_octs = len - used;
@ -735,7 +739,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
else if (encoding == 0x08) /* ISO 8859-1 (a/k/a ISO Latin 1) */
{
saved_offset = offset - 1;
buf = (gchar*)ep_alloc(num_fields);
buf = (gchar*)g_malloc(num_fields);
for (i=0; i < num_fields; i++)
{
oct = tvb_get_guint8(tvb, saved_offset);
@ -744,6 +748,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
saved_offset++;
}
tvb_out = tvb_new_child_real_data(tvb, buf, num_fields, num_fields);
tvb_set_free_cb(tvb_out, g_free);
add_new_data_source(g_pinfo, tvb_out, "Characters");
offset = 0;
required_octs = len - used;
@ -785,7 +790,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
saved_offset = offset - 1;
i = num_fields * 7;
required_octs = (i / 8) + ((i % 8) ? 1 : 0);
buf = (gchar*)ep_alloc(required_octs);
buf = (gchar*)g_malloc(required_octs);
for (i=0; i < required_octs; i++)
{
oct = tvb_get_guint8(tvb, saved_offset);
@ -794,6 +799,7 @@ tele_param_user_data(tvbuff_t *tvb, proto_tree *tree, guint len, guint32 offset)
saved_offset++;
}
tvb_out = tvb_new_child_real_data(tvb, buf, required_octs, required_octs);
tvb_set_free_cb(tvb_out, g_free);
add_new_data_source(g_pinfo, tvb_out, "Characters");
offset = 0;
bit = 0;

View File

@ -11956,7 +11956,7 @@ dissect_sip_dtap_bsmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if ((linelen = tvb_find_line_end(tvb, offset, -1, &next_offset, TRUE)) > 0) {
if (linelen >= 2) {
ansi_a_tvb = tvb_new_composite();
msg_type = (guint8*)wmem_alloc(wmem_packet_scope(), 1);
msg_type = (guint8*)wmem_alloc(pinfo->pool, 1);
msg_type[0] = (guint8)strtoul(tvb_get_ephemeral_string(tvb, offset, 2), NULL, 16);
if ((begin = tvb_find_guint8(tvb, offset, linelen, '"')) > 0) {
if (tvb_get_guint8(tvb, begin + 1) == '1') {

View File

@ -103,7 +103,7 @@ dissect_bmc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
/* Needs bit-reversing. Create a new buffer, copy the message to it and bit-reverse */
len = tvb_length(tvb);
reversing_buffer = (guint8 *)ep_tvb_memdup(tvb, offset, len);
reversing_buffer = (guint8 *)tvb_memdup(tvb, offset, len);
p_rev = reversing_buffer;
/* Entire message is bit reversed */
for (i=0; i<len; i++, p_rev++)
@ -111,6 +111,7 @@ dissect_bmc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
/* Make this new buffer part of the display and provide a way to dispose of it */
bit_reversed_tvb = tvb_new_child_real_data(tvb, reversing_buffer, len, len);
tvb_set_free_cb(bit_reversed_tvb, g_free);
add_new_data_source(pinfo, bit_reversed_tvb, "Bit-reversed Data");
message_type = tvb_get_guint8(bit_reversed_tvb, offset);

View File

@ -254,7 +254,7 @@ tvbuff_t * dissect_cbs_data(guint8 sms_encoding, tvbuff_t *tvb, proto_tree *tree
tvbuff_t * tvb_out = NULL;
guint8 out_len;
int length = tvb_length(tvb) - offset;
gchar *utf8_text = NULL;
gchar *utf8_text = NULL, *utf8_out;
static unsigned char msgbuf[1024];
guint8 * input_string = tvb_get_ephemeral_string(tvb, offset, length);
GIConv cd;
@ -268,7 +268,9 @@ tvbuff_t * dissect_cbs_data(guint8 sms_encoding, tvbuff_t *tvb, proto_tree *tree
msgbuf);
msgbuf[out_len] = '\0';
utf8_text = gsm_sms_chars_to_utf8(msgbuf, out_len);
tvb_out = tvb_new_child_real_data(tvb, utf8_text, out_len, out_len);
utf8_out = g_strdup(utf8_text);
tvb_out = tvb_new_child_real_data(tvb, utf8_out, out_len, out_len);
tvb_set_free_cb(tvb_out, g_free);
add_new_data_source(pinfo, tvb_out, "unpacked 7 bit data");
break;

View File

@ -7981,10 +7981,11 @@ dissect_packet_data(tvbuff_t *tvb ,tvbuff_t *auth_tvb _U_,
}
crypt_rc4_init(&rc4state,vars->encryption_key,16);
crypt_rc4(&rc4state,(guint8*)&copyconfounder,8);
decrypted = (guint8*)ep_tvb_memdup(tvb, offset,data_len);
decrypted = (guint8*)tvb_memdup(tvb, offset,data_len);
crypt_rc4_init(&rc4state,vars->encryption_key,16);
crypt_rc4(&rc4state,decrypted,data_len);
buf = tvb_new_child_real_data(tvb, decrypted, data_len, data_len);
tvb_set_free_cb(buf, g_free);
/* Note: caller does add_new_data_source(...) */
}
else {

View File

@ -504,10 +504,10 @@ dissect_lapsat(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if ((plen + hlen) == tvb_length(tvb)) {
/* Need to integrate the last nibble */
guint8 *data = (guint8 *)ep_alloc(plen);
tvb_memcpy(tvb, data, hlen, plen);
guint8 *data = (guint8 *)tvb_memdup(tvb, hlen, plen);
data[plen-1] |= tvb_get_guint8(tvb, 2) << 4;
payload = tvb_new_child_real_data(tvb, data, plen, plen);
tvb_set_free_cb(payload, g_free);
} else {
/* Last nibble doesn't need merging */
payload = tvb_new_subset(tvb, hlen, plen, -1);

View File

@ -45,6 +45,7 @@
#include <epan/prefs.h>
#include <epan/etypes.h>
#include <epan/emem.h>
#include <epan/wmem/wmem.h>
#include <epan/expert.h>
#include <epan/reassemble.h>
#include <epan/strutil.h>
@ -1802,7 +1803,8 @@ opensafety_package_dissector(const gchar *protocolName, const gchar *sub_diss_ha
}
reported_len = tvb_reported_length_remaining(given_tvb, 0);
bytes = (guint8 *) ep_tvb_memdup(given_tvb, 0, length);
bytes = (guint8 *) wmem_alloc(pinfo->pool, length);
tvb_memcpy(given_tvb, bytes, 0, length);
if ( do_byte_swap == TRUE && global_mbtcp_big_endian == TRUE )
{

View File

@ -488,7 +488,7 @@ static tvbuff_t* reassembly_get_reassembled_tvb(rlc_channel_reassembly_info *rea
for (n=0; n < reassembly_info->number_of_segments; n++) {
combined_length += reassembly_info->segments[n].length;
}
combined_data = (guint8 *)ep_alloc(combined_length);
combined_data = (guint8 *)g_malloc(combined_length);
/* Copy data into contiguous buffer */
for (n=0; n < reassembly_info->number_of_segments; n++) {
@ -500,6 +500,7 @@ static tvbuff_t* reassembly_get_reassembled_tvb(rlc_channel_reassembly_info *rea
/* Create and return tvb with this data */
reassembled_tvb = tvb_new_child_real_data(parent_tvb, combined_data, combined_offset, combined_offset);
tvb_set_free_cb(reassembled_tvb, g_free);
add_new_data_source(pinfo, reassembled_tvb, "Reassembled SDU");
return reassembled_tvb;
}

View File

@ -2295,10 +2295,11 @@ start_over:
len = tvb_length_remaining(tvb, offset);
if (len >= val_len) {
len -= val_len;
data = (guint8 *)ep_alloc(len);
data = (guint8 *)g_malloc(len);
tvb_memcpy(tvb, data, offset, 1);
tvb_memcpy(tvb, &data[1], offset+1+val_len, len-1);
next_tvb = tvb_new_child_real_data(tvb, data, len, len);
tvb_set_free_cb(next_tvb, g_free);
add_new_data_source(pinfo, next_tvb, "Payload");
}
}

View File

@ -1696,7 +1696,7 @@ snmp_usm_priv_des(snmp_usm_params_t* p _U_, tvbuff_t* encryptedData _U_, gchar c
cryptgrm = (guint8*)ep_tvb_memdup(encryptedData,0,-1);
cleartext = (guint8*)ep_alloc(cryptgrm_len);
cleartext = (guint8*)g_malloc(cryptgrm_len);
err = gcry_cipher_open(&hd, GCRY_CIPHER_DES, GCRY_CIPHER_MODE_CBC, 0);
if (err != GPG_ERR_NO_ERROR) goto on_gcry_error;
@ -1713,10 +1713,12 @@ snmp_usm_priv_des(snmp_usm_params_t* p _U_, tvbuff_t* encryptedData _U_, gchar c
gcry_cipher_close(hd);
clear_tvb = tvb_new_child_real_data(encryptedData, cleartext, cryptgrm_len, cryptgrm_len);
tvb_set_free_cb(clear_tvb, g_free);
return clear_tvb;
on_gcry_error:
g_free(cleartext);
*error = (const gchar *)gpg_strerror(err);
if (hd) gcry_cipher_close(hd);
return NULL;
@ -1766,7 +1768,7 @@ snmp_usm_priv_aes_common(snmp_usm_params_t* p, tvbuff_t* encryptedData, gchar co
}
cryptgrm = (guint8*)ep_tvb_memdup(encryptedData,0,-1);
cleartext = (guint8*)ep_alloc(cryptgrm_len);
cleartext = (guint8*)g_malloc(cryptgrm_len);
err = gcry_cipher_open(&hd, algo, GCRY_CIPHER_MODE_CFB, 0);
if (err != GPG_ERR_NO_ERROR) goto on_gcry_error;
@ -1783,10 +1785,12 @@ snmp_usm_priv_aes_common(snmp_usm_params_t* p, tvbuff_t* encryptedData, gchar co
gcry_cipher_close(hd);
clear_tvb = tvb_new_child_real_data(encryptedData, cleartext, cryptgrm_len, cryptgrm_len);
tvb_set_free_cb(clear_tvb, g_free);
return clear_tvb;
on_gcry_error:
g_free(cleartext);
*error = (const gchar *)gpg_strerror(err);
if (hd) gcry_cipher_close(hd);
return NULL;

View File

@ -236,8 +236,9 @@ static gboolean dissect_xml_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
dissect_xml(tvb, pinfo, tree);
return TRUE;
} else if (pref_heuristic_unicode) {
const guint8 *data_str = tvb_get_ephemeral_unicode_string(tvb, 0, tvb_length(tvb), ENC_LITTLE_ENDIAN);
const guint8 *data_str = tvb_get_unicode_string(tvb, 0, tvb_length(tvb), ENC_LITTLE_ENDIAN);
tvbuff_t *unicode_tvb = tvb_new_child_real_data(tvb, data_str, tvb_length(tvb)/2, tvb_length(tvb)/2);
tvb_set_free_cb(unicode_tvb, g_free);
if (tvbparse_peek(tvbparse_init(unicode_tvb, 0, -1, NULL, want_ignore), want_heur)) {
add_new_data_source(pinfo, unicode_tvb, "UTF8");
dissect_xml(unicode_tvb, pinfo, tree);