mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 21:09:03 +02:00
bitbake: parse: Forbid ambiguous assignments to ${.}, ${+}, and ${:} variables
Old code that parse variable names in assignment commands behave differently for variables that ends with special symbol for single-character variable names and multi-character variable names. For example: A+="1" # Change variable ${A}, '+' glued to '=' A+ = "1" # Change variable ${A+} +="1" # Change variable ${+}, the '+' symbol not part of assignment operator + = "1" # Change variable ${+} New code would always assume that '.=', '+=', and ':=' is assignment operator. As result code like the following would raise parsing error +="value" While code with extra spaces would work as before + = "value" # Change variable ${+} This change allow to catch issues in code that generate bitbake configuration files in a manner like "echo ${VARNAME}+=${VALUE} >> conf/local.conf" (Bitbake rev: 93059aad13a12cd69d86368795c88e5349197d5d) Signed-off-by: Nikolai Merinov <n.merinov@inango-systems.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
c2da016918
commit
b65452bda3
|
@ -20,7 +20,7 @@ from bb.parse import ParseError, resolve_file, ast, logger, handle
|
||||||
__config_regexp__ = re.compile( r"""
|
__config_regexp__ = re.compile( r"""
|
||||||
^
|
^
|
||||||
(?P<exp>export\s+)?
|
(?P<exp>export\s+)?
|
||||||
(?P<var>[a-zA-Z0-9\-_+.${}/~:]+?)
|
(?P<var>[a-zA-Z0-9\-_+.${}/~:]*?)
|
||||||
(\[(?P<flag>[a-zA-Z0-9\-_+.][a-zA-Z0-9\-_+.@/]*)\])?
|
(\[(?P<flag>[a-zA-Z0-9\-_+.][a-zA-Z0-9\-_+.@/]*)\])?
|
||||||
|
|
||||||
\s* (
|
\s* (
|
||||||
|
@ -166,6 +166,8 @@ def feeder(lineno, s, fn, statements, baseconfig=False, conffile=True):
|
||||||
m = __config_regexp__.match(s)
|
m = __config_regexp__.match(s)
|
||||||
if m:
|
if m:
|
||||||
groupd = m.groupdict()
|
groupd = m.groupdict()
|
||||||
|
if groupd['var'] == "":
|
||||||
|
raise ParseError("Empty variable name in assignment: '%s'" % s, fn, lineno);
|
||||||
ast.handleData(statements, fn, lineno, groupd)
|
ast.handleData(statements, fn, lineno, groupd)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
|
@ -443,3 +443,23 @@ include \\
|
||||||
in_file.write("\n".join(lines))
|
in_file.write("\n".join(lines))
|
||||||
in_file.flush()
|
in_file.flush()
|
||||||
bb.parse.handle(recipename_closed, bb.data.createCopy(self.d))
|
bb.parse.handle(recipename_closed, bb.data.createCopy(self.d))
|
||||||
|
|
||||||
|
special_character_assignment = """
|
||||||
|
A+="a"
|
||||||
|
A+ = "b"
|
||||||
|
+ = "c"
|
||||||
|
"""
|
||||||
|
ambigous_assignment = """
|
||||||
|
+= "d"
|
||||||
|
"""
|
||||||
|
def test_parse_special_character_assignment(self):
|
||||||
|
f = self.parsehelper(self.special_character_assignment)
|
||||||
|
d = bb.parse.handle(f.name, self.d)['']
|
||||||
|
self.assertEqual(d.getVar("A"), " a")
|
||||||
|
self.assertEqual(d.getVar("A+"), "b")
|
||||||
|
self.assertEqual(d.getVar("+"), "c")
|
||||||
|
|
||||||
|
f = self.parsehelper(self.ambigous_assignment)
|
||||||
|
with self.assertRaises(bb.parse.ParseError) as error:
|
||||||
|
bb.parse.handle(f.name, self.d)
|
||||||
|
self.assertIn("Empty variable name in assignment", str(error.exception))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user