package.bbclass: handle links in sorted order

When processing links, the directories are processed in unsorted order
which can result in cases like /var/lock -> /run/lock handled before
/var/run -> /run throwing an error for /var/run because /run already exists.
Change the link processing to ensure links are processed in sorted order of
the destination.

[YOCTO #9430]

(From OE-Core rev: d71f4f54b4c22c9382bddce66c1580d875dcfef2)

Signed-off-by: Bill Randle <william.c.randle@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Bill Randle 2016-04-12 08:22:21 -07:00 committed by Richard Purdie
parent 29cf26363f
commit 9262d2ff39
1 changed files with 10 additions and 9 deletions

View File

@ -727,6 +727,7 @@ python fixup_perms () {
dvar = d.getVar('PKGD', True)
fs_perms_table = {}
fs_link_table = {}
# By default all of the standard directories specified in
# bitbake.conf will get 0755 root:root.
@ -773,24 +774,27 @@ python fixup_perms () {
continue
entry = fs_perms_entry(d.expand(line))
if entry and entry.path:
fs_perms_table[entry.path] = entry
if entry.link:
fs_link_table[entry.link] = entry
else:
fs_perms_table[entry.path] = entry
f.close()
# Debug -- list out in-memory table
#for dir in fs_perms_table:
# bb.note("Fixup Perms: %s: %s" % (dir, str(fs_perms_table[dir])))
#for link in fs_link_table:
# bb.note("Fixup Perms: %s: %s" % (link, str(fs_link_table[link])))
# We process links first, so we can go back and fixup directory ownership
# for any newly created directories
for dir in fs_perms_table:
if not fs_perms_table[dir].link:
continue
# Process in sorted order so /run gets created before /run/lock, etc.
for link in sorted(fs_link_table):
dir = fs_link_table[link].path
origin = dvar + dir
if not (cpath.exists(origin) and cpath.isdir(origin) and not cpath.islink(origin)):
continue
link = fs_perms_table[dir].link
if link[0] == "/":
target = dvar + link
ptarget = link
@ -810,9 +814,6 @@ python fixup_perms () {
os.symlink(link, origin)
for dir in fs_perms_table:
if fs_perms_table[dir].link:
continue
origin = dvar + dir
if not (cpath.exists(origin) and cpath.isdir(origin)):
continue