diff options
author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2017-05-09 12:38:39 +1200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-06-22 10:19:08 +0100 |
commit | f60520d97f53dafe783f61eb58fe249798a1e1be (patch) | |
tree | 411f3e0a0a409309d30e876d9d92859cacda302e | |
parent | 7c36b4316ad185088c65a4db8a84b5fcba9eef06 (diff) | |
download | openembedded-core-f60520d97f53dafe783f61eb58fe249798a1e1be.tar.gz openembedded-core-f60520d97f53dafe783f61eb58fe249798a1e1be.tar.bz2 openembedded-core-f60520d97f53dafe783f61eb58fe249798a1e1be.zip |
classes/buildhistory: fix failures collecting output signatures
It's possible for tasks to stage symlinks that point to non-existent
files; an example is ncurses-native.do_populate_sysroot. There wasn't
any error checking here so this broke the build when "task" was included
in BUILDHISTORY_FEATURES. In any case we shouldn't be following symlinks
and getting the sha256sum of the link target - we need concern ourselves
only with the target path, so check if the file is a link and sha256 the
target path instead if it is. If it's neither a regular file nor a
symlink (perhaps a pipe or a device), just skip it.
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/classes/buildhistory.bbclass | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/meta/classes/buildhistory.bbclass b/meta/classes/buildhistory.bbclass index 601b29f5a1..81784eef21 100644 --- a/meta/classes/buildhistory.bbclass +++ b/meta/classes/buildhistory.bbclass @@ -301,6 +301,8 @@ python buildhistory_emit_outputsigs() { if not "task" in (d.getVar('BUILDHISTORY_FEATURES') or "").split(): return + import hashlib + taskoutdir = os.path.join(d.getVar('BUILDHISTORY_DIR'), 'task', 'output') bb.utils.mkdirhier(taskoutdir) currenttask = d.getVar('BB_CURRENTTASK') @@ -314,7 +316,17 @@ python buildhistory_emit_outputsigs() { if fname == 'fixmepath': continue fullpath = os.path.join(root, fname) - filesigs[os.path.relpath(fullpath, cwd)] = bb.utils.sha256_file(fullpath) + try: + if os.path.islink(fullpath): + sha256 = hashlib.sha256(os.readlink(fullpath).encode('utf-8')).hexdigest() + elif os.path.isfile(fullpath): + sha256 = bb.utils.sha256_file(fullpath) + else: + continue + except OSError: + bb.warn('buildhistory: unable to read %s to get output signature' % fullpath) + continue + filesigs[os.path.relpath(fullpath, cwd)] = sha256 with open(taskfile, 'w') as f: for fpath, fsig in sorted(filesigs.items(), key=lambda item: item[0]): f.write('%s %s\n' % (fpath, fsig)) |