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
This commit is contained in:
Guy Harris 2003-11-19 21:24:19 +00:00
parent 6341212165
commit 49af7e1586
1 changed files with 42 additions and 21 deletions

View File

@ -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;
}