[Faxpp-devel] SF.net SVN: faxpp:[53] trunk/faxpp/src
Status: Beta
Brought to you by:
jpcs
From: <jp...@us...> - 2008-08-08 11:25:08
|
Revision: 53 http://faxpp.svn.sourceforge.net/faxpp/?rev=53&view=rev Author: jpcs Date: 2008-08-08 11:25:17 +0000 (Fri, 08 Aug 2008) Log Message: ----------- Fixed a bug where parsing would not resume properly after certain error cases. Fixed a freed memory read bug in attribute normalization. Modified Paths: -------------- trunk/faxpp/src/buffer.c trunk/faxpp/src/buffer.h trunk/faxpp/src/xml_parser.c trunk/faxpp/src/xml_parser.h Modified: trunk/faxpp/src/buffer.c =================================================================== --- trunk/faxpp/src/buffer.c 2008-05-22 16:39:07 UTC (rev 52) +++ trunk/faxpp/src/buffer.c 2008-08-08 11:25:17 UTC (rev 53) @@ -91,6 +91,20 @@ return NO_ERROR; } +FAXPP_Error FAXPP_buffer_append_text(FAXPP_Buffer *buffer, const FAXPP_Text *text) +{ + FAXPP_Error err; + if(buffer->cursor + text->len > buffer->buffer + buffer->length) { + err = FAXPP_resize_buffer(buffer, (buffer->cursor + text->len) - buffer->buffer); + if(err != 0) return err; + } + + memcpy(buffer->cursor, text->ptr, text->len); + buffer->cursor += text->len; + + return NO_ERROR; +} + FAXPP_Error FAXPP_buffer_append_ch(FAXPP_Buffer *buffer, FAXPP_EncodeFunction encode, Char32 ch) { FAXPP_Error err; Modified: trunk/faxpp/src/buffer.h =================================================================== --- trunk/faxpp/src/buffer.h 2008-05-22 16:39:07 UTC (rev 52) +++ trunk/faxpp/src/buffer.h 2008-08-08 11:25:17 UTC (rev 53) @@ -19,6 +19,7 @@ #include <faxpp/error.h> #include <faxpp/transcode.h> +#include <faxpp/text.h> typedef struct FAXPP_Buffer_s FAXPP_Buffer; typedef void (*FAXPP_BufferResizeCallback)(void *userData, FAXPP_Buffer *buffer, void *newFAXPP_Buffer); @@ -42,6 +43,7 @@ FAXPP_Error FAXPP_resize_buffer(FAXPP_Buffer *buffer, unsigned int minSize); FAXPP_Error FAXPP_buffer_append(FAXPP_Buffer *buffer, void *ptr, unsigned int len); +FAXPP_Error FAXPP_buffer_append_text(FAXPP_Buffer *buffer, const FAXPP_Text *text); FAXPP_Error FAXPP_buffer_append_ch(FAXPP_Buffer *buffer, FAXPP_EncodeFunction encode, Char32 ch); #endif Modified: trunk/faxpp/src/xml_parser.c =================================================================== --- trunk/faxpp/src/xml_parser.c 2008-05-22 16:39:07 UTC (rev 52) +++ trunk/faxpp/src/xml_parser.c 2008-08-08 11:25:17 UTC (rev 53) @@ -273,6 +273,7 @@ env->current_notation = 0; env->standalone = 0; + env->event_returned = 0; env->xml_version = XML_VERSION_NOT_KNOWN; // Put the element info objects back in the pool @@ -389,7 +390,14 @@ FAXPP_Error FAXPP_next_event(FAXPP_Parser *env) { - return env->next_event(env); + FAXPP_Error err; + do { + err = env->next_event(env); + if(err != NO_ERROR) return err; + } while(env->event.type == NO_EVENT); + + env->event_returned = 1; + return err; } const FAXPP_Event *FAXPP_get_current_event(const FAXPP_Parser *parser) @@ -681,16 +689,20 @@ { FAXPP_Error err; - text->ptr = buffer->cursor; + text->len = 0; while(value) { - err = FAXPP_buffer_append(buffer, value->value.ptr, value->value.len); + err = FAXPP_buffer_append_text(buffer, &value->value); if(err != NO_ERROR) return err; + + text->len += value->value.len; value = value->next; } - - text->len = buffer->cursor - text->ptr; + // Work out the pointer from the calculated length - since a buffer + // reallocation won't necessarily update text->ptr + text->ptr = buffer->cursor - text->len; + if(env->tenv->null_terminate) return FAXPP_buffer_append_ch(buffer, env->tenv->transcoder.encode, 0); @@ -883,6 +895,9 @@ // Reset the event buffer cursor FAXPP_reset_buffer(&env->event_buffer); + // This event has not been returned yet + env->event_returned = 0; + // Clear the event env->event.type = NO_EVENT; @@ -1188,6 +1203,8 @@ static FAXPP_Error p_create_entity_info(FAXPP_ParserEnv *env, FAXPP_EntityInfo **list) { + const FAXPP_Text *text; + FAXPP_EntityInfo *ent = (FAXPP_EntityInfo*)malloc(sizeof(FAXPP_EntityInfo)); if(!ent) return OUT_OF_MEMORY; @@ -1200,7 +1217,10 @@ } *list = ent; - p_set_text_from_text(&ent->base_uri, FAXPP_get_base_uri(env)); + text = FAXPP_get_base_uri(env); + if(text != 0) { + p_set_text_from_text(&ent->base_uri, text); + } p_force_copy_text_from_token(&ent->name, env, &env->entity_buffer); p_set_location_from_token(ent, env); @@ -1863,7 +1883,7 @@ p_set_event_location_from_token(env); break; case START_ELEMENT_NAME_TOKEN: - if(env->event.type != NO_EVENT) { + if(env->event_returned == 1) { p_reset_event(env); } p_copy_text_from_token(&env->event.name, env, /*useTokenBuffer*/0); @@ -1926,7 +1946,7 @@ p_set_event_location_from_token(env); break; case END_ELEMENT_NAME_TOKEN: - if(env->event.type != NO_EVENT) { + if(env->event_returned == 1) { p_reset_event(env); } p_copy_text_from_token(&env->event.name, env, /*useTokenBuffer*/0); @@ -2183,7 +2203,6 @@ if(attr->prefix.len != 0) { p_copy_text_from_event(&nsinfo->prefix, &attr->name, env, &env->element_info_stack->buffer); } - return NO_ERROR; } Modified: trunk/faxpp/src/xml_parser.h =================================================================== --- trunk/faxpp/src/xml_parser.h 2008-05-22 16:39:07 UTC (rev 52) +++ trunk/faxpp/src/xml_parser.h 2008-08-08 11:25:17 UTC (rev 53) @@ -118,6 +118,7 @@ unsigned int current_notation:1; unsigned int standalone:1; + unsigned int event_returned:1; enum { XML_VERSION_NOT_KNOWN = 0, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |