diff options
| author | Enrico Scholz <enrico.scholz@sigma-chemnitz.de> | 2013-02-10 13:41:47 +0100 | 
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-02-11 14:45:37 +0000 | 
| commit | ec2aab09769f4b6817d74d2175afa2b7c7598750 (patch) | |
| tree | 30c59f26635dc5e37b2ba150a5e59a8c5a1e35d2 | |
| parent | 2fa5cc0d08e855e24a4497601d7cc73b9f2aa550 (diff) | |
| download | openembedded-core-ec2aab09769f4b6817d74d2175afa2b7c7598750.tar.gz openembedded-core-ec2aab09769f4b6817d74d2175afa2b7c7598750.tar.bz2 openembedded-core-ec2aab09769f4b6817d74d2175afa2b7c7598750.zip | |
package.bbclass: use oe.path.realpath()
oe.path.realpath() provides are common and more correct implementation
for resolving symlinks within sysroot. Use it.
Old implementation suffered from lot of problems; e.g.
* redundant code
* calls 'os.stat()' which references files on host; this can give wrong
  results about existing/non-existing and can cause EPERM (instead of
  the catched ENONENT) exceptions
* does not deal with special cases like '..' leaving the sysroot.
Signed-off-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
| -rw-r--r-- | meta/classes/package.bbclass | 16 | 
1 files changed, 5 insertions, 11 deletions
| diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass index b10e6f6a4a..a74ec8a847 100644 --- a/meta/classes/package.bbclass +++ b/meta/classes/package.bbclass @@ -741,7 +741,8 @@ python split_and_strip_files () {                      continue                  try: -                    s = os.stat(file) +                    ltarget = oe.path.realpath(file, dvar, False) +                    s = os.lstat(ltarget)                  except OSError, (err, strerror):                      if err != errno.ENOENT:                          raise @@ -752,11 +753,6 @@ python split_and_strip_files () {                      # If it's a symlink, and points to an ELF file, we capture the readlink target                      if os.path.islink(file):                          target = os.readlink(file) -                        if not os.path.isabs(target): -                            ltarget = os.path.join(os.path.dirname(file), target) -                        else: -                            ltarget = target -                          if isELF(ltarget):                              #bb.note("Sym: %s (%d)" % (ltarget, isELF(ltarget)))                              symlinks[file] = target @@ -1005,14 +1001,12 @@ python package_fixsymlinks () {                  rpath = path[len(inst_root):]                  pkg_files[pkg].append(rpath)                  try: -                    s = os.stat(path) +                    rtarget = oe.path.realpath(path, inst_root, True) +                    os.lstat(rtarget)                  except OSError, (err, strerror):                      if err != errno.ENOENT:                          raise -                    target = os.readlink(path) -                    if target[0] != '/': -                        target = os.path.join(os.path.dirname(path)[len(inst_root):], target) -                    dangling_links[pkg].append(os.path.normpath(target)) +                    dangling_links[pkg].append(os.path.normpath(rtarget[len(inst_root):]))      newrdepends = {}      for pkg in dangling_links: | 
