Introduce two new functions:

tvb_get_seasonal_string();
  tvb_get_seasonal_stringz();

.. which work the same as the ephemeral versions of the functions, but use
se_alloc() instead of ep_alloc().


svn path=/trunk/; revision=27868
This commit is contained in:
Stephen Fisher 2009-03-27 19:40:23 +00:00
parent 411f9c9cf1
commit 1a71ec7c45
3 changed files with 74 additions and 0 deletions

View File

@ -1127,6 +1127,7 @@ String accessors:
guint8 *tvb_get_string(tvbuff_t*, gint offset, gint length); guint8 *tvb_get_string(tvbuff_t*, gint offset, gint length);
guint8 *tvb_get_ephemeral_string(tvbuff_t*, gint offset, gint length); guint8 *tvb_get_ephemeral_string(tvbuff_t*, gint offset, gint length);
guint8 *tvb_get_seasonal_string(tvbuff_t*, gint offset, gint length);
Returns a null-terminated buffer containing data from the specified Returns a null-terminated buffer containing data from the specified
tvbuff, starting at the specified offset, and containing the specified tvbuff, starting at the specified offset, and containing the specified
@ -1136,14 +1137,20 @@ as it includes a null character to terminate the string).
tvb_get_string() returns a buffer allocated by g_malloc() so you must tvb_get_string() returns a buffer allocated by g_malloc() so you must
g_free() it when you are finished with the string. Failure to g_free() this g_free() it when you are finished with the string. Failure to g_free() this
buffer will lead to memory leaks. buffer will lead to memory leaks.
tvb_get_ephemeral_string() returns a buffer allocated from a special heap tvb_get_ephemeral_string() returns a buffer allocated from a special heap
with a lifetime until the next packet is dissected. You do not need to with a lifetime until the next packet is dissected. You do not need to
free() this buffer, it will happen automatically once the next packet is free() this buffer, it will happen automatically once the next packet is
dissected. dissected.
tvb_get_seasonal_string() returns a buffer allocated from a special heap
with a lifetime of the current capture session. You do not need to
free() this buffer, it will happen automatically once the a new capture or
file is opened.
guint8 *tvb_get_stringz(tvbuff_t *tvb, gint offset, gint *lengthp); guint8 *tvb_get_stringz(tvbuff_t *tvb, gint offset, gint *lengthp);
guint8 *tvb_get_ephemeral_stringz(tvbuff_t *tvb, gint offset, gint *lengthp); guint8 *tvb_get_ephemeral_stringz(tvbuff_t *tvb, gint offset, gint *lengthp);
guint8 *tvb_get_seasonal_stringz(tvbuff_t *tvb, gint offset, gint *lengthp);
Returns a null-terminated buffer, allocated with "g_malloc()", Returns a null-terminated buffer, allocated with "g_malloc()",
containing data from the specified tvbuff, starting at the containing data from the specified tvbuff, starting at the
@ -1159,6 +1166,10 @@ with a lifetime until the next packet is dissected. You do not need to
free() this buffer, it will happen automatically once the next packet is free() this buffer, it will happen automatically once the next packet is
dissected. dissected.
tvb_get_seasonal_stringz() returns a buffer allocated from a special heap
with a lifetime of the current capture session. You do not need to
free() this buffer, it will happen automatically once the a new capture or
file is opened.
guint8 *tvb_fake_unicode(tvbuff_t*, gint offset, gint length, gboolean little_endian); guint8 *tvb_fake_unicode(tvbuff_t*, gint offset, gint length, gboolean little_endian);
guint8 *tvb_get_ephemeral_faked_unicode(tvbuff_t*, gint offset, gint length, gboolean little_endian); guint8 *tvb_get_ephemeral_faked_unicode(tvbuff_t*, gint offset, gint length, gboolean little_endian);

View File

