From 4bb991fbb487c1b814d10db42ebd23e4fd45881d Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 11 Mar 2014 21:31:55 +0800 Subject: [PATCH] Fix memory leak when searching regexp. --- src/onig-reg-exp.cc | 9 ++++++--- src/onig-reg-exp.h | 4 +++- src/onig-scanner.cc | 10 +++++----- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/onig-reg-exp.cc b/src/onig-reg-exp.cc index 4f97017..85c14ac 100644 --- a/src/onig-reg-exp.cc +++ b/src/onig-reg-exp.cc @@ -30,9 +30,12 @@ bool OnigRegExp::Contains(const string& value) { return source_.find(value) != string::npos; } -OnigResult* OnigRegExp::Search(const string& searchString, size_t position) { - if (!regex_) +shared_ptr OnigRegExp::Search(const string& searchString, + size_t position) { + if (!regex_) { ThrowException(Exception::Error(String::New("RegExp is not valid"))); + return NULL; + } int end = searchString.size(); OnigRegion* region = onig_region_new(); @@ -42,7 +45,7 @@ OnigResult* OnigRegExp::Search(const string& searchString, size_t position) { ONIG_OPTION_NONE); if (status != ONIG_MISMATCH) { - return new OnigResult(region, searchString); + return shared_ptr(new OnigResult(region, searchString)); } else { onig_region_free(region, 1); return NULL; diff --git a/src/onig-reg-exp.h b/src/onig-reg-exp.h index 8be9d01..517a2e6 100644 --- a/src/onig-reg-exp.h +++ b/src/onig-reg-exp.h @@ -1,10 +1,12 @@ #ifndef SRC_ONIG_REG_EXP_H_ #define SRC_ONIG_REG_EXP_H_ +#include #include #include "oniguruma.h" +using ::std::shared_ptr; using ::std::string; class OnigResult; @@ -16,7 +18,7 @@ class OnigRegExp { bool Contains(const string& value); int LocationAt(int index); - OnigResult *Search(const string &searchString, size_t position); + shared_ptr Search(const string &searchString, size_t position); private: OnigRegExp(const OnigRegExp&); // Disallow copying diff --git a/src/onig-scanner.cc b/src/onig-scanner.cc index cb71cbb..e5cd4ca 100644 --- a/src/onig-scanner.cc +++ b/src/onig-scanner.cc @@ -76,16 +76,16 @@ Handle OnigScanner::FindNextMatch(Handle v8String, Handle OnigRegExp *regExp = (*iter).get(); bool useCachedResult = false; - OnigResult *result = NULL; + shared_ptr result; if (useCachedResults && index <= maxCachedIndex) { - result = cachedResults[index].get(); - useCachedResult = (result == NULL || result->LocationAt(0) >= charOffset); + result = cachedResults[index]; + useCachedResult = (!result || result->LocationAt(0) >= charOffset); } if (!useCachedResult) { result = regExp->Search(string, byteOffset); - cachedResults[index] = shared_ptr(result); + cachedResults[index] = result; maxCachedIndex = index; } @@ -93,7 +93,7 @@ Handle OnigScanner::FindNextMatch(Handle v8String, Handle int location = result->LocationAt(0); if (bestIndex == -1 || location < bestLocation) { bestLocation = location; - bestResult = result; + bestResult = result.get(); bestIndex = index; }