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 <patrick.georgi@coresystems.de>
Acked-by: Stefan Reinauer <stepan@coresystems.de>


git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4692 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
diff --git a/util/cbfstool/common.c b/util/cbfstool/common.c
index 7a9e6f1..4c45399 100644
--- a/util/cbfstool/common.c
+++ b/util/cbfstool/common.c
@@ -40,7 +40,7 @@
 		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 @@
 				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 *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 @@
 	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);