From Olivier Biot:
* Fix an incorrectly #ifdef'ed return introduced by the previous patch * Remove the parsed_length parameter from the function signature of the tag and attribute dissectors - have it return the parsed length, instead * Throw ReportedBoundsError exceptions if we run past the end of the tvbuff, rather than putting a special entry in * Produce consistent and extensive debug logging (enabled by defining DEBUG_wbxml) * Get rid of the dozens of "#ifdef DEBUG ... #endif" constructs for debug logging svn path=/trunk/; revision=9047
This commit is contained in:
parent
f42de5c9b2
commit
e4080b8a02
361
packet-wbxml.c
361
packet-wbxml.c
|
@ -2,7 +2,7 @@
|
||||||
* Routines for wbxml dissection
|
* Routines for wbxml dissection
|
||||||
* Copyright 2003, Olivier Biot <olivier.biot (ad) siemens.com>
|
* Copyright 2003, Olivier Biot <olivier.biot (ad) siemens.com>
|
||||||
*
|
*
|
||||||
* $Id: packet-wbxml.c,v 1.13 2003/11/19 22:55:27 guy Exp $
|
* $Id: packet-wbxml.c,v 1.14 2003/11/20 22:24:15 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,21 @@
|
||||||
/* We need the function tvb_get_guintvar() */
|
/* We need the function tvb_get_guintvar() */
|
||||||
#include "packet-wap.h"
|
#include "packet-wap.h"
|
||||||
|
|
||||||
|
/* General-purpose debug logger.
|
||||||
|
* Requires double parentheses because of variable arguments of printf().
|
||||||
|
*
|
||||||
|
* Enable debug logging for WBXML by defining AM_FLAGS
|
||||||
|
* so that it contains "-DDEBUG_wbxml"
|
||||||
|
*/
|
||||||
|
#ifdef DEBUG_wbxml
|
||||||
|
#define DebugLog(x) \
|
||||||
|
printf("%s:%u: ", __FILE__, __LINE__); \
|
||||||
|
printf x; \
|
||||||
|
fflush(stdout)
|
||||||
|
#else
|
||||||
|
#define DebugLog(x) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The code in this source file dissects the WAP Binary XML content,
|
/* The code in this source file dissects the WAP Binary XML content,
|
||||||
* and if possible renders it. WBXML mappings are defined in the
|
* and if possible renders it. WBXML mappings are defined in the
|
||||||
* "wbxml_map[]" array.
|
* "wbxml_map[]" array.
|
||||||
|
@ -1744,6 +1759,12 @@ static const wbxml_token_map map[] = {
|
||||||
* 4. If exists, retrieve token mapping
|
* 4. If exists, retrieve token mapping
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define wbxml_UNDEFINED_TOKEN \
|
||||||
|
"(Requested token not defined for this content type)"
|
||||||
|
#define wbxml_UNDEFINED_TOKEN_CODE_PAGE \
|
||||||
|
"(Requested token code page not defined for this content type)"
|
||||||
|
#define wbxml_UNDEFINED_TOKEN_MAP \
|
||||||
|
"(Requested token map not defined for this content type)"
|
||||||
/* Return token mapping for a given content mapping entry. */
|
/* Return token mapping for a given content mapping entry. */
|
||||||
static const char *
|
static const char *
|
||||||
map_token (const value_valuestring *token_map, guint8 codepage, guint8 token) {
|
map_token (const value_valuestring *token_map, guint8 codepage, guint8 token) {
|
||||||
|
@ -1754,16 +1775,24 @@ map_token (const value_valuestring *token_map, guint8 codepage, guint8 token) {
|
||||||
if ((vs = val_to_valstr (codepage, token_map))) {
|
if ((vs = val_to_valstr (codepage, token_map))) {
|
||||||
/* Found codepage map */
|
/* Found codepage map */
|
||||||
s = match_strval (token, vs);
|
s = match_strval (token, vs);
|
||||||
if (s) /* Found valid token */
|
if (s) { /* Found valid token */
|
||||||
|
DebugLog(("map_token(codepage = %u, token = %u: [%s]\n", codepage, token, s));
|
||||||
return s;
|
return s;
|
||||||
|
}
|
||||||
/* No valid token mapping in specified code page of token map */
|
/* No valid token mapping in specified code page of token map */
|
||||||
return "(Requested token not defined for this content type)";
|
DebugLog(("map_token(codepage = %u, token = %u: "
|
||||||
|
wbxml_UNDEFINED_TOKEN "\n", codepage, token));
|
||||||
|
return wbxml_UNDEFINED_TOKEN;
|
||||||
}
|
}
|
||||||
/* There is no token map entry for the requested code page */
|
/* There is no token map entry for the requested code page */
|
||||||
return "(Requested token code page not defined for this content type)";
|
DebugLog(("map_token(codepage = %u, token = %u: "
|
||||||
|
wbxml_UNDEFINED_TOKEN_CODE_PAGE "\n", codepage, token));
|
||||||
|
return wbxml_UNDEFINED_TOKEN_CODE_PAGE;
|
||||||
}
|
}
|
||||||
/* The token map does not exist */
|
/* The token map does not exist */
|
||||||
return "(Requested token map not defined for this content type)";
|
DebugLog(("map_token(codepage = %u, token = %u: "
|
||||||
|
wbxml_UNDEFINED_TOKEN_MAP "\n", codepage, token));
|
||||||
|
return wbxml_UNDEFINED_TOKEN_MAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1796,31 +1825,27 @@ show_wbxml_string_table (proto_tree *tree, tvbuff_t *tvb, guint32 str_tbl,
|
||||||
guint32 str_tbl_len);
|
guint32 str_tbl_len);
|
||||||
|
|
||||||
/* Parse data while in STAG state */
|
/* Parse data while in STAG state */
|
||||||
static void
|
static guint32
|
||||||
parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
guint32 str_tbl, guint8 *level,
|
guint32 str_tbl, guint8 *level);
|
||||||
guint32 *parsed_length);
|
|
||||||
|
|
||||||
/* Parse data while in STAG state;
|
/* Parse data while in STAG state;
|
||||||
* interpret tokens as defined by content type */
|
* interpret tokens as defined by content type */
|
||||||
static void
|
static guint32
|
||||||
parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
guint32 str_tbl, guint8 *level,
|
guint32 str_tbl, guint8 *level,
|
||||||
guint32 *parsed_length,
|
|
||||||
const wbxml_token_map *map);
|
const wbxml_token_map *map);
|
||||||
|
|
||||||
/* Parse data while in ATTR state */
|
/* Parse data while in ATTR state */
|
||||||
static void
|
static guint32
|
||||||
parse_wbxml_attribute_list (proto_tree *tree, tvbuff_t *tvb,
|
parse_wbxml_attribute_list (proto_tree *tree, tvbuff_t *tvb,
|
||||||
guint32 offset, guint32 str_tbl, guint8 level,
|
guint32 offset, guint32 str_tbl, guint8 level);
|
||||||
guint32 *parsed_length);
|
|
||||||
|
|
||||||
/* Parse data while in ATTR state;
|
/* Parse data while in ATTR state;
|
||||||
* interpret tokens as defined by content type */
|
* interpret tokens as defined by content type */
|
||||||
static void
|
static guint32
|
||||||
parse_wbxml_attribute_list_defined (proto_tree *tree, tvbuff_t *tvb,
|
parse_wbxml_attribute_list_defined (proto_tree *tree, tvbuff_t *tvb,
|
||||||
guint32 offset, guint32 str_tbl, guint8 level,
|
guint32 offset, guint32 str_tbl, guint8 level,
|
||||||
guint32 *parsed_length,
|
|
||||||
const wbxml_token_map *map);
|
const wbxml_token_map *map);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1849,6 +1874,7 @@ dissect_wbxml(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
guint8 level = 0; /* WBXML recursion level */
|
guint8 level = 0; /* WBXML recursion level */
|
||||||
const wbxml_token_map *content_map = NULL;
|
const wbxml_token_map *content_map = NULL;
|
||||||
|
|
||||||
|
DebugLog(("dissect_wbxml: Dissecting packet %u\n", pinfo->fd->num));
|
||||||
/* WBXML format
|
/* WBXML format
|
||||||
*
|
*
|
||||||
* Version 1.0: version publicid strtbl BODY
|
* Version 1.0: version publicid strtbl BODY
|
||||||
|
@ -1972,9 +1998,8 @@ dissect_wbxml(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
"Level | State | Codepage "
|
"Level | State | Codepage "
|
||||||
"| WBXML Token Description "
|
"| WBXML Token Description "
|
||||||
"| Rendering");
|
"| Rendering");
|
||||||
parse_wbxml_tag_defined (wbxml_content_tree,
|
len = parse_wbxml_tag_defined (wbxml_content_tree,
|
||||||
tvb, offset, str_tbl, &level,
|
tvb, offset, str_tbl, &level, content_map);
|
||||||
&len, content_map);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1988,8 +2013,8 @@ dissect_wbxml(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
"Level | State | Codepage "
|
"Level | State | Codepage "
|
||||||
"| WBXML Token Description "
|
"| WBXML Token Description "
|
||||||
"| Rendering");
|
"| Rendering");
|
||||||
parse_wbxml_tag (wbxml_content_tree, tvb, offset,
|
len = parse_wbxml_tag (wbxml_content_tree, tvb, offset,
|
||||||
str_tbl, &level, &len);
|
str_tbl, &level);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -2095,10 +2120,9 @@ static const char * Indent (guint8 level) {
|
||||||
* as the lookup only occurs once, removing the need for storage of
|
* as the lookup only occurs once, removing the need for storage of
|
||||||
* the used code page.
|
* the used code page.
|
||||||
*/
|
*/
|
||||||
static void
|
static guint32
|
||||||
parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
guint32 str_tbl, guint8 *level,
|
guint32 str_tbl, guint8 *level,
|
||||||
guint32 *parsed_length,
|
|
||||||
const wbxml_token_map *map)
|
const wbxml_token_map *map)
|
||||||
{
|
{
|
||||||
guint32 tvb_len = tvb_reported_length (tvb);
|
guint32 tvb_len = tvb_reported_length (tvb);
|
||||||
|
@ -2121,17 +2145,10 @@ parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
This state will trigger recursion. */
|
This state will trigger recursion. */
|
||||||
tag_save_literal = NULL; /* Prevents compiler warning */
|
tag_save_literal = NULL; /* Prevents compiler warning */
|
||||||
|
|
||||||
#ifdef DEBUG
|
DebugLog(("parse_wbxml_tag_defined (level = %u, offset = %u)\n", *level, offset));
|
||||||
printf ("WBXML - parse_wbxml_tag_defined (level = %d, offset = %d)\n",
|
|
||||||
*level, offset);
|
|
||||||
#endif
|
|
||||||
while (off < tvb_len) {
|
while (off < tvb_len) {
|
||||||
peek = tvb_get_guint8 (tvb, off);
|
peek = tvb_get_guint8 (tvb, off);
|
||||||
#ifdef DEBUG
|
DebugLog(("STAG: (top of while) level = %3u, peek = 0x%02X, off = %u, tvb_len = %u\n", *level, peek, off, tvb_len));
|
||||||
printf("WBXML - STAG: level = %3d, peek = 0x%02X, off = %d, "
|
|
||||||
"tvb_len = %d\n",
|
|
||||||
*level, peek, off, tvb_len);
|
|
||||||
#endif
|
|
||||||
if ((peek & 0x3F) < 4) switch (peek) { /* Global tokens in state = STAG
|
if ((peek & 0x3F) < 4) switch (peek) { /* Global tokens in state = STAG
|
||||||
but not the LITERAL tokens */
|
but not the LITERAL tokens */
|
||||||
case 0x00: /* SWITCH_PAGE */
|
case 0x00: /* SWITCH_PAGE */
|
||||||
|
@ -2161,12 +2178,9 @@ parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
}
|
}
|
||||||
(*level)--;
|
(*level)--;
|
||||||
off++;
|
off++;
|
||||||
*parsed_length = off - offset;
|
|
||||||
/* Reset code page: not needed as return from recursion */
|
/* Reset code page: not needed as return from recursion */
|
||||||
#ifdef DEBUG
|
DebugLog(("STAG: level = %u, Return: len = %u\n", *level, off - offset));
|
||||||
printf("WBXML - STAG: level = %u, Return: len = %u\n", *level, *parsed_length);
|
return (off - offset);
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
break;
|
break;
|
||||||
case 0x02: /* ENTITY */
|
case 0x02: /* ENTITY */
|
||||||
ent = tvb_get_guintvar (tvb, off+1, &len);
|
ent = tvb_get_guintvar (tvb, off+1, &len);
|
||||||
|
@ -2219,20 +2233,13 @@ parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
"| PI (XML Processing Instruction) "
|
"| PI (XML Processing Instruction) "
|
||||||
"| %s<?xml",
|
"| %s<?xml",
|
||||||
*level, Indent (*level));
|
*level, Indent (*level));
|
||||||
parse_wbxml_attribute_list_defined (tree, tvb, off, str_tbl,
|
len = parse_wbxml_attribute_list_defined (tree, tvb, off, str_tbl,
|
||||||
*level, &len, map);
|
*level, map);
|
||||||
/* Check that there is still room in packet */
|
/* Check that there is still room in packet */
|
||||||
off += len;
|
off += len;
|
||||||
if (off >= tvb_len) {
|
if (off >= tvb_len) {
|
||||||
proto_tree_add_text (tree, tvb, off, 1,
|
DebugLog(("STAG: level = %u, ThrowException: len = %u (short frame)\n", *level, off - offset));
|
||||||
" | Attr | "
|
THROW(ReportedBoundsError);
|
||||||
"| "
|
|
||||||
"| [Short frame]");
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("WBXML - STAG: level = %u, Return: len = %u (short frame)\n",
|
|
||||||
*level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
proto_tree_add_text (tree, tvb, off-1, 1,
|
proto_tree_add_text (tree, tvb, off-1, 1,
|
||||||
" %3d | Tag | "
|
" %3d | Tag | "
|
||||||
|
@ -2318,11 +2325,8 @@ parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
*level);
|
*level);
|
||||||
/* Stop processing as it is impossible to parse now */
|
/* Stop processing as it is impossible to parse now */
|
||||||
off = tvb_len;
|
off = tvb_len;
|
||||||
*parsed_length = off - offset;
|
DebugLog(("STAG: level = %u, Return: len = %u\n", *level, off - offset));
|
||||||
#ifdef DEBUG
|
return (off - offset);
|
||||||
printf("WBXML - STAG: level = %u, Return: len = %u\n", *level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2344,6 +2348,7 @@ parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
/* Store the new tag */
|
/* Store the new tag */
|
||||||
tag_len = 0;
|
tag_len = 0;
|
||||||
if ((peek & 0x3F) == 4) { /* LITERAL */
|
if ((peek & 0x3F) == 4) { /* LITERAL */
|
||||||
|
DebugLog(("STAG: LITERAL tag (peek = 0x%02X, off = %u) - TableRef follows!\n", peek, off));
|
||||||
index = tvb_get_guintvar (tvb, off+1, &tag_len);
|
index = tvb_get_guintvar (tvb, off+1, &tag_len);
|
||||||
str_len = tvb_strsize (tvb, str_tbl+index);
|
str_len = tvb_strsize (tvb, str_tbl+index);
|
||||||
tag_new_literal = tvb_get_ptr (tvb, str_tbl+index, str_len);
|
tag_new_literal = tvb_get_ptr (tvb, str_tbl+index, str_len);
|
||||||
|
@ -2363,14 +2368,12 @@ parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
* recursion will return at the explicit END token.
|
* recursion will return at the explicit END token.
|
||||||
*/
|
*/
|
||||||
if (parsing_tag_content) { /* Recurse */
|
if (parsing_tag_content) { /* Recurse */
|
||||||
#ifdef DEBUG
|
DebugLog(("STAG: Tag in Tag - RECURSE! (off = %u)\n", off));
|
||||||
printf ("WBXML - STAG: Tag in Tag - RECURSE! (off = %d)\n", off);
|
|
||||||
#endif
|
|
||||||
/* Do not process the attribute list:
|
/* Do not process the attribute list:
|
||||||
* recursion will take care of it */
|
* recursion will take care of it */
|
||||||
(*level)++;
|
(*level)++;
|
||||||
parse_wbxml_tag_defined (tree, tvb, off, str_tbl, level,
|
len = parse_wbxml_tag_defined (tree, tvb, off, str_tbl,
|
||||||
&len, map);
|
level, map);
|
||||||
off += len;
|
off += len;
|
||||||
} else { /* Now we will have content to parse */
|
} else { /* Now we will have content to parse */
|
||||||
/* Save the start tag so we can properly close it later. */
|
/* Save the start tag so we can properly close it later. */
|
||||||
|
@ -2413,20 +2416,13 @@ parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
*level, Indent (*level), tag_new_literal);
|
*level, Indent (*level), tag_new_literal);
|
||||||
off += 1 + tag_len;
|
off += 1 + tag_len;
|
||||||
}
|
}
|
||||||
parse_wbxml_attribute_list_defined (tree, tvb,
|
len = parse_wbxml_attribute_list_defined (tree, tvb,
|
||||||
off, str_tbl, *level, &len, map);
|
off, str_tbl, *level, map);
|
||||||
/* Check that there is still room in packet */
|
/* Check that there is still room in packet */
|
||||||
off += len;
|
off += len;
|
||||||
if (off >= tvb_len) {
|
if (off >= tvb_len) {
|
||||||
proto_tree_add_text (tree, tvb, off, 1,
|
DebugLog(("STAG: level = %u, ThrowException: len = %u (short frame)\n", *level, off - offset));
|
||||||
" | Attr | "
|
THROW(ReportedBoundsError);
|
||||||
"| "
|
|
||||||
"| [Short frame]");
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("WBXML - STAG: level = %u, Return: len = %u (short frame)\n",
|
|
||||||
*level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
proto_tree_add_text (tree, tvb, off-1, 1,
|
proto_tree_add_text (tree, tvb, off-1, 1,
|
||||||
" %3d | Tag | "
|
" %3d | Tag | "
|
||||||
|
@ -2472,16 +2468,10 @@ parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
* Next time we encounter a tag with content: recurse
|
* Next time we encounter a tag with content: recurse
|
||||||
*/
|
*/
|
||||||
parsing_tag_content = TRUE;
|
parsing_tag_content = TRUE;
|
||||||
#ifdef DEBUG
|
DebugLog(("Tag in Tag - No recursion this time! (off = %u)\n", off));
|
||||||
printf ("WBXML: Tag in Tag - No recursion this time! "
|
|
||||||
"(off = %d)\n", off);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
} else { /* No Content */
|
} else { /* No Content */
|
||||||
#ifdef DEBUG
|
DebugLog(("<Tag/> in Tag - No recursion! (off = %u)\n", off));
|
||||||
printf ("WBXML: <Tag/> in Tag - No recursion! "
|
|
||||||
"(off = %d)\n", off);
|
|
||||||
#endif
|
|
||||||
(*level)++;
|
(*level)++;
|
||||||
if (peek & 0x80) { /* No Content, Attribute list present */
|
if (peek & 0x80) { /* No Content, Attribute list present */
|
||||||
if (tag_new_known) { /* Known tag */
|
if (tag_new_known) { /* Known tag */
|
||||||
|
@ -2505,20 +2495,13 @@ parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
/* Tag string already looked up earlier! */
|
/* Tag string already looked up earlier! */
|
||||||
}
|
}
|
||||||
off++;
|
off++;
|
||||||
parse_wbxml_attribute_list_defined (tree, tvb,
|
len = parse_wbxml_attribute_list_defined (tree, tvb,
|
||||||
off, str_tbl, *level, &len, map);
|
off, str_tbl, *level, map);
|
||||||
/* Check that there is still room in packet */
|
/* Check that there is still room in packet */
|
||||||
off += len;
|
off += len;
|
||||||
if (off >= tvb_len) {
|
if (off >= tvb_len) {
|
||||||
proto_tree_add_text (tree, tvb, off, 1,
|
DebugLog(("STAG: level = %u, ThrowException: len = %u (short frame)\n", *level, off - offset));
|
||||||
" | Attr | "
|
THROW(ReportedBoundsError);
|
||||||
"| "
|
|
||||||
"| [Short frame]");
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("WBXML - STAG: level = %u, Return: len = %u (short frame)\n",
|
|
||||||
*level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
proto_tree_add_text (tree, tvb, off-1, 1,
|
proto_tree_add_text (tree, tvb, off-1, 1,
|
||||||
" %3d | Tag | "
|
" %3d | Tag | "
|
||||||
|
@ -2532,20 +2515,13 @@ parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
"| %s<%s",
|
"| %s<%s",
|
||||||
*level, Indent (*level), tag_new_literal);
|
*level, Indent (*level), tag_new_literal);
|
||||||
off += 1 + tag_len;
|
off += 1 + tag_len;
|
||||||
parse_wbxml_attribute_list_defined (tree, tvb,
|
len = parse_wbxml_attribute_list_defined (tree, tvb,
|
||||||
off, str_tbl, *level, &len, map);
|
off, str_tbl, *level, map);
|
||||||
/* Check that there is still room in packet */
|
/* Check that there is still room in packet */
|
||||||
off += len;
|
off += len;
|
||||||
if (off >= tvb_len) {
|
if (off >= tvb_len) {
|
||||||
proto_tree_add_text (tree, tvb, off, 1,
|
DebugLog(("STAG: level = %u, ThrowException: len = %u (short frame)\n", *level, off - offset));
|
||||||
" | Attr | "
|
THROW(ReportedBoundsError);
|
||||||
"| "
|
|
||||||
"| [Short frame]");
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("WBXML - STAG: level = %u, Return: len = %u (short frame)\n",
|
|
||||||
*level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
proto_tree_add_text (tree, tvb, off-1, 1,
|
proto_tree_add_text (tree, tvb, off-1, 1,
|
||||||
" %3d | Tag | "
|
" %3d | Tag | "
|
||||||
|
@ -2589,10 +2565,8 @@ parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
}
|
}
|
||||||
} /* if (tag & 0x3F) >= 5 */
|
} /* if (tag & 0x3F) >= 5 */
|
||||||
} /* while */
|
} /* while */
|
||||||
#ifdef DEBUG
|
DebugLog(("STAG: level = %u, Return: len = %u (end of function body)\n", *level, off - offset));
|
||||||
*parsed_length = off - offset;
|
return (off - offset);
|
||||||
printf("WBXML - STAG: level = %u, Return: len = %u (end of function body)\n", *level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2601,10 +2575,9 @@ parse_wbxml_tag_defined (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
*
|
*
|
||||||
* Attribute parsing is done in parse_wbxml_attribute_list().
|
* Attribute parsing is done in parse_wbxml_attribute_list().
|
||||||
*/
|
*/
|
||||||
static void
|
static guint32
|
||||||
parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
guint32 str_tbl, guint8 *level,
|
guint32 str_tbl, guint8 *level)
|
||||||
guint32 *parsed_length)
|
|
||||||
{
|
{
|
||||||
guint32 tvb_len = tvb_reported_length (tvb);
|
guint32 tvb_len = tvb_reported_length (tvb);
|
||||||
guint32 off = offset;
|
guint32 off = offset;
|
||||||
|
@ -2628,17 +2601,10 @@ parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
This state will trigger recursion. */
|
This state will trigger recursion. */
|
||||||
tag_save_literal = NULL; /* Prevents compiler warning */
|
tag_save_literal = NULL; /* Prevents compiler warning */
|
||||||
|
|
||||||
#ifdef DEBUG
|
DebugLog(("parse_wbxml_tag (level = %u, offset = %u)\n", *level, offset));
|
||||||
printf ("WBXML - parse_wbxml_tag (level = %d, offset = %d)\n",
|
|
||||||
*level, offset);
|
|
||||||
#endif
|
|
||||||
while (off < tvb_len) {
|
while (off < tvb_len) {
|
||||||
peek = tvb_get_guint8 (tvb, off);
|
peek = tvb_get_guint8 (tvb, off);
|
||||||
#ifdef DEBUG
|
DebugLog(("STAG: (top of while) level = %3u, peek = 0x%02X, off = %u, tvb_len = %u\n", *level, peek, off, tvb_len));
|
||||||
printf("WBXML - STAG: level = %3d, peek = 0x%02X, off = %d, "
|
|
||||||
"tvb_len = %d\n",
|
|
||||||
*level, peek, off, tvb_len);
|
|
||||||
#endif
|
|
||||||
if ((peek & 0x3F) < 4) switch (peek) { /* Global tokens in state = STAG
|
if ((peek & 0x3F) < 4) switch (peek) { /* Global tokens in state = STAG
|
||||||
but not the LITERAL tokens */
|
but not the LITERAL tokens */
|
||||||
case 0x00: /* SWITCH_PAGE */
|
case 0x00: /* SWITCH_PAGE */
|
||||||
|
@ -2668,12 +2634,9 @@ parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
}
|
}
|
||||||
(*level)--;
|
(*level)--;
|
||||||
off++;
|
off++;
|
||||||
*parsed_length = off - offset;
|
|
||||||
/* Reset code page: not needed as return from recursion */
|
/* Reset code page: not needed as return from recursion */
|
||||||
#ifdef DEBUG
|
DebugLog(("STAG: level = %u, Return: len = %u\n", *level, off - offset));
|
||||||
printf("WBXML - STAG: level = %u, Return: len = %u\n", *level, *parsed_length);
|
return (off - offset);
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
break;
|
break;
|
||||||
case 0x02: /* ENTITY */
|
case 0x02: /* ENTITY */
|
||||||
ent = tvb_get_guintvar (tvb, off+1, &len);
|
ent = tvb_get_guintvar (tvb, off+1, &len);
|
||||||
|
@ -2724,20 +2687,12 @@ parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
"| PI (XML Processing Instruction) "
|
"| PI (XML Processing Instruction) "
|
||||||
"| %s<?xml",
|
"| %s<?xml",
|
||||||
*level, Indent (*level));
|
*level, Indent (*level));
|
||||||
parse_wbxml_attribute_list (tree, tvb, off, str_tbl,
|
len = parse_wbxml_attribute_list (tree, tvb, off, str_tbl, *level);
|
||||||
*level, &len);
|
|
||||||
/* Check that there is still room in packet */
|
/* Check that there is still room in packet */
|
||||||
off += len;
|
off += len;
|
||||||
if (off >= tvb_len) {
|
if (off >= tvb_len) {
|
||||||
proto_tree_add_text (tree, tvb, off, 1,
|
DebugLog(("STAG: level = %u, ThrowException: len = %u (short frame)\n", *level, off - offset));
|
||||||
" | Attr | "
|
THROW(ReportedBoundsError);
|
||||||
"| "
|
|
||||||
"| [Short frame]");
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("WBXML - STAG: level = %u, Return: len = %u (short frame)\n",
|
|
||||||
*level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
proto_tree_add_text (tree, tvb, off-1, 1,
|
proto_tree_add_text (tree, tvb, off-1, 1,
|
||||||
" %3d | Tag | "
|
" %3d | Tag | "
|
||||||
|
@ -2820,11 +2775,8 @@ parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
*level);
|
*level);
|
||||||
/* Stop processing as it is impossible to parse now */
|
/* Stop processing as it is impossible to parse now */
|
||||||
off = tvb_len;
|
off = tvb_len;
|
||||||
*parsed_length = off - offset;
|
DebugLog(("STAG: level = %u, Return: len = %u\n", *level, off - offset));
|
||||||
#ifdef DEBUG
|
return (off - offset);
|
||||||
printf("WBXML - STAG: level = %u, Return: len = %u\n", *level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2846,6 +2798,7 @@ parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
/* Store the new tag */
|
/* Store the new tag */
|
||||||
tag_len = 0;
|
tag_len = 0;
|
||||||
if ((peek & 0x3F) == 4) { /* LITERAL */
|
if ((peek & 0x3F) == 4) { /* LITERAL */
|
||||||
|
DebugLog(("STAG: LITERAL tag (peek = 0x%02X, off = %u) - TableRef follows!\n", peek, off));
|
||||||
index = tvb_get_guintvar (tvb, off+1, &tag_len);
|
index = tvb_get_guintvar (tvb, off+1, &tag_len);
|
||||||
str_len = tvb_strsize (tvb, str_tbl+index);
|
str_len = tvb_strsize (tvb, str_tbl+index);
|
||||||
tag_new_literal = tvb_get_ptr (tvb, str_tbl+index, str_len);
|
tag_new_literal = tvb_get_ptr (tvb, str_tbl+index, str_len);
|
||||||
|
@ -2866,14 +2819,11 @@ parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
* recursion will return at the explicit END token.
|
* recursion will return at the explicit END token.
|
||||||
*/
|
*/
|
||||||
if (parsing_tag_content) { /* Recurse */
|
if (parsing_tag_content) { /* Recurse */
|
||||||
#ifdef DEBUG
|
DebugLog(("STAG: Tag in Tag - RECURSE! (off = %u)\n", off));
|
||||||
printf("WBXML - STAG: Tag in Tag - RECURSE! (off = %d)\n", off);
|
|
||||||
#endif
|
|
||||||
/* Do not process the attribute list:
|
/* Do not process the attribute list:
|
||||||
* recursion will take care of it */
|
* recursion will take care of it */
|
||||||
(*level)++;
|
(*level)++;
|
||||||
parse_wbxml_tag (tree, tvb, off, str_tbl, level,
|
len = parse_wbxml_tag (tree, tvb, off, str_tbl, level);
|
||||||
&len);
|
|
||||||
off += len;
|
off += len;
|
||||||
} else { /* Now we will have content to parse */
|
} else { /* Now we will have content to parse */
|
||||||
/* Save the start tag so we can properly close it later. */
|
/* Save the start tag so we can properly close it later. */
|
||||||
|
@ -2918,20 +2868,13 @@ parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
*level, Indent (*level), tag_new_literal);
|
*level, Indent (*level), tag_new_literal);
|
||||||
off += 1 + tag_len;
|
off += 1 + tag_len;
|
||||||
}
|
}
|
||||||
parse_wbxml_attribute_list (tree, tvb,
|
len = parse_wbxml_attribute_list (tree, tvb,
|
||||||
off, str_tbl, *level, &len);
|
off, str_tbl, *level);
|
||||||
/* Check that there is still room in packet */
|
/* Check that there is still room in packet */
|
||||||
off += len;
|
off += len;
|
||||||
if (off >= tvb_len) {
|
if (off >= tvb_len) {
|
||||||
proto_tree_add_text (tree, tvb, off, 1,
|
DebugLog(("STAG: level = %u, ThrowException: len = %u (short frame)\n", *level, off - offset));
|
||||||
" | Attr | "
|
THROW(ReportedBoundsError);
|
||||||
"| "
|
|
||||||
"| [Short frame]");
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("WBXML - STAG: level = %u, Return: len = %u (short frame)\n",
|
|
||||||
*level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
proto_tree_add_text (tree, tvb, off-1, 1,
|
proto_tree_add_text (tree, tvb, off-1, 1,
|
||||||
" %3d | Tag | "
|
" %3d | Tag | "
|
||||||
|
@ -2977,16 +2920,10 @@ parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
* Next time we encounter a tag with content: recurse
|
* Next time we encounter a tag with content: recurse
|
||||||
*/
|
*/
|
||||||
parsing_tag_content = TRUE;
|
parsing_tag_content = TRUE;
|
||||||
#ifdef DEBUG
|
DebugLog(("Tag in Tag - No recursion this time! (off = %u)\n", off));
|
||||||
printf ("WBXML: Tag in Tag - No recursion this time! "
|
|
||||||
"(off = %d)\n", off);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
} else { /* No Content */
|
} else { /* No Content */
|
||||||
#ifdef DEBUG
|
DebugLog(("<Tag/> in Tag - No recursion! (off = %u)\n", off));
|
||||||
printf ("WBXML: <Tag/> in Tag - No recursion! "
|
|
||||||
"(off = %d)\n", off);
|
|
||||||
#endif
|
|
||||||
(*level)++;
|
(*level)++;
|
||||||
if (peek & 0x80) { /* No Content, Attribute list present */
|
if (peek & 0x80) { /* No Content, Attribute list present */
|
||||||
if (tag_new_known) { /* Known tag */
|
if (tag_new_known) { /* Known tag */
|
||||||
|
@ -3010,20 +2947,13 @@ parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
/* Tag string already looked up earlier! */
|
/* Tag string already looked up earlier! */
|
||||||
}
|
}
|
||||||
off++;
|
off++;
|
||||||
parse_wbxml_attribute_list (tree, tvb,
|
len = parse_wbxml_attribute_list (tree, tvb,
|
||||||
off, str_tbl, *level, &len);
|
off, str_tbl, *level);
|
||||||
/* Check that there is still room in packet */
|
/* Check that there is still room in packet */
|
||||||
off += len;
|
off += len;
|
||||||
if (off >= tvb_len) {
|
if (off >= tvb_len) {
|
||||||
proto_tree_add_text (tree, tvb, off, 1,
|
DebugLog(("STAG: level = %u, ThrowException: len = %u (short frame)\n", *level, off - offset));
|
||||||
" | Attr | "
|
THROW(ReportedBoundsError);
|
||||||
"| "
|
|
||||||
"| [Short frame]");
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("WBXML - STAG: level = %u, Return: len = %u (short frame)\n",
|
|
||||||
*level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
proto_tree_add_text (tree, tvb, off-1, 1,
|
proto_tree_add_text (tree, tvb, off-1, 1,
|
||||||
" %3d | Tag | "
|
" %3d | Tag | "
|
||||||
|
@ -3037,20 +2967,13 @@ parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
"| %s<%s",
|
"| %s<%s",
|
||||||
*level, Indent (*level), tag_new_literal);
|
*level, Indent (*level), tag_new_literal);
|
||||||
off += 1 + tag_len;
|
off += 1 + tag_len;
|
||||||
parse_wbxml_attribute_list (tree, tvb,
|
len = parse_wbxml_attribute_list (tree, tvb,
|
||||||
off, str_tbl, *level, &len);
|
off, str_tbl, *level);
|
||||||
/* Check that there is still room in packet */
|
/* Check that there is still room in packet */
|
||||||
off += len;
|
off += len;
|
||||||
if (off >= tvb_len) {
|
if (off >= tvb_len) {
|
||||||
proto_tree_add_text (tree, tvb, off, 1,
|
DebugLog(("STAG: level = %u, ThrowException: len = %u (short frame)\n", *level, off - offset));
|
||||||
" | Attr | "
|
THROW(ReportedBoundsError);
|
||||||
"| "
|
|
||||||
"| [Short frame]");
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("WBXML - STAG: level = %u, Return: len = %u (short frame)\n",
|
|
||||||
*level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
proto_tree_add_text (tree, tvb, off-1, 1,
|
proto_tree_add_text (tree, tvb, off-1, 1,
|
||||||
" %3d | Tag | "
|
" %3d | Tag | "
|
||||||
|
@ -3094,10 +3017,8 @@ parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
}
|
}
|
||||||
} /* if (tag & 0x3F) >= 5 */
|
} /* if (tag & 0x3F) >= 5 */
|
||||||
} /* while */
|
} /* while */
|
||||||
#ifdef DEBUG
|
DebugLog(("STAG: level = %u, Return: len = %u (end of function body)\n", *level, off - offset));
|
||||||
*parsed_length = off - offset;
|
return (off - offset);
|
||||||
printf("WBXML - STAG: level = %u, Return: len = %u (end of function body)\n", *level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3123,10 +3044,9 @@ parse_wbxml_tag (proto_tree *tree, tvbuff_t *tvb, guint32 offset,
|
||||||
*
|
*
|
||||||
* NOTE: See above for known token mappings.
|
* NOTE: See above for known token mappings.
|
||||||
*/
|
*/
|
||||||
static void
|
static guint32
|
||||||
parse_wbxml_attribute_list_defined (proto_tree *tree, tvbuff_t *tvb,
|
parse_wbxml_attribute_list_defined (proto_tree *tree, tvbuff_t *tvb,
|
||||||
guint32 offset, guint32 str_tbl, guint8 level,
|
guint32 offset, guint32 str_tbl, guint8 level,
|
||||||
guint32 *parsed_length,
|
|
||||||
const wbxml_token_map *map)
|
const wbxml_token_map *map)
|
||||||
{
|
{
|
||||||
guint32 tvb_len = tvb_reported_length (tvb);
|
guint32 tvb_len = tvb_reported_length (tvb);
|
||||||
|
@ -3138,18 +3058,11 @@ parse_wbxml_attribute_list_defined (proto_tree *tree, tvbuff_t *tvb,
|
||||||
guint8 peek;
|
guint8 peek;
|
||||||
guint8 codepage_attr = 0; /* Initial codepage in state = ATTR */
|
guint8 codepage_attr = 0; /* Initial codepage in state = ATTR */
|
||||||
|
|
||||||
#ifdef DEBUG
|
DebugLog(("parse_wbxml_attr_defined (level = %u, offset = %u)\n", level, offset));
|
||||||
printf ("WBXML - parse_wbxml_attr_defined (level = %d, offset = %d)\n",
|
|
||||||
level, offset);
|
|
||||||
#endif
|
|
||||||
/* Parse attributes */
|
/* Parse attributes */
|
||||||
while (off < tvb_len) {
|
while (off < tvb_len) {
|
||||||
peek = tvb_get_guint8 (tvb, off);
|
peek = tvb_get_guint8 (tvb, off);
|
||||||
#ifdef DEBUG
|
DebugLog(("ATTR: (top of while) level = %3u, peek = 0x%02X, off = %u, tvb_len = %u\n", level, peek, off, tvb_len));
|
||||||
printf("WBXML - ATTR: level = %3d, peek = 0x%02X, off = %d, "
|
|
||||||
"tvb_len = %d\n",
|
|
||||||
level, peek, off, tvb_len);
|
|
||||||
#endif
|
|
||||||
if ((peek & 0x3F) < 5) switch (peek) { /* Global tokens
|
if ((peek & 0x3F) < 5) switch (peek) { /* Global tokens
|
||||||
in state = ATTR */
|
in state = ATTR */
|
||||||
case 0x00: /* SWITCH_PAGE */
|
case 0x00: /* SWITCH_PAGE */
|
||||||
|
@ -3167,11 +3080,8 @@ parse_wbxml_attribute_list_defined (proto_tree *tree, tvbuff_t *tvb,
|
||||||
* This is done in the TAG state parser.
|
* This is done in the TAG state parser.
|
||||||
*/
|
*/
|
||||||
off++;
|
off++;
|
||||||
*parsed_length = off - offset;
|
DebugLog(("ATTR: level = %u, Return: len = %u\n", level, off - offset));
|
||||||
#ifdef DEBUG
|
return (off - offset);
|
||||||
printf("WBXML - ATTR: level = %u, Return: len = %u\n", level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
case 0x02: /* ENTITY */
|
case 0x02: /* ENTITY */
|
||||||
ent = tvb_get_guintvar (tvb, off+1, &len);
|
ent = tvb_get_guintvar (tvb, off+1, &len);
|
||||||
proto_tree_add_text (tree, tvb, off, 1+len,
|
proto_tree_add_text (tree, tvb, off, 1+len,
|
||||||
|
@ -3309,11 +3219,8 @@ parse_wbxml_attribute_list_defined (proto_tree *tree, tvbuff_t *tvb,
|
||||||
level);
|
level);
|
||||||
/* Stop processing as it is impossible to parse now */
|
/* Stop processing as it is impossible to parse now */
|
||||||
off = tvb_len;
|
off = tvb_len;
|
||||||
*parsed_length = off - offset;
|
DebugLog(("ATTR: level = %u, Return: len = %u\n", level, off - offset));
|
||||||
#ifdef DEBUG
|
return (off - offset);
|
||||||
printf("WBXML - ATTR: level = %u, Return: len = %u\n", level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
/* 0xC4 impossible in ATTR state */
|
/* 0xC4 impossible in ATTR state */
|
||||||
|
@ -3368,10 +3275,8 @@ parse_wbxml_attribute_list_defined (proto_tree *tree, tvbuff_t *tvb,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* End WHILE */
|
} /* End WHILE */
|
||||||
#ifdef DEBUG
|
DebugLog(("ATTR: level = %u, Return: len = %u (end of function body)\n", level, off - offset));
|
||||||
*parsed_length = off - offset;
|
return (off - offset);
|
||||||
printf("WBXML - ATTR: level = %u, Return: len = %u (end of function body)\n", level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3383,10 +3288,9 @@ parse_wbxml_attribute_list_defined (proto_tree *tree, tvbuff_t *tvb,
|
||||||
*
|
*
|
||||||
* NOTE: Code page switches not yet processed in the code!
|
* NOTE: Code page switches not yet processed in the code!
|
||||||
*/
|
*/
|
||||||
static void
|
static guint32
|
||||||
parse_wbxml_attribute_list (proto_tree *tree, tvbuff_t *tvb,
|
parse_wbxml_attribute_list (proto_tree *tree, tvbuff_t *tvb,
|
||||||
guint32 offset, guint32 str_tbl, guint8 level,
|
guint32 offset, guint32 str_tbl, guint8 level)
|
||||||
guint32 *parsed_length)
|
|
||||||
{
|
{
|
||||||
guint32 tvb_len = tvb_reported_length (tvb);
|
guint32 tvb_len = tvb_reported_length (tvb);
|
||||||
guint32 off = offset;
|
guint32 off = offset;
|
||||||
|
@ -3397,18 +3301,11 @@ parse_wbxml_attribute_list (proto_tree *tree, tvbuff_t *tvb,
|
||||||
guint8 peek;
|
guint8 peek;
|
||||||
guint8 codepage_attr = 0; /* Initial codepage in state = ATTR */
|
guint8 codepage_attr = 0; /* Initial codepage in state = ATTR */
|
||||||
|
|
||||||
#ifdef DEBUG
|
DebugLog(("parse_wbxml_attr (level = %u, offset = %u)\n", level, offset));
|
||||||
printf ("WBXML - parse_wbxml_attr (level = %d, offset = %d)\n",
|
|
||||||
level, offset);
|
|
||||||
#endif
|
|
||||||
/* Parse attributes */
|
/* Parse attributes */
|
||||||
while (off < tvb_len) {
|
while (off < tvb_len) {
|
||||||
peek = tvb_get_guint8 (tvb, off);
|
peek = tvb_get_guint8 (tvb, off);
|
||||||
#ifdef DEBUG
|
DebugLog(("ATTR: (top of while) level = %3u, peek = 0x%02X, off = %u, tvb_len = %u\n", level, peek, off, tvb_len));
|
||||||
printf("WBXML - ATTR: level = %3d, peek = 0x%02X, off = %d, "
|
|
||||||
"tvb_len = %d\n",
|
|
||||||
level, peek, off, tvb_len);
|
|
||||||
#endif
|
|
||||||
if ((peek & 0x3F) < 5) switch (peek) { /* Global tokens
|
if ((peek & 0x3F) < 5) switch (peek) { /* Global tokens
|
||||||
in state = ATTR */
|
in state = ATTR */
|
||||||
case 0x00: /* SWITCH_PAGE */
|
case 0x00: /* SWITCH_PAGE */
|
||||||
|
@ -3426,11 +3323,8 @@ parse_wbxml_attribute_list (proto_tree *tree, tvbuff_t *tvb,
|
||||||
* This is done in the TAG state parser.
|
* This is done in the TAG state parser.
|
||||||
*/
|
*/
|
||||||
off++;
|
off++;
|
||||||
*parsed_length = off - offset;
|
DebugLog(("ATTR: level = %u, Return: len = %u\n", level, off - offset));
|
||||||
#ifdef DEBUG
|
return (off - offset);
|
||||||
printf("WBXML - ATTR: level = %u, Return: len = %u\n", level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
case 0x02: /* ENTITY */
|
case 0x02: /* ENTITY */
|
||||||
ent = tvb_get_guintvar (tvb, off+1, &len);
|
ent = tvb_get_guintvar (tvb, off+1, &len);
|
||||||
proto_tree_add_text (tree, tvb, off, 1+len,
|
proto_tree_add_text (tree, tvb, off, 1+len,
|
||||||
|
@ -3562,11 +3456,8 @@ parse_wbxml_attribute_list (proto_tree *tree, tvbuff_t *tvb,
|
||||||
level);
|
level);
|
||||||
/* Stop processing as it is impossible to parse now */
|
/* Stop processing as it is impossible to parse now */
|
||||||
off = tvb_len;
|
off = tvb_len;
|
||||||
*parsed_length = off - offset;
|
DebugLog(("ATTR: level = %u, Return: len = %u\n", level, off - offset));
|
||||||
#ifdef DEBUG
|
return (off - offset);
|
||||||
printf("WBXML - ATTR: level = %u, Return: len = %u\n", level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
/* 0xC4 impossible in ATTR state */
|
/* 0xC4 impossible in ATTR state */
|
||||||
|
@ -3621,10 +3512,8 @@ parse_wbxml_attribute_list (proto_tree *tree, tvbuff_t *tvb,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* End WHILE */
|
} /* End WHILE */
|
||||||
#ifdef DEBUG
|
DebugLog(("ATTR: level = %u, Return: len = %u (end of function body)\n", level, off - offset));
|
||||||
*parsed_length = off - offset;
|
return (off - offset);
|
||||||
printf("WBXML - ATTR: level = %u, Return: len = %u (end of function body)\n", level, *parsed_length);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue