From patchwork Sat Oct 13 12:12:02 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: package.bbclass: search for dangling links in installation directory Date: Sat, 13 Oct 2012 12:12:02 -0000 From: Enrico Scholz X-Patchwork-Id: 38137 Message-Id: <1350130322-3100-1-git-send-email-enrico.scholz@sigma-chemnitz.de> To: openembedded-core@lists.openembedded.org Cc: Enrico Scholz The old dangling link detection used os.stat() on the file and registered it as a dangling link when it was not found. This causes problems when the link is an absolute one because it will check files of the host system. E.g. when there is a link .../tmp/work/../etc/cron.root -> /var/spool/cron/root Then * existence of /var/spool/cron/root but not of ../tmp/work/.../var/spool/cron/root will be checked * the build aborts because a 'permission denied' exception is thrown but only 'not found' be catched. E.g. build of systemd on an SELinux enabled host aborts with: | ERROR: Error executing a python function in .../systemd/systemd_git.bb: | OSError: [Errno 13] Permission denied: '.../packages-split/systemd-initramfs/init' | ... | ERROR: 0219: try: | ERROR: *** 0220: s = os.stat(path) | ERROR: 0221: except OSError, (err, strerror): This patch uses os.lstat() to check whether source file is a link, adds it to the installation root direction and checks for the existence of this file then. As this is only a QA mechanism which does not affect the resulting package, rebuilds are not needed Signed-off-by: Enrico Scholz --- meta/classes/package.bbclass | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass index 73c4358..30614f0 100644 --- a/meta/classes/package.bbclass +++ b/meta/classes/package.bbclass @@ -1063,14 +1063,23 @@ python populate_packages () { path = os.path.join(root, f) rpath = path[len(inst_root):] pkg_files[pkg].append(rpath) + + if not os.path.islink(path): + continue + + target = os.readlink(path) + if target[0] != '/': + # make path absolute relative to inst_root + target = os.path.join(root[len(inst_root):], target) + + # make path absolute; do not use os.path.join() here + # because target might start with multiple '/' + rtarget = inst_root + target try: - s = os.stat(path) + os.lstat(rtarget) except OSError, (err, strerror): if err != errno.ENOENT: raise - target = os.readlink(path) - if target[0] != '/': - target = os.path.join(root[len(inst_root):], target) dangling_links[pkg].append(os.path.normpath(target)) for pkg in package_list: