aboutsummaryrefslogtreecommitdiff
path: root/util/cbfstool/cbfs_image.c
diff options
context:
space:
mode:
authorPatrick Georgi <pgeorgi@chromium.org>2016-02-10 18:07:52 +0100
committerPatrick Georgi <pgeorgi@google.com>2016-02-12 19:23:08 +0100
commit343ea08388583d66c4145f5da3bea8828c5c0daf (patch)
treea79e9e87c655c1ba965c1ba69adc32e36674cf59 /util/cbfstool/cbfs_image.c
parent0a07c5c4a033a27058aad2fd0a3a192f3c1edf9b (diff)
util/cbfstool: Improve heuristic for cbfs header pointer protection
cbfstool has a routine to deal with old images that may encourage it to overwrite the master header. That routine is triggered for "cbfstool add-master-header" prepared images even though these are not at risk, and - worse - destroys the chain structure (through a negative file length), so avoid touching such images. Change-Id: I9d0bbe3e6300b9b9f3e50347737d1850f83ddad8 Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Reviewed-on: https://review.coreboot.org/13672 Tested-by: build bot (Jenkins) Reviewed-by: Martin Roth <martinroth@google.com>
Diffstat (limited to 'util/cbfstool/cbfs_image.c')
-rw-r--r--util/cbfstool/cbfs_image.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/util/cbfstool/cbfs_image.c b/util/cbfstool/cbfs_image.c
index 314ea5741d..95e6f42b17 100644
--- a/util/cbfstool/cbfs_image.c
+++ b/util/cbfstool/cbfs_image.c
@@ -110,11 +110,18 @@ static int cbfs_fix_legacy_size(struct cbfs_image *image, char *hdr_loc)
// A bug in old cbfstool may produce extra few bytes (by alignment) and
// cause cbfstool to overwrite things after free space -- which is
// usually CBFS header on x86. We need to workaround that.
+ // Except when we run across a file that contains the actual header,
+ // in which case this image is a safe, new-style
+ // `cbfstool add-master-header` based image.
struct cbfs_file *entry, *first = NULL, *last = NULL;
for (first = entry = cbfs_find_first_entry(image);
entry && cbfs_is_valid_entry(image, entry);
entry = cbfs_find_next_entry(image, entry)) {
+ /* Is the header guarded by a CBFS file entry? Then exit */
+ if (((char *)entry) + ntohl(entry->offset) == hdr_loc) {
+ return 0;
+ }
last = entry;
}
if ((char *)first < (char *)hdr_loc &&