diff options
author | Daniel Veillard <veillard@src.gnome.org> | 2002-04-15 10:15:25 +0000 |
---|---|---|
committer | Daniel Veillard <veillard@src.gnome.org> | 2002-04-15 10:15:25 +0000 |
commit | 940492d429025d449cacac1b6293c9600554579b (patch) | |
tree | 0fa888c6b62852d26540fc85aa627ec24eda1e35 /valid.c | |
parent | eb475a37df2e37a2a9675eeb84db6de3222649cc (diff) | |
download | android_external_libxml2-940492d429025d449cacac1b6293c9600554579b.tar.gz android_external_libxml2-940492d429025d449cacac1b6293c9600554579b.tar.bz2 android_external_libxml2-940492d429025d449cacac1b6293c9600554579b.zip |
first part of fixing #78729 Daniel
* valid.c: first part of fixing #78729
Daniel
Diffstat (limited to 'valid.c')
-rw-r--r-- | valid.c | 15 |
1 files changed, 10 insertions, 5 deletions
@@ -91,6 +91,7 @@ typedef struct _xmlValidState { unsigned char state; /* ROLLBACK_XXX */ } _xmlValidState; +#define MAX_RECURSE 1024 #define MAX_DEPTH ((sizeof(_xmlValidState.occurs)) * 8) #define CONT ctxt->vstate->cont #define NODE ctxt->vstate->node @@ -110,6 +111,9 @@ vstateVPush(xmlValidCtxtPtr ctxt, xmlElementContentPtr cont, unsigned char state) { int i = ctxt->vstateNr - 1; + if (ctxt->vstateNr > MAX_RECURSE) { + return(-1); + } if (ctxt->vstateNr >= ctxt->vstateMax) { ctxt->vstateMax *= 2; ctxt->vstateTab = (xmlValidState *) xmlRealloc(ctxt->vstateTab, @@ -117,7 +121,7 @@ vstateVPush(xmlValidCtxtPtr ctxt, xmlElementContentPtr cont, if (ctxt->vstateTab == NULL) { xmlGenericError(xmlGenericErrorContext, "realloc failed !n"); - return(0); + return(-1); } ctxt->vstate = &ctxt->vstateTab[0]; } @@ -3608,7 +3612,8 @@ cont: (CONT->ocur == XML_ELEMENT_CONTENT_OPT) || ((CONT->ocur == XML_ELEMENT_CONTENT_PLUS) && (OCCURRENCE)))) { DEBUG_VALID_MSG("saving parent branch"); - vstateVPush(ctxt, CONT, NODE, DEPTH, OCCURS, ROLLBACK_PARENT); + if (vstateVPush(ctxt, CONT, NODE, DEPTH, OCCURS, ROLLBACK_PARENT) < 0) + return(0); } @@ -3714,9 +3719,9 @@ cont: * save the second branch 'or' branch */ DEBUG_VALID_MSG("saving 'or' branch"); - vstateVPush(ctxt, CONT->c2, NODE, (unsigned char)(DEPTH + 1), - OCCURS, ROLLBACK_OR); - + if (vstateVPush(ctxt, CONT->c2, NODE, (unsigned char)(DEPTH + 1), + OCCURS, ROLLBACK_OR) < 0) + return(-1); DEPTH++; CONT = CONT->c1; goto cont; |