[oe-commits] [bitbake] branch master updated: parse/ast: ensure saved event handlers really do get restored

git at git.openembedded.org git at git.openembedded.org
Fri Aug 24 06:54:03 UTC 2018


This is an automated email from the git hooks/post-receive script.

rpurdie pushed a commit to branch master
in repository bitbake.

The following commit(s) were added to refs/heads/master by this push:
     new e5f1f8f  parse/ast: ensure saved event handlers really do get restored
e5f1f8f is described below

commit e5f1f8fa201774e0c3c554d59b277baa2128708f
Author: Paul Eggleton <paul.eggleton at linux.intel.com>
AuthorDate: Fri Aug 24 16:17:54 2018 +1200

    parse/ast: ensure saved event handlers really do get restored
    
    In finalize() we save event handlers, register the ones relevant to the
    recipe being finalised, trigger events, and then restore the handlers so
    that one recipe's custom handlers (actually implemented within a class
    inherited by the recipe) do not affect other recipes. However, if an
    exception occurs during parsing, the saved handlers were not being
    restored. Use a try...finally block to ensure that the handlers are
    always restored.
    
    This issue became apparent since in OpenEmbedded-Core we have recently
    introduced a find_intercepts() handler for the
    bb.event.RecipePreFinalise event in image-postinst-intercepts.bbclass
    that images and old-style SDK recipes will end up inheriting. So far it
    doesn't seem that the the error has manifested itself in normal builds,
    but when parsing OE-Core recipes in the OE layer index it has:
    core-image-rt-* image recipes were parsed which in the default
    configuration raise SkipRecipe. The next non-image recipe that is parsed
    will trigger a real exception, because the find_intercepts() handler is
    still registered and gets fired, but in the context of the new recipe
    the POSTINST_INTERCEPTS_PATHS variable is not set, and the code in
    find_intercepts() is written with the reasonable assumption that that
    isn't possible given that the class itself sets a default, and thus it
    fails.
    
    Signed-off-by: Paul Eggleton <paul.eggleton at linux.intel.com>
    Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
---
 lib/bb/parse/ast.py | 37 +++++++++++++++++++------------------
 1 file changed, 19 insertions(+), 18 deletions(-)

diff --git a/lib/bb/parse/ast.py b/lib/bb/parse/ast.py
index 6690dc5..9d20c32 100644
--- a/lib/bb/parse/ast.py
+++ b/lib/bb/parse/ast.py
@@ -343,30 +343,31 @@ def runAnonFuncs(d):
 
 def finalize(fn, d, variant = None):
     saved_handlers = bb.event.get_handlers().copy()
+    try:
+        for var in d.getVar('__BBHANDLERS', False) or []:
+            # try to add the handler
+            handlerfn = d.getVarFlag(var, "filename", False)
+            if not handlerfn:
+                bb.fatal("Undefined event handler function '%s'" % var)
+            handlerln = int(d.getVarFlag(var, "lineno", False))
+            bb.event.register(var, d.getVar(var, False), (d.getVarFlag(var, "eventmask") or "").split(), handlerfn, handlerln)
 
-    for var in d.getVar('__BBHANDLERS', False) or []:
-        # try to add the handler
-        handlerfn = d.getVarFlag(var, "filename", False)
-        if not handlerfn:
-            bb.fatal("Undefined event handler function '%s'" % var)
-        handlerln = int(d.getVarFlag(var, "lineno", False))
-        bb.event.register(var, d.getVar(var, False), (d.getVarFlag(var, "eventmask") or "").split(), handlerfn, handlerln)
-
-    bb.event.fire(bb.event.RecipePreFinalise(fn), d)
+        bb.event.fire(bb.event.RecipePreFinalise(fn), d)
 
-    bb.data.expandKeys(d)
-    runAnonFuncs(d)
+        bb.data.expandKeys(d)
+        runAnonFuncs(d)
 
-    tasklist = d.getVar('__BBTASKS', False) or []
-    bb.event.fire(bb.event.RecipeTaskPreProcess(fn, list(tasklist)), d)
-    bb.build.add_tasks(tasklist, d)
+        tasklist = d.getVar('__BBTASKS', False) or []
+        bb.event.fire(bb.event.RecipeTaskPreProcess(fn, list(tasklist)), d)
+        bb.build.add_tasks(tasklist, d)
 
-    bb.parse.siggen.finalise(fn, d, variant)
+        bb.parse.siggen.finalise(fn, d, variant)
 
-    d.setVar('BBINCLUDED', bb.parse.get_file_depends(d))
+        d.setVar('BBINCLUDED', bb.parse.get_file_depends(d))
 
-    bb.event.fire(bb.event.RecipeParsed(fn), d)
-    bb.event.set_handlers(saved_handlers)
+        bb.event.fire(bb.event.RecipeParsed(fn), d)
+    finally:
+        bb.event.set_handlers(saved_handlers)
 
 def _create_variants(datastores, names, function, onlyfinalise):
     def create_variant(name, orig_d, arg = None):

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Openembedded-commits mailing list