mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-25 12:49:50 +00:00
[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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280473 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
677dd5b404
commit
e1bd92bac5
@ -52,11 +52,7 @@ namespace llvm {
|
||||
std::swap(error, regex.error);
|
||||
return *this;
|
||||
}
|
||||
Regex(Regex &®ex) {
|
||||
preg = regex.preg;
|
||||
error = regex.error;
|
||||
regex.preg = nullptr;
|
||||
}
|
||||
Regex(Regex &®ex);
|
||||
~Regex();
|
||||
|
||||
/// isValid - returns the error encountered during regex compilation, or
|
||||
|
@ -34,6 +34,13 @@ Regex::Regex(StringRef regex, unsigned Flags) {
|
||||
error = llvm_regcomp(preg, regex.data(), flags|REG_PEND);
|
||||
}
|
||||
|
||||
Regex::Regex(Regex &®ex) {
|
||||
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.
|
||||
|
@ -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"));
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user