layout: Add `capacity` field

Use it to keep track of the size of the `entries` array. An interim
solution until we have dynamic allocation.

Change-Id: Ib5f431bc0a72a79a53fa1376c3417942b19dd3a0
Signed-off-by: Nico Huber <nico.h@gmx.de>
Original-Reviewed-on: https://review.coreboot.org/c/flashrom/+/33516
Original-Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Original-Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
Original-Reviewed-by: Peter Marheine <pmarheine@chromium.org>
Original-Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
Reviewed-on: https://review.coreboot.org/c/flashrom-stable/+/72212
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/flashrom.c b/flashrom.c
index 2fb42fb..95b73ed 100644
--- a/flashrom.c
+++ b/flashrom.c
@@ -834,6 +834,7 @@
 	/* Fill fallback layout covering the whole chip. */
 	struct single_layout *const fallback = &flash->fallback_layout;
 	fallback->base.entries		= &fallback->entry;
+	fallback->base.capacity		= 1;
 	fallback->base.num_entries	= 1;
 	fallback->entry.start		= 0;
 	fallback->entry.end		= flash->chip->total_size * 1024 - 1;
diff --git a/ich_descriptors.c b/ich_descriptors.c
index 8ae8e4a..d67ed31 100644
--- a/ich_descriptors.c
+++ b/ich_descriptors.c
@@ -1368,6 +1368,7 @@
 		++j;
 	}
 	layout->base.entries = layout->entries;
+	layout->base.capacity = ARRAY_SIZE(layout->entries);
 	layout->base.num_entries = j;
 	return 0;
 }
diff --git a/layout.c b/layout.c
index a604a7b..47db484 100644
--- a/layout.c
+++ b/layout.c
@@ -25,7 +25,7 @@
 #include "layout.h"
 
 static struct romentry entries[MAX_ROMLAYOUT];
-static struct flashrom_layout global_layout = { entries, 0 };
+static struct flashrom_layout global_layout = { entries, MAX_ROMLAYOUT, 0 };
 
 struct flashrom_layout *get_global_layout(void)
 {
@@ -75,9 +75,9 @@
 	while (!feof(romlayout)) {
 		char *tstr1, *tstr2;
 
-		if (layout->num_entries >= MAX_ROMLAYOUT) {
-			msg_gerr("Maximum number of ROM images (%i) in layout "
-				 "file reached.\n", MAX_ROMLAYOUT);
+		if (layout->num_entries >= layout->capacity) {
+			msg_gerr("Maximum number of ROM images (%zu) in layout "
+				 "file reached.\n", layout->capacity);
 			goto _close_ret;
 		}
 		if (2 != fscanf(romlayout, "%255s %255s\n", tempstr, tempname))
diff --git a/layout.h b/layout.h
index 65a49ad..c72217e 100644
--- a/layout.h
+++ b/layout.h
@@ -45,6 +45,8 @@
 struct flashrom_layout {
 	/* entries store the entries specified in a layout file and associated run-time data */
 	struct romentry *entries;
+	/* the maximum number of entries */
+	size_t capacity;
 	/* the number of successfully parsed entries */
 	size_t num_entries;
 };
diff --git a/libflashrom.c b/libflashrom.c
index e390a02..b9c2d35 100644
--- a/libflashrom.c
+++ b/libflashrom.c
@@ -387,7 +387,7 @@
 	if (!fmap || !l)
 		return 1;
 
-	if (l->num_entries + fmap->nareas > MAX_ROMLAYOUT) {
+	if (l->num_entries + fmap->nareas > l->capacity) {
 		msg_gerr("Cannot add fmap entries to layout - Too many entries.\n");
 		return 1;
 	}