cbfs: Fix overwalk on file scan

A bootblock overwalk was occuring when deriving the actual
length, the bootblock size was not taken into account and bootblock
size was not aligned.

Resolved merge conflict.

Change-Id: I7eb42f8deaaf223dcf07b37bb7dde4643acd508f
Signed-off-by: Steven Sherk <steven.sherk@se-eng.com>
Reviewed-on: https://gerrit.chromium.org/gerrit/65989
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Commit-Queue: Steve Sherk <ssherk70@gmail.com>
Tested-by: Steve Sherk <ssherk70@gmail.com>
(cherry picked from commit 20b0ba479b01755fbdc7f3dd9214e8af923402ba)
Signed-off-by: Isaac Christensen <isaac.christensen@se-eng.com>
Reviewed-on: http://review.coreboot.org/6539
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
This commit is contained in:
Steven Sherk 2013-08-14 14:55:57 -06:00 committed by Patrick Georgi
parent 1f5487a7c0
commit e17843c4a7
2 changed files with 28 additions and 6 deletions

View File

@ -119,11 +119,22 @@ struct cbfs_file *cbfs_get_file(struct cbfs_media *media, const char *name)
// TODO Add a "size" in CBFS header for a platform independent way to // TODO Add a "size" in CBFS header for a platform independent way to
// determine the end of CBFS data. // determine the end of CBFS data.
#if defined(CONFIG_LP_ARCH_X86) && CONFIG_LP_ARCH_X86 #if defined(CONFIG_LP_ARCH_X86) && CONFIG_LP_ARCH_X86
romsize -= htonl(header->bootblocksize); // resolve actual length of ROM used for CBFS components
#endif // the bootblock size was not taken into account
DEBUG("CBFS location: 0x%x~0x%x, align: %d\n", offset, romsize, align); romsize -= ntohl(header->bootblocksize);
// fine tune the length to handle alignment positioning.
// using (bootblock size) % align, to derive the
// number of bytes the bootblock is off from the alignment size.
if ((ntohl(header->bootblocksize) % align))
romsize -= (align - (ntohl(header->bootblocksize) % align));
else
romsize -= 1;
#endif
DEBUG("CBFS location: 0x%x~0x%x, align: %d\n", offset, romsize, align);
DEBUG("Looking for '%s' starting from 0x%x.\n", name, offset); DEBUG("Looking for '%s' starting from 0x%x.\n", name, offset);
media->open(media); media->open(media);
while (offset < romsize && while (offset < romsize &&
media->read(media, &file, offset, sizeof(file)) == sizeof(file)) { media->read(media, &file, offset, sizeof(file)) == sizeof(file)) {

View File

@ -119,11 +119,22 @@ struct cbfs_file *cbfs_get_file(struct cbfs_media *media, const char *name)
// TODO Add a "size" in CBFS header for a platform independent way to // TODO Add a "size" in CBFS header for a platform independent way to
// determine the end of CBFS data. // determine the end of CBFS data.
#if defined(CONFIG_ARCH_X86) && CONFIG_ARCH_X86 #if defined(CONFIG_ARCH_X86) && CONFIG_ARCH_X86
romsize -= htonl(header->bootblocksize); // resolve actual length of ROM used for CBFS components
#endif // the bootblock size was not taken into account
DEBUG("CBFS location: 0x%x~0x%x, align: %d\n", offset, romsize, align); romsize -= ntohl(header->bootblocksize);
// fine tune the length to handle alignment positioning.
// using (bootblock size) % align, to derive the
// number of bytes the bootblock is off from the alignment size.
if ((ntohl(header->bootblocksize) % align))
romsize -= (align - (ntohl(header->bootblocksize) % align));
else
romsize -= 1;
#endif
DEBUG("CBFS location: 0x%x~0x%x, align: %d\n", offset, romsize, align);
DEBUG("Looking for '%s' starting from 0x%x.\n", name, offset); DEBUG("Looking for '%s' starting from 0x%x.\n", name, offset);
media->open(media); media->open(media);
while (offset < romsize && while (offset < romsize &&
media->read(media, &file, offset, sizeof(file)) == sizeof(file)) { media->read(media, &file, offset, sizeof(file)) == sizeof(file)) {