* Patch from Alexey Torgashin to handle invalid groups. Fix issue #39697

This commit is contained in:
Michaël Van Canneyt 2022-04-30 22:33:43 +02:00
parent 77851090aa
commit 20887aeadd

View File

@ -817,7 +817,7 @@ uses
const
// TRegExpr.VersionMajor/Minor return values of these constants:
REVersionMajor = 1;
REVersionMinor = 154;
REVersionMinor = 155;
OpKind_End = REChar(1);
OpKind_MetaClass = REChar(2);
@ -5745,10 +5745,11 @@ var
APtr := p;
end;
procedure FindSubstGroupIndex(var p: PRegExprChar; var Idx: integer);
procedure FindSubstGroupIndex(var p: PRegExprChar; var Idx: integer; var NumberFound: boolean);
begin
Idx := ParseVarName(p);
if (Idx >= 0) and (Idx <= High(GrpIndexes)) then
NumberFound := (Idx >= 0) and (Idx <= High(GrpIndexes));
if NumberFound then
Idx := GrpIndexes[Idx];
end;
@ -5759,6 +5760,7 @@ var
p, p0, p1, ResultPtr: PRegExprChar;
ResultLen, n: integer;
Ch, QuotedChar: REChar;
GroupFound: boolean;
begin
// Check programm and input string
if not IsProgrammOk then
@ -5780,11 +5782,13 @@ begin
Ch := p^;
Inc(p);
n := -1;
GroupFound := False;
if Ch = SubstituteGroupChar then
FindSubstGroupIndex(p, n);
if n >= 0 then
FindSubstGroupIndex(p, n, GroupFound);
if GroupFound then
begin
Inc(ResultLen, GrpEnd[n] - GrpStart[n]);
if n >= 0 then
Inc(ResultLen, GrpEnd[n] - GrpStart[n]);
end
else
begin
@ -5835,12 +5839,18 @@ begin
Inc(p);
p1 := p;
n := -1;
GroupFound := False;
if Ch = SubstituteGroupChar then
FindSubstGroupIndex(p, n);
if (n >= 0) then
FindSubstGroupIndex(p, n, GroupFound);
if GroupFound then
begin
p0 := GrpStart[n];
p1 := GrpEnd[n];
if n >= 0 then
begin
p0 := GrpStart[n];
p1 := GrpEnd[n];
end
else
p1 := p0;
end
else
begin