Bug #302764 - Inside __iter__, only recurse 1 deep, in order to avoid
authorZac Medico <zmedico@gentoo.org>
Tue, 2 Mar 2010 19:50:25 +0000 (19:50 -0000)
committerZac Medico <zmedico@gentoo.org>
Tue, 2 Mar 2010 19:50:25 +0000 (19:50 -0000)
iteration over entries from another nested cache instance. This can
happen if the user nests an overlay inside /usr/portage/local. Thanks
to Vlastimil Babka <caster@g.o> for this patch. (trunk r15295)

svn path=/main/branches/2.1.7/; revision=15534

pym/portage/cache/flat_hash.py

index 93411580584f943c5c767fd95b2efa8cb09f259d..f882c24756fc4339efb5e12acc8e71c5fa6bb841 100644 (file)
@@ -120,11 +120,12 @@ class database(fs_template.FsBased):
 
        def __iter__(self):
                """generator for walking the dir struct"""
-               dirs = [self.location]
+               dirs = [(0, self.location)]
                len_base = len(self.location)
                while len(dirs):
                        try:
-                               dir_list = os.listdir(dirs[0])
+                               depth = dirs[0][0]
+                               dir_list = os.listdir(dirs[0][1])
                        except OSError as e:
                                if e.errno != errno.ENOENT:
                                        raise
@@ -134,10 +135,15 @@ class database(fs_template.FsBased):
                        for l in dir_list:
                                if l.endswith(".cpickle"):
                                        continue
-                               p = os.path.join(dirs[0],l)
+                               p = os.path.join(dirs[0][1], l)
                                st = os.lstat(p)
                                if stat.S_ISDIR(st.st_mode):
-                                       dirs.append(p)
+                                       # Only recurse 1 deep, in order to avoid iteration over
+                                       # entries from another nested cache instance. This can
+                                       # happen if the user nests an overlay inside
+                                       # /usr/portage/local as in bug #302764.
+                                       if depth < 1:
+                                               dirs.append((depth+1, p))
                                        continue
                                yield p[len_base+1:]
                        dirs.pop(0)