Oren Mazor wrote:
static tvbuff_t *
cleanUpEscapeSequence(tvbuff_t *tvb, packet_info *pinfo)
{
//the original bytes
char* orig_buffer = tvb_memdup(tvb, 0, tvb_length(tvb));
There's no need to copy the original bytes;
char *orig_buffer = tvb_get_ptr(tvb, 0, -1);
should suffice.
//the size of above buffer
int buffer_size = strlen(orig_buffer);
As noted, that's the wrong way to get the size of the buffer; you should
use tvb_length(tvb) instead.
//the size of our new buffer (initially the same as original buffer)
int new_buffer_size = buffer_size;
//buffer to hold the resulting bytes
char* new_buffer[buffer_size];
That will be allocated on the stack, and will not be valid after
"cleanUpEscapeSequence()" returns. Instead, do
char *new_buffer = g_malloc(buffer_size);
("g_malloc()" aborts if the allocation fails; you could also use
"malloc()", but your dissector will need to check for a null pointer
being returned, and quit.)
if(new_buffer_size != buffer_size)
{//we've had a change, if the two buffer size dont match
//create the new tvb
tvbuff_t *next_tvb = tvb_new_real_data(*new_buffer,
new_buffer_size, new_buffer_size);
tvb_set_child_real_data_tvbuff(tvb, next_tvb);
add_new_data_source(pinfo, next_tvb, "Check");
In this case, there's one more thing to do:
tvb_set_free_cb(next_tvb, g_free);
to arrange that when "next_tvb" is freed, the data for it is freed.
(This allows different routines to be used to free the tvbuff.)
return next_tvb;
}
else
return tvb;
And here you'd free "new_buffer", as you aren't creating a new tvbuff.