forked from osmocom/wireshark
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:
parent
6341212165
commit
49af7e1586
63
packet-wsp.c
63
packet-wsp.c
|
@ -2,7 +2,7 @@
|
||||||
*
|
*
|
||||||
* Routines to dissect WSP component of WAP traffic.
|
* 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
|
* Ethereal - Network traffic analyzer
|
||||||
* By Gerald Combs <gerald@ethereal.com>
|
* By Gerald Combs <gerald@ethereal.com>
|
||||||
|
@ -49,6 +49,7 @@
|
||||||
#include <epan/packet.h>
|
#include <epan/packet.h>
|
||||||
#include <epan/ipv6-utils.h>
|
#include <epan/ipv6-utils.h>
|
||||||
#include <epan/conversation.h>
|
#include <epan/conversation.h>
|
||||||
|
|
||||||
#include "packet-wap.h"
|
#include "packet-wap.h"
|
||||||
#include "packet-wsp.h"
|
#include "packet-wsp.h"
|
||||||
|
|
||||||
|
@ -1850,7 +1851,7 @@ add_headers (proto_tree *tree, tvbuff_t *tvb)
|
||||||
|
|
||||||
#define wkh_2_TextualValue /* Parse Textual Value */ \
|
#define wkh_2_TextualValue /* Parse Textual Value */ \
|
||||||
/* END */ \
|
/* 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); \
|
val_str = tvb_get_stringz (tvb, val_start, &val_len); \
|
||||||
g_assert(val_str); \
|
g_assert(val_str); \
|
||||||
offset = val_start + val_len; \
|
offset = val_start + val_len; \
|
||||||
|
@ -1981,10 +1982,9 @@ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start) \
|
||||||
} \
|
} \
|
||||||
off += len; \
|
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 */ \
|
if (ok && (off < offset)) { /* Add parameters if any */ \
|
||||||
parameter_tree = proto_item_add_subtree (ti, \
|
parameter_tree = proto_item_add_subtree (ti, ett_header); \
|
||||||
ett_header); \
|
|
||||||
while (off < offset) { \
|
while (off < offset) { \
|
||||||
off = parameter (parameter_tree, ti, tvb, off, offset - off); \
|
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 */
|
} /* else ok = FALSE */
|
||||||
/* Remember: offset == val_start + val_len_len + val_len */
|
/* Remember: offset == val_start + val_len_len + val_len */
|
||||||
if (ok && (off < offset)) { /* Add parameters if any */
|
if (ok && (off < offset)) { /* Add parameters if any */
|
||||||
parameter_tree = proto_item_add_subtree (ti,
|
parameter_tree = proto_item_add_subtree (ti, ett_header);
|
||||||
ett_header);
|
|
||||||
while (off < offset) {
|
while (off < offset) {
|
||||||
off = parameter (parameter_tree, ti, tvb, off, offset - off);
|
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 */ \
|
} /* else ok = FALSE */ \
|
||||||
/* Remember: offset == val_start + val_len */ \
|
/* Remember: offset == val_start + val_len */ \
|
||||||
if (ok && (off < offset)) { /* Add Q-value if available */ \
|
if (ok && (off < offset)) { /* Add Q-value if available */ \
|
||||||
parameter_tree = proto_item_add_subtree (ti, \
|
parameter_tree = proto_item_add_subtree (ti, ett_header); \
|
||||||
ett_header); \
|
|
||||||
off = parameter_value_q (parameter_tree, ti, tvb, off); \
|
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 )
|
* Value-length ( Short-integer | Text-string ) *( Parameter )
|
||||||
*/
|
*/
|
||||||
static guint32
|
static guint32
|
||||||
|
@ -2539,7 +2542,7 @@ wkh_content_disposition(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
|
||||||
off = val_start + val_len_len;
|
off = val_start + val_len_len;
|
||||||
peek = tvb_get_guint8(tvb, off);
|
peek = tvb_get_guint8(tvb, off);
|
||||||
if (is_short_integer(peek)) {
|
if (is_short_integer(peek)) {
|
||||||
switch (val_id) {
|
switch (peek) {
|
||||||
case 0x80: /* form-data */
|
case 0x80: /* form-data */
|
||||||
ti = proto_tree_add_string(tree, hf_hdr_content_disposition,
|
ti = proto_tree_add_string(tree, hf_hdr_content_disposition,
|
||||||
tvb, hdr_start, offset - hdr_start, "form-data");
|
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;
|
off += len;
|
||||||
}
|
}
|
||||||
if (ok) {
|
if ((ok) && (off < offset)) {
|
||||||
/* Remember: offset == val_start + val_len_len + val_len */
|
/* 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);
|
||||||
parameter_tree = proto_item_add_subtree(ti, ett_header);
|
while (off < offset) { /* Add parameters if available */
|
||||||
off = parameter_value_q(parameter_tree, ti, tvb, off);
|
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 )
|
* | Q-value | Version-value | Uri-value )
|
||||||
* | Text-value )
|
* | Text-value )
|
||||||
*
|
*
|
||||||
|
*
|
||||||
|
* Returns: next offset
|
||||||
|
*
|
||||||
* TODO - Verify byte highlighting in case of invalid parameter values
|
* TODO - Verify byte highlighting in case of invalid parameter values
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
|
@ -3841,7 +3847,10 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len)
|
||||||
gchar *s;
|
gchar *s;
|
||||||
gboolean ok;
|
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 */
|
get_token_text (str,tvb,start,val_len,ok); /* Should always succeed */
|
||||||
if (ok) { /* Found a textual parameter name: str */
|
if (ok) { /* Found a textual parameter name: str */
|
||||||
offset += val_len;
|
offset += val_len;
|
||||||
|
@ -3884,7 +3893,10 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len)
|
||||||
g_free(str);
|
g_free(str);
|
||||||
}
|
}
|
||||||
return offset;
|
return offset;
|
||||||
} /* Else: typed parameter */
|
}
|
||||||
|
/*
|
||||||
|
* Else: Typed parameter
|
||||||
|
*/
|
||||||
get_integer_value (type,tvb,start,type_len,ok);
|
get_integer_value (type,tvb,start,type_len,ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
proto_tree_add_text (tree, tvb, start, offset - start,
|
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,
|
proto_tree_add_string (tree, hf_wsp_parameter_level,
|
||||||
tvb, start, type_len + val_len, str);
|
tvb, start, type_len + val_len, str);
|
||||||
proto_item_append_text (ti, "; level=%s", str);
|
proto_item_append_text (ti, "; level=%s", str);
|
||||||
|
offset += val_len;
|
||||||
} else {
|
} else {
|
||||||
proto_tree_add_text (tree, tvb, start, len - start,
|
proto_tree_add_text (tree, tvb, start, len - start,
|
||||||
InvalidParameterValue("Level", "Version-value"));
|
InvalidParameterValue("Level", "Version-value"));
|
||||||
|
offset = start + len; /* Skip to end of buffer */
|
||||||
}
|
}
|
||||||
offset += val_len;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x00: /* WSP 1.1 encoding - Q: Q-value */
|
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;
|
break;
|
||||||
|
|
||||||
case 0x07: /* WSP 1.1 encoding - Differences: Field-name */
|
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 0x15: /* WSP 1.4 encoding - Read-date: Date-value */
|
||||||
case 0x16: /* WSP 1.4 encoding - Size: Integer-value */
|
case 0x16: /* WSP 1.4 encoding - Size: Integer-value */
|
||||||
default:
|
default:
|
||||||
|
proto_tree_add_text(tree, tvb, start, len - start,
|
||||||
|
"Undecoded parameter type 0x%02x - decoding stopped",
|
||||||
|
type);
|
||||||
offset = start + len; /* Skip the parameters */
|
offset = start + len; /* Skip the parameters */
|
||||||
break;
|
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
|
static int
|
||||||
parameter_value_q (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start)
|
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"));
|
InvalidParameterValue("Q", "Q-value"));
|
||||||
offset += val_len;
|
offset += val_len;
|
||||||
}
|
}
|
||||||
return val_len;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue