Am 25.04.2009 14:14, schrieb Myles Watson:
I'd prefer that it used the ALIGN macro, but it's a pretty trivial
macro.  It just makes it more clear.
Beware, this patch might create an infinite loop.
Attached patch avoids the infinite loop, ends lookup on invalid magic (we can do this now), and uses ALIGN. Other than the original patch this one is only compile tested, so please test.

Signed-off-by: Patrick Georgi <[email protected]>

Index: src/lib/cbfs.c
===================================================================
--- src/lib/cbfs.c      (Revision 4206)
+++ src/lib/cbfs.c      (Arbeitskopie)
@@ -96,15 +96,24 @@
                return NULL;
        offset = 0 - ntohl(header->romsize) + ntohl(header->offset);
 
+       int align= ntohl(header->align);
+
        while(1) {
                struct cbfs_file *file = (struct cbfs_file *) offset;
-               if (cbfs_check_magic(file)) printk_info("Check %s\n", 
CBFS_NAME(file));
-               if (cbfs_check_magic(file) &&
-                   !strcmp(CBFS_NAME(file), name))
+               if (!cbfs_check_magic(file)) return NULL;
+               printk_info("Check %s\n", CBFS_NAME(file));
+               if (!strcmp(CBFS_NAME(file), name))
                        return file;
 
-               offset += ntohl(header->align);
+               int flen = ntohl(file->len);
+               int foffset = ntohl(file->offset);
+               printk_spew("CBFS: follow chain: %p + %x + %x + align -> ", 
offset, foffset, flen);
 
+               unsigned long oldoffset = offset;
+               offset = ALIGN(offset + foffset + flen, align);
+               printk_spew("%p\n", offset);
+               if (offset == oldoffset) return NULL;
+
                if (offset < 0xFFFFFFFF - ntohl(header->romsize))
                        return NULL;
        }
-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to