From 56f5fb734bb92efd147912794071ff57c35cab04 Mon Sep 17 00:00:00 2001 From: Patrick Georgi Date: Wed, 30 Sep 2009 11:21:18 +0000 Subject: [PATCH] Fix endless loop when trying to add a too large file to CBFS, and report the correct error code, and a hopefully helpful error message. Signed-off-by: Patrick Georgi Acked-by: Stefan Reinauer git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4692 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- util/cbfstool/cbfstool.c | 9 ++++-- util/cbfstool/common.c | 60 +++++++++++++++++++++------------------- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c index 7fa7a8510a..bf8b3812b8 100644 --- a/util/cbfstool/cbfstool.c +++ b/util/cbfstool/cbfstool.c @@ -80,7 +80,8 @@ static int cbfs_add(int argc, char **argv) } cbfsfile = create_cbfs_file(cbfsname, filedata, &filesize, type, &base); - add_file_to_cbfs(cbfsfile, filesize, base); + if (add_file_to_cbfs(cbfsfile, filesize, base)) + return 1; writerom(romname, rom, romsize); return 0; } @@ -127,7 +128,8 @@ static int cbfs_add_payload(int argc, char **argv) cbfsfile = create_cbfs_file(cbfsname, payload, &filesize, CBFS_COMPONENT_PAYLOAD, &base); - add_file_to_cbfs(cbfsfile, filesize, base); + if (add_file_to_cbfs(cbfsfile, filesize, base)) + return 1; writerom(romname, rom, romsize); return 0; } @@ -175,7 +177,8 @@ static int cbfs_add_stage(int argc, char **argv) create_cbfs_file(cbfsname, stage, &filesize, CBFS_COMPONENT_STAGE, &base); - add_file_to_cbfs(cbfsfile, filesize, base); + if (add_file_to_cbfs(cbfsfile, filesize, base)) + return 1; writerom(romname, rom, romsize); return 0; } diff --git a/util/cbfstool/common.c b/util/cbfstool/common.c index 7a9e6f1e4b..4c453995ed 100644 --- a/util/cbfstool/common.c +++ b/util/cbfstool/common.c @@ -40,7 +40,7 @@ void *loadfile(const char *filename, uint32_t * romsize_p, void *content, content = malloc(*romsize_p); if (!content) { printf("Could not get %d bytes for file %s\n", - *romsize_p, filename); + *romsize_p, filename); exit(1); } } else if (place == SEEK_END) @@ -205,40 +205,42 @@ int add_file_to_cbfs(void *content, uint32_t contentsize, uint32_t location) dprintf("copying data\n"); memcpy(phys_to_virt(current), content, contentsize); - break; + return 0; } - if (location == 0) - continue; + if (location != 0) { + /* CBFS has the constraint that the chain always moves up in memory. so once + we're past the place we seek, we don't need to look any further */ + if (current > location) { + printf + ("the requested space is not available\n"); + return 1; + } - /* CBFS has the constraint that the chain always moves up in memory. so once - we're past the place we seek, we don't need to look any further */ - if (current > location) { - printf - ("the requested space is not available\n"); - return 1; - } - - /* Is the requested location inside the current chunk? */ - if ((current < location) - && ((location + contentsize) <= (current + length))) { - /* Split it up. In the next iteration the code will be at the right place. */ - dprintf("split up. new length: %x\n", - location - current - - ntohl(thisfile->offset)); - thisfile->len = - htonl(location - current - - ntohl(thisfile->offset)); - struct cbfs_file *nextfile = - cbfs_create_empty_file(location, - length - (location - - current)); + /* Is the requested location inside the current chunk? */ + if ((current < location) + && ((location + contentsize) <= + (current + length))) { + /* Split it up. In the next iteration the code will be at the right place. */ + dprintf("split up. new length: %x\n", + location - current - + ntohl(thisfile->offset)); + thisfile->len = + htonl(location - current - + ntohl(thisfile->offset)); + struct cbfs_file *nextfile = + cbfs_create_empty_file(location, + length - + (location - + current)); + } } } current = ALIGN(current + ntohl(thisfile->len) + ntohl(thisfile->offset), align); } - return 0; + printf("Could not add the file to CBFS, it's probably too big.\n"); + return 1; } /* returns new data block with cbfs_file header, suitable to dump into the ROM. location returns @@ -263,7 +265,7 @@ void *create_cbfs_file(const char *filename, void *data, uint32_t * datasize, void *newdata = malloc(*datasize + headersize); if (!newdata) { printf("Could not get %d bytes for CBFS file.\n", *datasize + - headersize); + headersize); exit(1); } struct cbfs_file *nextfile = (struct cbfs_file *)newdata; @@ -285,7 +287,7 @@ int create_cbfs_image(const char *romfile, uint32_t _romsize, unsigned char *romarea = malloc(romsize); if (!romarea) { printf("Could not get %d bytes of memory for CBFS image.\n", - romsize); + romsize); exit(1); } memset(romarea, 0xff, romsize);