]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/commitdiff
taskdata: fix a possible infinite loop when multiple eligible providers aren't buildable
authorChris Larson <clarson@mvista.com>
Fri, 17 Jul 2009 22:26:45 +0000 (15:26 -0700)
committerChris Larson <clarson@mvista.com>
Tue, 21 Jul 2009 23:20:05 +0000 (16:20 -0700)
The code which removes providers which aren't buildable from the eligible list
modifies the list while iterating it, resulting in skipping some entries.  If
the list contained two failed providers in sequence, it left the second behind
in the eligible list.

Fixed by replacing the block with a list comprehension that constructs a new
eligible list without the failed entries.

Signed-off-by: Chris Larson <clarson@mvista.com>
lib/bb/taskdata.py

index 52a4f4e647f881e01ccd990a6bbc83eec0c8d15e..73ec2aa750be4c59519ef3f5b61a39146b49d70c 100644 (file)
@@ -373,11 +373,7 @@ class TaskData:
         all_p = dataCache.providers[item]
 
         eligible, foundUnique = bb.providers.filterProviders(all_p, item, cfgData, dataCache)
-
-        for p in eligible:
-            fnid = self.getfn_id(p)
-            if fnid in self.failed_fnids:
-                eligible.remove(p)
+        eligible = [p for p in eligible if not self.getfn_id(p) in self.failed_fnids]
 
         if not eligible:
             bb.msg.note(2, bb.msg.domain.Provider, "No buildable provider PROVIDES '%s' but '%s' DEPENDS on or otherwise requires it. Enable debugging and see earlier logs to find unbuildable providers." % (item, self.get_dependees_str(item)))
@@ -425,11 +421,7 @@ class TaskData:
             raise bb.providers.NoRProvider(item)
 
         eligible, numberPreferred = bb.providers.filterProvidersRunTime(all_p, item, cfgData, dataCache)
-
-        for p in eligible:
-            fnid = self.getfn_id(p)
-            if fnid in self.failed_fnids:
-                eligible.remove(p)
+        eligible = [p for p in eligible if not self.getfn_id(p) in self.failed_fnids]
 
         if not eligible:
             bb.msg.error(bb.msg.domain.Provider, "'%s' RDEPENDS/RRECOMMENDS or otherwise requires the runtime entity '%s' but it wasn't found in any PACKAGE or RPROVIDES variables of any buildable targets.\nEnable debugging and see earlier logs to find unbuildable targets." % (self.get_rdependees_str(item), item))