bloblist: Correct condition in bloblist_addrec()
authorSimon Glass <sjg@chromium.org>
Mon, 5 Jul 2021 22:32:55 +0000 (16:32 -0600)
committerSimon Glass <sjg@chromium.org>
Wed, 21 Jul 2021 16:27:34 +0000 (10:27 -0600)
It is possible to add a blob that ends at the end of the bloblist, but at
present this is not supported. Fix it and add a regression test for this
case.

Signed-off-by: Simon Glass <sjg@chromium.org>
common/bloblist.c
test/bloblist.c

index bb49eca..1290fff 100644 (file)
@@ -118,7 +118,7 @@ static int bloblist_addrec(uint tag, int size, int align,
        /* Calculate the new allocated total */
        new_alloced = data_start + ALIGN(size, align);
 
-       if (new_alloced >= hdr->size) {
+       if (new_alloced > hdr->size) {
                log(LOGC_BLOBLIST, LOGL_ERR,
                    "Failed to allocate %x bytes size=%x, need size=%x\n",
                    size, hdr->size, new_alloced);
index 345eb18..4104e6a 100644 (file)
@@ -576,6 +576,29 @@ static int bloblist_test_resize_last(struct unit_test_state *uts)
 }
 BLOBLIST_TEST(bloblist_test_resize_last, 0);
 
+/* Check a completely full bloblist */
+static int bloblist_test_blob_maxsize(struct unit_test_state *uts)
+{
+       void *ptr;
+       int size;
+
+       /* At the start there should be no records */
+       clear_bloblist();
+       ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
+
+       /* Add a blob that takes up all space */
+       size = TEST_BLOBLIST_SIZE - sizeof(struct bloblist_hdr) -
+               sizeof(struct bloblist_rec);
+       ptr = bloblist_add(TEST_TAG, size, 0);
+       ut_assertnonnull(ptr);
+
+       ptr = bloblist_add(TEST_TAG, size + 1, 0);
+       ut_assertnull(ptr);
+
+       return 0;
+}
+BLOBLIST_TEST(bloblist_test_blob_maxsize, 0);
+
 int do_ut_bloblist(struct cmd_tbl *cmdtp, int flag, int argc,
                   char *const argv[])
 {