diff options
author | Maximilian Schwerin <post@mschwerin.de> | 2007-12-27 14:25:28 +0000 |
---|---|---|
committer | Maximilian Schwerin <post@mschwerin.de> | 2007-12-27 14:25:28 +0000 |
commit | a2d20c60cd88481989316a8cedf8bd7d1e9be94a (patch) | |
tree | b8f14c9eed3c68c6704eb80c6676db743ace14d7 | |
parent | 84e2f56c6cc81e9bed8ba03b29a8c69aa7d08d89 (diff) | |
download | xine-lib-a2d20c60cd88481989316a8cedf8bd7d1e9be94a.tar.gz xine-lib-a2d20c60cd88481989316a8cedf8bd7d1e9be94a.tar.bz2 |
xmlparser: fix token buffer being too small
What this patch does is replace the token buffer of static size in
xml_parser_get_node with a malloced buffer. If the lexer notices, that it
needs more size it just increases the size of this buffer by factor two and
tries again. This may not be very elegant, but it works.
node_name and property_name are dynamically-sized too.
-rw-r--r-- | src/xine-utils/xmllexer.c | 15 | ||||
-rw-r--r-- | src/xine-utils/xmllexer.h | 2 | ||||
-rw-r--r-- | src/xine-utils/xmlparser.c | 52 |
3 files changed, 60 insertions, 9 deletions
diff --git a/src/xine-utils/xmllexer.c b/src/xine-utils/xmllexer.c index 047dbb1a6..a77d6654a 100644 --- a/src/xine-utils/xmllexer.c +++ b/src/xine-utils/xmllexer.c @@ -123,7 +123,10 @@ void lexer_init(const char * buf, int size) { lprintf("buffer length %d\n", size); } -int lexer_get_token(char * tok, int tok_size) { +int lexer_get_token(char ** _tok, int * _tok_size) { + char *tok = *_tok; + int tok_size = *_tok_size; + int tok_pos = 0; int state = 0; char c; @@ -455,7 +458,15 @@ int lexer_get_token(char * tok, int tok_size) { /* pb */ if (tok_pos >= tok_size) { - lprintf("token buffer is too little\n"); + *_tok_size *= 2; + *_tok = realloc (*_tok, *_tok_size); + lprintf("token buffer is too small\n"); + lprintf("increasing buffer size to %d bytes\n", *_tok_size); + if (*_tok) { + return lexer_get_token (_tok, _tok_size); + } else { + return T_ERROR; + } } else { if (lexbuf_pos >= lexbuf_size) { /* Terminate the current token */ diff --git a/src/xine-utils/xmllexer.h b/src/xine-utils/xmllexer.h index 1e646f9b5..bf9948d2d 100644 --- a/src/xine-utils/xmllexer.h +++ b/src/xine-utils/xmllexer.h @@ -51,7 +51,7 @@ /* public functions */ void lexer_init(const char * buf, int size) XINE_PROTECTED; -int lexer_get_token(char * tok, int tok_size) XINE_PROTECTED; +int lexer_get_token(char ** tok, int * tok_size) XINE_PROTECTED; char *lexer_decode_entities (const char *tok) XINE_PROTECTED; #endif diff --git a/src/xine-utils/xmlparser.c b/src/xine-utils/xmlparser.c index a5d8212d2..3cc9bc3c2 100644 --- a/src/xine-utils/xmlparser.c +++ b/src/xine-utils/xmlparser.c @@ -153,10 +153,15 @@ void xml_parser_free_tree(xml_node_t *current_node) { #define STATE_NODE 1 #define STATE_COMMENT 7 -static int xml_parser_get_node (xml_node_t *current_node, char *root_name, int rec) { - char tok[TOKEN_SIZE]; - char property_name[TOKEN_SIZE]; - char node_name[TOKEN_SIZE]; +static int xml_parser_get_node (xml_node_t *current_node, char *root_name, int rec); + +static int _xml_parser_get_node (char ** token_buffer, int * token_buffer_size, + char ** pname_buffer, int * pname_buffer_size, + char ** nname_buffer, int * nname_buffer_size, + xml_node_t *current_node, char *root_name, int rec) { + char *tok = *token_buffer; + char *property_name = *pname_buffer; + char *node_name = *nname_buffer; int state = STATE_IDLE; int res = 0; int parse_res; @@ -168,9 +173,10 @@ static int xml_parser_get_node (xml_node_t *current_node, char *root_name, int r if (rec < MAX_RECURSION) { - memset (tok, 0, TOKEN_SIZE); + memset (tok, 0, *token_buffer_size); - while ((bypass_get_token) || (res = lexer_get_token(tok, TOKEN_SIZE)) != T_ERROR) { + while ((bypass_get_token) || (res = lexer_get_token(token_buffer, token_buffer_size)) != T_ERROR) { + tok = *token_buffer; bypass_get_token = 0; lprintf("info: %d - %d : '%s'\n", state, res, tok); @@ -225,6 +231,12 @@ static int xml_parser_get_node (xml_node_t *current_node, char *root_name, int r if (xml_parser_mode == XML_PARSER_CASE_INSENSITIVE) { strtoupper(tok); } + /* make sure the buffer for the node name is big enough */ + if (token_buffer_size > nname_buffer_size) { + *nname_buffer_size = *token_buffer_size; + *nname_buffer = realloc (*nname_buffer, *nname_buffer_size); + node_name = *nname_buffer; + } strcpy(node_name, tok); state = 2; lprintf("info: current node name \"%s\"\n", node_name); @@ -291,6 +303,12 @@ static int xml_parser_get_node (xml_node_t *current_node, char *root_name, int r if (xml_parser_mode == XML_PARSER_CASE_INSENSITIVE) { strtoupper(tok); } + /* make sure the buffer for the property name is big enough */ + if (token_buffer_size > pname_buffer_size) { + *pname_buffer_size = *token_buffer_size; + *pname_buffer = realloc (*pname_buffer, *pname_buffer_size); + property_name = *pname_buffer; + } strcpy(property_name, tok); state = 5; lprintf("info: current property name \"%s\"\n", property_name); @@ -452,6 +470,28 @@ static int xml_parser_get_node (xml_node_t *current_node, char *root_name, int r } } +static int xml_parser_get_node (xml_node_t *current_node, char *root_name, int rec) +{ + int res = 0; + int token_buffer_size = TOKEN_SIZE; + int pname_buffer_size = TOKEN_SIZE; + int nname_buffer_size = TOKEN_SIZE; + char *token_buffer = xine_xmalloc (token_buffer_size); + char *pname_buffer = xine_xmalloc (pname_buffer_size); + char *nname_buffer = xine_xmalloc (nname_buffer_size); + + res = _xml_parser_get_node(&token_buffer, &token_buffer_size, + &pname_buffer, &pname_buffer_size, + &nname_buffer, &nname_buffer_size, + current_node, root_name, rec); + + free (token_buffer); + free (pname_buffer); + free (nname_buffer); + + return res; +} + int xml_parser_build_tree(xml_node_t **root_node) { xml_node_t *tmp_node; int res; |