aboutsummaryrefslogtreecommitdiffstats
path: root/xmlregexp.c
diff options
context:
space:
mode:
authorDaniel Veillard <veillard@src.gnome.org>2005-09-15 13:09:00 +0000
committerDaniel Veillard <veillard@src.gnome.org>2005-09-15 13:09:00 +0000
commit94cc103b8cfcfb040b5aad121d7fbd928f6a1336 (patch)
tree0f9ac684d67956f2205d5c766b35f7612c5c5b83 /xmlregexp.c
parentef3d07d8097c216c86fa76d6343a8be572d2860c (diff)
downloadandroid_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.c16
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);
}