bloblist: Zero records when adding
authorSimon Glass <sjg@chromium.org>
Mon, 27 Jan 2020 15:49:52 +0000 (08:49 -0700)
committerSimon Glass <sjg@chromium.org>
Thu, 6 Feb 2020 02:33:46 +0000 (19:33 -0700)
It is convenient for bloblist to zero out the contents of a records when
it is added. This saves the callers having to do it.

Update the API accordingly.

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

index 3d0fbbf67d31681d3f9bbabbcaf7f013fd72374f..99501951e0c068a57d3bfb8d988f96dbb85b1cc0 100644 (file)
@@ -73,6 +73,9 @@ static int bloblist_addrec(uint tag, int size, struct bloblist_rec **recp)
        rec->hdr_size = sizeof(*rec);
        rec->size = size;
        rec->spare = 0;
+
+       /* Zero the record data */
+       memset(rec + 1, '\0', rec->size);
        *recp = rec;
 
        return 0;
index b0e787b97dba90a35c5f42b4f931a2cddd118ea0..274c46055717fe589f2ba8465d72f63922780b0d 100644 (file)
@@ -55,8 +55,8 @@ a single bloblist.
 API
 ---
 
-Bloblist provides a fairly simple API which allows blobs to be created  and
-found. All access is via the blob's tag.
+Bloblist provides a fairly simple API which allows blobs to be created and
+found. All access is via the blob's tag. Blob records are zeroed when added.
 
 
 Finishing the bloblist
index c78b58ea2936f0e8094ff6a13ebca8a155f23f17..bdcca0291c7127a8c2e68542eca7d9960eaf74e4 100644 (file)
@@ -34,13 +34,31 @@ static struct bloblist_hdr *clear_bloblist(void)
 {
        struct bloblist_hdr *hdr;
 
-       /* Clear out any existing bloblist so we have a clean slate */
+       /*
+        * Clear out any existing bloblist so we have a clean slate. Zero the
+        * header so that existing records are removed, but set everything else
+        * to 0xff for testing purposes.
+        */
        hdr = map_sysmem(CONFIG_BLOBLIST_ADDR, TEST_BLOBLIST_SIZE);
-       memset(hdr, '\0', TEST_BLOBLIST_SIZE);
+       memset(hdr, '\xff', TEST_BLOBLIST_SIZE);
+       memset(hdr, '\0', sizeof(*hdr));
 
        return hdr;
 }
 
+static int check_zero(void *data, int size)
+{
+       u8 *ptr;
+       int i;
+
+       for (ptr = data, i = 0; i < size; i++, ptr++) {
+               if (*ptr)
+                       return -EINVAL;
+       }
+
+       return 0;
+}
+
 static int bloblist_test_init(struct unit_test_state *uts)
 {
        struct bloblist_hdr *hdr;
@@ -84,10 +102,14 @@ static int bloblist_test_blob(struct unit_test_state *uts)
        data = bloblist_find(TEST_TAG, TEST_SIZE);
        ut_asserteq_ptr(rec + 1, data);
 
+       /* Check the data is zeroed */
+       ut_assertok(check_zero(data, TEST_SIZE));
+
        /* Check the 'ensure' method */
        ut_asserteq_ptr(data, bloblist_ensure(TEST_TAG, TEST_SIZE));
        ut_assertnull(bloblist_ensure(TEST_TAG, TEST_SIZE2));
        rec2 = (struct bloblist_rec *)(data + ALIGN(TEST_SIZE, BLOBLIST_ALIGN));
+       ut_assertok(check_zero(data, TEST_SIZE));
 
        /* Check for a non-existent record */
        ut_asserteq_ptr(data, bloblist_ensure(TEST_TAG, TEST_SIZE));
@@ -112,6 +134,7 @@ static int bloblist_test_blob_ensure(struct unit_test_state *uts)
        size = TEST_SIZE;
        ut_assertok(bloblist_ensure_size_ret(TEST_TAG, &size, &data));
        ut_asserteq(TEST_SIZE, size);
+       ut_assertok(check_zero(data, TEST_SIZE));
 
        /* Check that we get the same thing again */
        ut_assertok(bloblist_ensure_size_ret(TEST_TAG, &size, &data2));