Make Regexp::Simplify() return a null pointer when stopped early.
Change-Id: I19e447e6c7dec34201299a12104e72bf7e792a9e
Reviewed-on: https://code-review.googlesource.com/c/re2/+/57570
Reviewed-by: Paul Wankadia <junyer@google.com>
diff --git a/re2/prefilter.cc b/re2/prefilter.cc
index f61d54b..a47b312 100644
--- a/re2/prefilter.cc
+++ b/re2/prefilter.cc
@@ -648,14 +648,15 @@
return NULL;
Regexp* simple = re->Simplify();
- Prefilter::Info *info = BuildInfo(simple);
+ if (simple == NULL)
+ return NULL;
+ Prefilter::Info* info = BuildInfo(simple);
simple->Decref();
if (info == NULL)
return NULL;
Prefilter* m = info->TakeMatch();
-
delete info;
return m;
}
diff --git a/re2/simplify.cc b/re2/simplify.cc
index 270f0ff..663d5fc 100644
--- a/re2/simplify.cc
+++ b/re2/simplify.cc
@@ -28,8 +28,6 @@
Regexp* sre = re->Simplify();
re->Decref();
if (sre == NULL) {
- // Should not happen, since Simplify never fails.
- LOG(ERROR) << "Simplify failed on " << src;
if (status) {
status->set_code(kRegexpInternalError);
status->set_error_arg(src);
@@ -180,10 +178,20 @@
CoalesceWalker cw;
Regexp* cre = cw.Walk(this, NULL);
if (cre == NULL)
- return cre;
+ return NULL;
+ if (cw.stopped_early()) {
+ cre->Decref();
+ return NULL;
+ }
SimplifyWalker sw;
Regexp* sre = sw.Walk(cre, NULL);
cre->Decref();
+ if (sre == NULL)
+ return NULL;
+ if (sw.stopped_early()) {
+ sre->Decref();
+ return NULL;
+ }
return sre;
}