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:
Lukas Fleischer 2011-01-28 17:40:02 +01:00
parent da2ebb667b
commit 492c8c668f

View file

@ -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;
} }