mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
Avoid infinite loop in PKGBUILD variable parser (fixes FS#19482).
Improves variable substitution in the PKGBUILD parser a bit to avoid infinite replacement loops when a PKGBUILD contains assigments of the form "foo=${foo[@]}bar". Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
This commit is contained in:
parent
da2ebb667b
commit
492c8c668f
1 changed files with 16 additions and 8 deletions
|
@ -178,16 +178,24 @@ if ($_COOKIE["AURSID"]):
|
||||||
|
|
||||||
# Simple variable replacement
|
# Simple variable replacement
|
||||||
$pattern_var = '/\$({?)([_\w]+)(}?)/';
|
$pattern_var = '/\$({?)([_\w]+)(}?)/';
|
||||||
while (preg_match($pattern_var,$v,$regs)) {
|
$offset = 0;
|
||||||
$pieces = explode(" ",$pkgbuild["$regs[2]"],2);
|
while (preg_match($pattern_var, $v, $regs, PREG_OFFSET_CAPTURE, $offset)) {
|
||||||
|
$var = $regs[2][0];
|
||||||
|
$pos = $regs[0][1];
|
||||||
|
$len = strlen($regs[0][0]);
|
||||||
|
|
||||||
$pattern = '/\$'.$regs[1].$regs[2].$regs[3].'/';
|
if (isset($new_pkgbuild[$var])) {
|
||||||
if ($regs[2] != $k) {
|
$replacement = explode(" ", $new_pkgbuild[$var], 2);
|
||||||
$replacement = $pieces[0];
|
|
||||||
} else {
|
|
||||||
$replacement = "";
|
|
||||||
}
|
}
|
||||||
$v=preg_replace($pattern, $replacement, $v);
|
elseif (isset($pkgbuild[$var]) && $var != $k) {
|
||||||
|
$replacement = explode(" ", $pkgbuild[$var], 2);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$replacement = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$v = substr_replace($v, $replacement, $pos, $len);
|
||||||
|
$offset += strlen($replacement);
|
||||||
}
|
}
|
||||||
$new_pkgbuild[$k] = $v;
|
$new_pkgbuild[$k] = $v;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue