diff options
author | Daniel Veillard <veillard@src.gnome.org> | 2005-09-15 13:09:00 +0000 |
---|---|---|
committer | Daniel Veillard <veillard@src.gnome.org> | 2005-09-15 13:09:00 +0000 |
commit | 94cc103b8cfcfb040b5aad121d7fbd928f6a1336 (patch) | |
tree | 0f9ac684d67956f2205d5c766b35f7612c5c5b83 /xmlregexp.c | |
parent | ef3d07d8097c216c86fa76d6343a8be572d2860c (diff) | |
download | android_external_libxml2-94cc103b8cfcfb040b5aad121d7fbd928f6a1336.tar.gz android_external_libxml2-94cc103b8cfcfb040b5aad121d7fbd928f6a1336.tar.bz2 android_external_libxml2-94cc103b8cfcfb040b5aad121d7fbd928f6a1336.zip |
detect combinatory explosion and return with a runtime error in those
* xmlregexp.c: detect combinatory explosion and return with
a runtime error in those case, c.f. #316338 though maybe we
should not see such an explosion with that specific regexp,
more checking needs to be done.
Daniel
Diffstat (limited to 'xmlregexp.c')
-rw-r--r-- | xmlregexp.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/xmlregexp.c b/xmlregexp.c index 45b917b9..9d479217 100644 --- a/xmlregexp.c +++ b/xmlregexp.c @@ -42,6 +42,8 @@ /* #define DEBUG_PUSH */ /* #define DEBUG_COMPACTION */ +#define MAX_PUSH 100000 + #define ERROR(str) \ ctxt->error = XML_REGEXP_COMPILE_ERROR; \ xmlRegexpErrCompile(ctxt, str); @@ -326,6 +328,7 @@ struct _xmlRegExecCtxt { xmlRegStatePtr errState; /* the error state */ xmlChar *errString; /* the string raising the error */ int *errCounts; /* counters at the error state */ + int nbPush; }; #define REGEXP_ALL_COUNTER 0x123456 @@ -2336,6 +2339,12 @@ xmlFARegExecSave(xmlRegExecCtxtPtr exec) { xmlFARegDebugExec(exec); exec->transno--; #endif +#ifdef MAX_PUSH + if (exec->nbPush > MAX_PUSH) { + return; + } + exec->nbPush++; +#endif if (exec->maxRollbacks == 0) { exec->maxRollbacks = 4; @@ -2426,6 +2435,7 @@ xmlFARegExec(xmlRegexpPtr comp, const xmlChar *content) { exec->inputString = content; exec->index = 0; + exec->nbPush = 0; exec->determinist = 1; exec->maxRollbacks = 0; exec->nbRollbacks = 0; @@ -2632,8 +2642,11 @@ progress: xmlFree(exec->counts); if (exec->status == 0) return(1); - if (exec->status == -1) + if (exec->status == -1) { + if (exec->nbPush > MAX_PUSH) + return(-1); return(0); + } return(exec->status); } @@ -2708,6 +2721,7 @@ xmlRegNewExecCtxt(xmlRegexpPtr comp, xmlRegExecCallbacks callback, void *data) { exec->inputStack = NULL; exec->errStateNo = -1; exec->errString = NULL; + exec->nbPush = 0; return(exec); } |