aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorAndersBroman <anders.broman@ericsson.com>2014-04-02 16:18:39 +0200
committerAnders Broman <a.broman58@gmail.com>2014-04-03 04:08:45 +0000
commit67cc46294141ee1af32c5d15080b08a525e0813f (patch)
treecab6fb498e51d78c8883ad2d84604deabaae4e3b /epan
parent84bc050a89c2200f2392630e4281fddfd96b2452 (diff)
Don't use external function internaly to avoid multiple checks.
tvb_captured_length() -> tvb->length tvb_captured_length_remaining(tvb, offset) -> (Inline) _tvb_captured_length_remaining() tvb_get_ptr() -> ensure_contiguous() Change-Id: I3540854c9b51ca9c3319b030c7d91b4aff976a26 Reviewed-on: https://code.wireshark.org/review/922 Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r--epan/tvbuff.c59
1 files changed, 48 insertions, 11 deletions
diff --git a/epan/tvbuff.c b/epan/tvbuff.c
index 95f787cde5..cedf17365e 100644
--- a/epan/tvbuff.c
+++ b/epan/tvbuff.c
@@ -51,6 +51,12 @@
static guint64
_tvb_get_bits64(tvbuff_t *tvb, guint bit_offset, const gint total_no_of_bits);
+static inline gint
+_tvb_captured_length_remaining(const tvbuff_t *tvb, const gint offset);
+
+static inline const guint8*
+ensure_contiguous(tvbuff_t *tvb, const gint offset, const gint length);
+
tvbuff_t *
tvb_new(const struct tvb_ops *ops)
{
@@ -297,12 +303,14 @@ tvb_new_octet_aligned(tvbuff_t *tvb, guint32 bit_offset, gint32 no_of_bits)
guint8 left, right, remaining_bits, *buf;
const guint8 *data;
+ DISSECTOR_ASSERT(tvb && tvb->initialized);
+
byte_offset = bit_offset >> 3;
left = bit_offset % 8; /* for left-shifting */
right = 8 - left; /* for right-shifting */
if (no_of_bits == -1) {
- datalen = tvb_captured_length_remaining(tvb, byte_offset);
+ datalen = _tvb_captured_length_remaining(tvb, byte_offset);
remaining_bits = 0;
} else {
datalen = no_of_bits >> 3;
@@ -324,8 +332,8 @@ tvb_new_octet_aligned(tvbuff_t *tvb, guint32 bit_offset, gint32 no_of_bits)
* if non extra byte is available, the last shifted byte requires
* special treatment
*/
- if (tvb_captured_length_remaining(tvb, byte_offset) > datalen) {
- data = tvb_get_ptr(tvb, byte_offset, datalen + 1);
+ if (_tvb_captured_length_remaining(tvb, byte_offset) > datalen) {
+ data = ensure_contiguous(tvb, byte_offset, datalen + 1); /* tvb_get_ptr */
/* Do this allocation AFTER tvb_get_ptr() (which could throw an exception) */
buf = (guint8 *)g_malloc(datalen);
@@ -334,7 +342,7 @@ tvb_new_octet_aligned(tvbuff_t *tvb, guint32 bit_offset, gint32 no_of_bits)
for (i = 0; i < datalen; i++)
buf[i] = (data[i] << left) | (data[i+1] >> right);
} else {
- data = tvb_get_ptr(tvb, byte_offset, datalen);
+ data = ensure_contiguous(tvb, byte_offset, datalen); /* tvb_get_ptr() */
/* Do this allocation AFTER tvb_get_ptr() (which could throw an exception) */
buf = (guint8 *)g_malloc(datalen);
@@ -395,6 +403,20 @@ tvb_captured_length(const tvbuff_t *tvb)
return tvb->length;
}
+/* For tvbuff internal use */
+static inline gint
+_tvb_captured_length_remaining(const tvbuff_t *tvb, const gint offset)
+{
+ guint abs_offset, rem_length;
+ int exception;
+
+ exception = compute_offset_and_remaining(tvb, offset, &abs_offset, &rem_length);
+ if (exception)
+ return 0;
+
+ return rem_length;
+}
+
gint
tvb_captured_length_remaining(const tvbuff_t *tvb, const gint offset)
{
@@ -1444,7 +1466,7 @@ tvb_find_guint8_generic(tvbuff_t *tvb, guint abs_offset, guint limit, guint8 nee
const guint8 *ptr;
const guint8 *result;
- ptr = tvb_get_ptr(tvb, abs_offset, limit);
+ ptr = ensure_contiguous(tvb, abs_offset, limit); /* tvb_get_ptr() */
result = (const guint8 *) memchr(ptr, needle, limit);
if (!result)
@@ -1511,7 +1533,7 @@ tvb_pbrk_guint8_generic(tvbuff_t *tvb, guint abs_offset, guint limit, const guin
const guint8 *ptr;
const guint8 *result;
- ptr = tvb_get_ptr(tvb, abs_offset, limit);
+ ptr = ensure_contiguous(tvb, abs_offset, limit); /* tvb_get_ptr */
result = guint8_pbrk(ptr, limit, needles, found_needle);
if (!result)
@@ -2954,8 +2976,10 @@ tvb_find_line_end(tvbuff_t *tvb, const gint offset, int len, gint *next_offset,
int linelen;
guchar found_needle = 0;
+ DISSECTOR_ASSERT(tvb && tvb->initialized);
+
if (len == -1)
- len = tvb_captured_length_remaining(tvb, offset);
+ len = _tvb_captured_length_remaining(tvb, offset);
/*
* XXX - what if "len" is still -1, meaning "offset is past the
* end of the tvbuff"?
@@ -3070,8 +3094,10 @@ tvb_find_line_end_unquoted(tvbuff_t *tvb, const gint offset, int len, gint *next
gint eob_offset;
int linelen;
+ DISSECTOR_ASSERT(tvb && tvb->initialized);
+
if (len == -1)
- len = tvb_captured_length_remaining(tvb, offset);
+ len = _tvb_captured_length_remaining(tvb, offset);
/*
* XXX - what if "len" is still -1, meaning "offset is past the
* end of the tvbuff"?
@@ -3208,8 +3234,12 @@ tvb_skip_wsp(tvbuff_t *tvb, const gint offset, const gint maxlength)
gint end, tvb_len;
guint8 tempchar;
+ DISSECTOR_ASSERT(tvb && tvb->initialized);
+
/* Get the length remaining */
- tvb_len = tvb_captured_length(tvb);
+ /*tvb_len = tvb_captured_length(tvb);*/
+ tvb_len = tvb->length;
+
end = offset + maxlength;
if (end >= tvb_len)
{
@@ -3243,8 +3273,12 @@ tvb_skip_guint8(tvbuff_t *tvb, int offset, const int maxlength, const guint8 ch)
{
int end, tvb_len;
+ DISSECTOR_ASSERT(tvb && tvb->initialized);
+
/* Get the length remaining */
- tvb_len = tvb_captured_length(tvb);
+ /*tvb_len = tvb_captured_length(tvb);*/
+ tvb_len = tvb->length;
+
end = offset + maxlength;
if (end >= tvb_len)
end = tvb_len;
@@ -3296,11 +3330,14 @@ tvb_bcd_dig_to_wmem_packet_str(tvbuff_t *tvb, const gint offset, const gint len,
char *digit_str;
gint t_offset = offset;
+ DISSECTOR_ASSERT(tvb && tvb->initialized);
+
if (!dgt)
dgt = &Dgt1_9_bcd;
if (len == -1) {
- length = tvb_captured_length(tvb);
+ /*length = tvb_captured_length(tvb);*/
+ length = tvb->length;
if (length < offset) {
return "";
}