@ -2144,6 +2144,34 @@ tvb_get_ephemeral_string(tvbuff_t *tvb, gint offset, gint length)
return strbuf; return strbuf;
} }
/*
* Given a tvbuff, an offset, and a length, allocate a buffer big enough
* to hold a non-null-terminated string of that length at that offset,
* plus a trailing '\0', copy the string into it, and return a pointer
* to the string.
*
* Throws an exception if the tvbuff ends before the string does.
*
* This function allocates memory from a buffer with capture session lifetime.
* You do not have to free this buffer, it will be automatically freed
* when wireshark starts or opens a new capture.
*/
guint8 *
tvb_get_seasonal_string(tvbuff_t *tvb, gint offset, gint length)
{
const guint8 *ptr;
guint8 *strbuf = NULL;
tvb_ensure_bytes_exist(tvb, offset, length);
ptr = ensure_contiguous(tvb, offset, length);
strbuf = se_alloc(length + 1);
if (length != 0) {
memcpy(strbuf, ptr, length);
}
strbuf[length] = '\0';
return strbuf;
}
/* /*
* Given a tvbuff and an offset, with the offset assumed to refer to * Given a tvbuff and an offset, with the offset assumed to refer to
@ -2192,6 +2220,31 @@ tvb_get_ephemeral_stringz(tvbuff_t *tvb, gint offset, gint *lengthp)
return strptr; return strptr;
} }
/*
* Given a tvbuff and an offset, with the offset assumed to refer to
* a null-terminated string, find the length of that string (and throw
* an exception if the tvbuff ends before we find the null), allocate
* a buffer big enough to hold the string, copy the string into it,
* and return a pointer to the string. Also return the length of the
* string (including the terminating null) through a pointer.
*
* This function allocates memory from a buffer with capture session lifetime.
* You do not have to free this buffer, it will be automatically freed
* when wireshark starts or opens a new capture.
*/
guint8 *
tvb_get_seasonal_stringz(tvbuff_t *tvb, gint offset, gint *lengthp)
{
guint size;
guint8 *strptr;
size = tvb_strsize(tvb, offset);
strptr = se_alloc(size);
tvb_memcpy(tvb, strptr, offset, size);
*lengthp = size;
return strptr;
}
/* Looks for a stringz (NUL-terminated string) in tvbuff and copies /* Looks for a stringz (NUL-terminated string) in tvbuff and copies
* no more than bufsize number of bytes, including terminating NUL, to buffer. * no more than bufsize number of bytes, including terminating NUL, to buffer.
* Returns length of string (not including terminating NUL), or -1 if the string was * Returns length of string (not including terminating NUL), or -1 if the string was

View File

@ -460,9 +460,14 @@ extern gchar *tvb_format_stringzpad(tvbuff_t *tvb, gint offset, gint size);
* tvb_get_ephemeral_string() returns a string that does not need to be freed, * tvb_get_ephemeral_string() returns a string that does not need to be freed,
* instead it will automatically be freed once the next * instead it will automatically be freed once the next
* packet is dissected. * packet is dissected.
*
* tvb_get_seasonal_string() returns a string that does not need to be freed,
* instead it will automatically be freed when a new capture
* or file is opened.
*/ */
extern guint8 *tvb_get_string(tvbuff_t *tvb, gint offset, gint length); extern guint8 *tvb_get_string(tvbuff_t *tvb, gint offset, gint length);
extern guint8 *tvb_get_ephemeral_string(tvbuff_t *tvb, gint offset, gint length); extern guint8 *tvb_get_ephemeral_string(tvbuff_t *tvb, gint offset, gint length);
extern guint8 *tvb_get_seasonal_string(tvbuff_t *tvb, gint offset, gint length);
/** /**
@ -480,9 +485,14 @@ extern guint8 *tvb_get_ephemeral_string(tvbuff_t *tvb, gint offset, gint length)
* tvb_get_ephemeral_stringz() returns a string that does not need to be freed, * tvb_get_ephemeral_stringz() returns a string that does not need to be freed,
* instead it will automatically be freed once the next * instead it will automatically be freed once the next
* packet is dissected. * packet is dissected.
*
* tvb_get_seasonal_stringz() returns a string that does not need to be freed,
* instead it will automatically be freed when a new capture
* or file is opened.
*/ */
extern guint8 *tvb_get_stringz(tvbuff_t *tvb, gint offset, gint *lengthp); extern guint8 *tvb_get_stringz(tvbuff_t *tvb, gint offset, gint *lengthp);
extern guint8 *tvb_get_ephemeral_stringz(tvbuff_t *tvb, gint offset, gint *lengthp); extern guint8 *tvb_get_ephemeral_stringz(tvbuff_t *tvb, gint offset, gint *lengthp);
extern guint8 *tvb_get_seasonal_stringz(tvbuff_t *tvb, gint offset, gint *lengthp);
/** Looks for a stringz (NUL-terminated string) in tvbuff and copies /** Looks for a stringz (NUL-terminated string) in tvbuff and copies
* no more than bufsize number of bytes, including terminating NUL, to buffer. * no more than bufsize number of bytes, including terminating NUL, to buffer.