aboutsummaryrefslogtreecommitdiffstats
path: root/packet-wsp.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2003-11-19 21:24:19 +0000
committerGuy Harris <guy@alum.mit.edu>2003-11-19 21:24:19 +0000
commit49af7e1586946dec4cf8597bc672a1ea02e9389a (patch)
tree3770a3d11a8d62f8308bb1575568b174edf54f1d /packet-wsp.c
parent6341212165ee55330839b1097280fd4c4dafcf41 (diff)
From Olivier Biot:
correct (and document) the offset computation in the parameter() and parameter_value_q() functions. From Lo�c Minier: - a copy-paste with a missing replacement; - content-disposition uses parameters not q-values; - missing "+" for the calculation of parameter-offsets; - white-space cleanup; - comment fixes. svn path=/trunk/; revision=9038
Diffstat (limited to 'packet-wsp.c')
-rw-r--r--packet-wsp.c63
1 files changed, 42 insertions, 21 deletions
diff --git a/packet-wsp.c b/packet-wsp.c
index 2a3ccb12a4..1f6f50b306 100644
--- a/packet-wsp.c
+++ b/packet-wsp.c
@@ -2,7 +2,7 @@
*
* Routines to dissect WSP component of WAP traffic.
*
- * $Id: packet-wsp.c,v 1.89 2003/11/19 09:43:29 guy Exp $
+ * $Id: packet-wsp.c,v 1.90 2003/11/19 21:24:19 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -49,6 +49,7 @@
#include <epan/packet.h>
#include <epan/ipv6-utils.h>
#include <epan/conversation.h>
+
#include "packet-wap.h"
#include "packet-wsp.h"
@@ -1850,7 +1851,7 @@ add_headers (proto_tree *tree, tvbuff_t *tvb)
#define wkh_2_TextualValue /* Parse Textual Value */ \
/* END */ \
- } else if ((val_id == 0) || (val_id >=0x20)) { /* Textual value */ \
+ } else if ((val_id == 0) || (val_id >= 0x20)) { /* Textual value */ \
val_str = tvb_get_stringz (tvb, val_start, &val_len); \
g_assert(val_str); \
offset = val_start + val_len; \
@@ -1981,10 +1982,9 @@ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start) \
} \
off += len; \
} \
- /* Remember: offset == val_start + val_len */ \
+ /* Remember: offset == val_start + val_len + val_len_len */ \
if (ok && (off < offset)) { /* Add parameters if any */ \
- parameter_tree = proto_item_add_subtree (ti, \
- ett_header); \
+ parameter_tree = proto_item_add_subtree (ti, ett_header); \
while (off < offset) { \
off = parameter (parameter_tree, ti, tvb, off, offset - off); \
} \
@@ -2100,8 +2100,7 @@ add_content_type(proto_tree *tree, tvbuff_t *tvb, guint32 val_start,
} /* else ok = FALSE */
/* Remember: offset == val_start + val_len_len + val_len */
if (ok && (off < offset)) { /* Add parameters if any */
- parameter_tree = proto_item_add_subtree (ti,
- ett_header);
+ parameter_tree = proto_item_add_subtree (ti, ett_header);
while (off < offset) {
off = parameter (parameter_tree, ti, tvb, off, offset - off);
}
@@ -2154,8 +2153,7 @@ wkh_ ## underscored (proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start) \
} /* else ok = FALSE */ \
/* Remember: offset == val_start + val_len */ \
if (ok && (off < offset)) { /* Add Q-value if available */ \
- parameter_tree = proto_item_add_subtree (ti, \
- ett_header); \
+ parameter_tree = proto_item_add_subtree (ti, ett_header); \
off = parameter_value_q (parameter_tree, ti, tvb, off); \
} \
\
@@ -2519,7 +2517,12 @@ wkh_accept_encoding(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
/*
- * Content-disposition-value =
+ * Content-disposition-value = Value-length ( Disposition ) *( Parameter )
+ * Disposition = Form-data | Attachment | Inline | Token-text
+ * Form-data = 0x80
+ * Attachment = 0x81
+ * Inline = 0x82
+ * We handle this as:
* Value-length ( Short-integer | Text-string ) *( Parameter )
*/
static guint32
@@ -2539,7 +2542,7 @@ wkh_content_disposition(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
off = val_start + val_len_len;
peek = tvb_get_guint8(tvb, off);
if (is_short_integer(peek)) {
- switch (val_id) {
+ switch (peek) {
case 0x80: /* form-data */
ti = proto_tree_add_string(tree, hf_hdr_content_disposition,
tvb, hdr_start, offset - hdr_start, "form-data");
@@ -2566,14 +2569,14 @@ wkh_content_disposition(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
}
off += len;
}
- if (ok) {
+ if ((ok) && (off < offset)) {
/* Remember: offset == val_start + val_len_len + val_len */
- while (off < offset) { /* Add Q-value if available */
- parameter_tree = proto_item_add_subtree(ti, ett_header);
- off = parameter_value_q(parameter_tree, ti, tvb, off);
+ parameter_tree = proto_item_add_subtree(ti, ett_header);
+ while (off < offset) { /* Add parameters if available */
+ off = parameter(parameter_tree, ti, tvb, off, offset - off);
}
}
- wkh_4_End(hf_hdr_accept_encoding);
+ wkh_4_End(hf_hdr_content_disposition);
}
@@ -3828,6 +3831,9 @@ wkh_content_type_header(openwave_x_up_proxy_push_accept,
* | Q-value | Version-value | Uri-value )
* | Text-value )
*
+ *
+ * Returns: next offset
+ *
* TODO - Verify byte highlighting in case of invalid parameter values
*/
static int
@@ -3841,7 +3847,10 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len)
gchar *s;
gboolean ok;
- if (is_token_text (peek)) { /* Untyped parameter */
+ if (is_token_text (peek)) {
+ /*
+ * Untyped parameter
+ */
get_token_text (str,tvb,start,val_len,ok); /* Should always succeed */
if (ok) { /* Found a textual parameter name: str */
offset += val_len;
@@ -3884,7 +3893,10 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len)
g_free(str);
}
return offset;
- } /* Else: typed parameter */
+ }
+ /*
+ * Else: Typed parameter
+ */
get_integer_value (type,tvb,start,type_len,ok);
if (!ok) {
proto_tree_add_text (tree, tvb, start, offset - start,
@@ -4038,15 +4050,16 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len)
proto_tree_add_string (tree, hf_wsp_parameter_level,
tvb, start, type_len + val_len, str);
proto_item_append_text (ti, "; level=%s", str);
+ offset += val_len;
} else {
proto_tree_add_text (tree, tvb, start, len - start,
InvalidParameterValue("Level", "Version-value"));
+ offset = start + len; /* Skip to end of buffer */
}
- offset += val_len;
break;
case 0x00: /* WSP 1.1 encoding - Q: Q-value */
- offset += parameter_value_q (tree, ti, tvb, offset);
+ offset = parameter_value_q(tree, ti, tvb, offset);
break;
case 0x07: /* WSP 1.1 encoding - Differences: Field-name */
@@ -4058,6 +4071,9 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len)
case 0x15: /* WSP 1.4 encoding - Read-date: Date-value */
case 0x16: /* WSP 1.4 encoding - Size: Integer-value */
default:
+ proto_tree_add_text(tree, tvb, start, len - start,
+ "Undecoded parameter type 0x%02x - decoding stopped",
+ type);
offset = start + len; /* Skip the parameters */
break;
}
@@ -4065,6 +4081,11 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len)
}
+/*
+ * Dissects the Q-value parameter value.
+ *
+ * Returns: next offset
+ */
static int
parameter_value_q (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start)
{
@@ -4090,7 +4111,7 @@ parameter_value_q (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start)
InvalidParameterValue("Q", "Q-value"));
offset += val_len;
}
- return val_len;
+ return offset;
}