Skip to content

Commit 82fcefa

Browse files
gh-136073: Fix expandvars() in Tools/freeze/checkextensions.py
* Fix potential infinite recursion and/or memory consumption. * Fix a bug when reference can cross boundaries of substitutions, e.g. expandvars('$a)', {'a': '$(b', 'b': 'c'}). * Fix potential quadratic complexity.
1 parent 5334732 commit 82fcefa

File tree

1 file changed

+19
-18
lines changed

1 file changed

+19
-18
lines changed

Tools/freeze/checkextensions.py

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import os
66
import parsesetup
7+
import re
78

89
def checkextensions(unknown, extensions):
910
files = []
@@ -70,21 +71,21 @@ def treatword(w):
7071
return w
7172

7273
def expandvars(str, vars):
73-
i = 0
74-
while i < len(str):
75-
i = k = str.find('$', i)
76-
if i < 0:
77-
break
78-
i = i+1
79-
var = str[i:i+1]
80-
i = i+1
81-
if var == '(':
82-
j = str.find(')', i)
83-
if j < 0:
84-
break
85-
var = str[i:j]
86-
i = j+1
87-
if var in vars:
88-
str = str[:k] + vars[var] + str[i:]
89-
i = k
90-
return str
74+
def repl(m):
75+
name = m[1]
76+
if name[0] == '(':
77+
if name[-1] != ')':
78+
return m[0]
79+
name = name[1:-1]
80+
if name in vars and name not in seen:
81+
seen.add(name)
82+
result = expandvars(vars[name])
83+
seen.remove(name)
84+
return result
85+
return m[0]
86+
87+
def expandvars(str):
88+
return re.sub(r'(?m)\$(\([^)]*\)?|.)', repl, str)
89+
90+
seen = set()
91+
return expandvars(str)

0 commit comments

Comments
 (0)