[coreboot] New patch to review for coreboot: d3b580b cbfstool: Fix incorrect CBFS free space by old cbfstool.

Hung-Te Lin (hungte@chromium.org) gerrit at coreboot.org
Tue Jan 29 02:55:33 CET 2013


Hung-Te Lin (hungte at chromium.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/2211

-gerrit

commit d3b580bf1ad90c21be98becb3def561c0fc573cd
Author: Hung-Te Lin <hungte at chromium.org>
Date:   Tue Jan 29 03:16:20 2013 +0800

    cbfstool: Fix incorrect CBFS free space by old cbfstool.
    
    Old CBFStool may produce CBFS image with calculation error in size of last empty
    entry, and then corrupts master header data when you really use every bits in
    last entry. This CL will correct size when you load ROM images with cbfs_image
    API (cbfs_image_from_file).
    
    Change-Id: I2ada319728ef69ab9296ae446c77d37e05d05fce
    Signed-off-by: Hung-Te Lin <hungte at chromium.org>
---
 util/cbfstool/cbfs_image.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/util/cbfstool/cbfs_image.c b/util/cbfstool/cbfs_image.c
index 24759c9..e7e5053 100644
--- a/util/cbfstool/cbfs_image.c
+++ b/util/cbfstool/cbfs_image.c
@@ -104,6 +104,31 @@ static int cbfs_calculate_file_header_size(const char *name) {
 		align_up(strlen(name) + 1, CBFS_FILENAME_ALIGN));
 }
 
+static int cbfs_fix_legacy_size(struct cbfs_image *image) {
+	// 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.
+
+	struct cbfs_file *entry, *first = NULL, *last = NULL;
+	for (first = entry = cbfs_find_first_entry(image);
+	     entry && cbfs_is_valid_entry(entry);
+	     entry = cbfs_find_next_entry(image, entry)) {
+		last = entry;
+	}
+	if ((char *)first < (char *)image->header &&
+	    (char *)entry > (char *)image->header) {
+		WARN("CBFS image was created with old cbfstool with size bug. "
+		     "Fixing size in last entry...\n");
+		last->len = htonl(ntohl(last->len) -
+				  ntohl(image->header->align));
+		DEBUG("Last entry has been changed from 0x%x to 0x%x.\n",
+		      cbfs_get_entry_addr(image, entry),
+		      cbfs_get_entry_addr(image,
+					  cbfs_find_next_entry(image, last)));
+	}
+	return 0;
+}
+
 int cbfs_image_from_file(struct cbfs_image *image, const char *filename) {
 	if (buffer_from_file(&image->buffer, filename) != 0)
 		return -1;
@@ -116,6 +141,7 @@ int cbfs_image_from_file(struct cbfs_image *image, const char *filename) {
 		cbfs_image_delete(image);
 		return -1;
 	}
+	cbfs_fix_legacy_size(image);
 
 	return 0;
 }



More information about the coreboot mailing list