[Support] - Fix possible crash in match() of llvm::Regex.

Crash was possible if match() method
was called on object that was moved or object
created with empty constructor.

Testcases updated.

DIfferential revision: https://reviews.llvm.org/D24123

llvm-svn: 280473
This commit is contained in:
George Rimar 2016-09-02 08:44:46 +00:00
parent d8a4ecac3b
commit d8dfeec019
3 changed files with 20 additions and 5 deletions

View File

@ -52,11 +52,7 @@ namespace llvm {
std::swap(error, regex.error);
return *this;
}
Regex(Regex &&regex) {
preg = regex.preg;
error = regex.error;
regex.preg = nullptr;
}
Regex(Regex &&regex);
~Regex();
/// isValid - returns the error encountered during regex compilation, or

View File

@ -34,6 +34,13 @@ Regex::Regex(StringRef regex, unsigned Flags) {
error = llvm_regcomp(preg, regex.data(), flags|REG_PEND);
}
Regex::Regex(Regex &&regex) {
preg = regex.preg;
error = regex.error;
regex.preg = nullptr;
regex.error = REG_BADPAT;
}
Regex::~Regex() {
if (preg) {
llvm_regfree(preg);
@ -59,6 +66,9 @@ unsigned Regex::getNumMatches() const {
}
bool Regex::match(StringRef String, SmallVectorImpl<StringRef> *Matches){
if (error)
return false;
unsigned nmatch = Matches ? preg->re_nsub+1 : 0;
// pmatch needs to have at least one element.

View File

@ -151,6 +151,8 @@ TEST_F(RegexTest, MoveAssign) {
Regex r2("abc");
r2 = std::move(r1);
EXPECT_TRUE(r2.match("916"));
std::string Error;
EXPECT_FALSE(r1.isValid(Error));
}
TEST_F(RegexTest, NoArgConstructor) {
@ -162,4 +164,11 @@ TEST_F(RegexTest, NoArgConstructor) {
EXPECT_TRUE(r1.isValid(Error));
}
TEST_F(RegexTest, MatchInvalid) {
Regex r1;
std::string Error;
EXPECT_FALSE(r1.isValid(Error));
EXPECT_FALSE(r1.match("X"));
}
}