[coreboot] [PATCH] more intelligent cbfs walker

Myles Watson mylesgw at gmail.com
Sat Apr 25 14:53:07 CEST 2009


On Sat, Apr 25, 2009 at 6:42 AM, Patrick Georgi <patrick at georgi-clan.de> wrote:
> 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.
I won't be able to until Monday, but I have a couple of comments/questions.
>
> Signed-off-by: Patrick Georgi <patrick.georgi at coresystems.de>
>
+	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;
Why do we have this check?  Is there a time when offset ==
ALIGN(offset + foffset + flen, align)?
+
 		if (offset < 0xFFFFFFFF - ntohl(header->romsize))
 			return NULL;
I know this line isn't part of your change, but shouldn't we check
that we're within the file system, not just within the flash?
 	}

Thanks,
Myles




More information about the coreboot mailing list