summaryrefslogtreecommitdiffstats
path: root/payloads/libpayload
diff options
context:
space:
mode:
authorYou-Cheng Syu <youcheng@google.com>2019-02-26 21:41:52 +0800
committerPatrick Georgi <pgeorgi@google.com>2019-02-28 13:56:45 +0000
commitc60c3269ec9d1bfcec2ec4f6fb450e9a59a0818e (patch)
tree3256ef6a7b677d960cfd7fdde866d50bd2456697 /payloads/libpayload
parent5ec1d24974de8280a615047804bdfa73720777c8 (diff)
downloadcoreboot-c60c3269ec9d1bfcec2ec4f6fb450e9a59a0818e.tar.gz
coreboot-c60c3269ec9d1bfcec2ec4f6fb450e9a59a0818e.tar.bz2
coreboot-c60c3269ec9d1bfcec2ec4f6fb450e9a59a0818e.zip
libpayload: cbfs: Check decompressed size when loading files
After loading compressed files in CBFS, we should check the decompressed size is equal to the expected size. This might help us detect file content corruption or compressor/decompressor bugs. BUG=none BRANCH=none TEST=manually (we can still boot into kernel on Kukui, and verify that loading files from CBFS still works by seeing ChromiumOS firmware screen). Change-Id: Ia756cc5477670dd0d1d8aa59d4160ab4233c6795 Signed-off-by: You-Cheng Syu <youcheng@google.com> Reviewed-on: https://review.coreboot.org/c/31564 Reviewed-by: Julius Werner <jwerner@chromium.org> Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'payloads/libpayload')
-rw-r--r--payloads/libpayload/libcbfs/cbfs_core.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/payloads/libpayload/libcbfs/cbfs_core.c b/payloads/libpayload/libcbfs/cbfs_core.c
index 4ecda303956b..39bbdb5260a8 100644
--- a/payloads/libpayload/libcbfs/cbfs_core.c
+++ b/payloads/libpayload/libcbfs/cbfs_core.c
@@ -243,12 +243,9 @@ void *cbfs_get_contents(struct cbfs_handle *handle, size_t *size, size_t limit)
}
if (algo == CBFS_COMPRESS_NONE) {
- if (limit != 0 && limit < on_media_size) {
- *size = limit;
+ if (limit != 0 && limit < on_media_size)
on_media_size = limit;
- } else {
- *size = on_media_size;
- }
+ *size = on_media_size;
}
void *data = m->map(m, handle->media_offset + handle->content_offset,
@@ -257,10 +254,15 @@ void *cbfs_get_contents(struct cbfs_handle *handle, size_t *size, size_t limit)
return NULL;
ret = malloc(*size);
- if (ret != NULL &&
- !cbfs_decompress(algo, data, on_media_size, ret, *size)) {
- free(ret);
- ret = NULL;
+ if (ret != NULL) {
+ size_t final_size = cbfs_decompress(algo, data, on_media_size,
+ ret, *size);
+ if (final_size != *size) {
+ ERROR("Expect %zu bytes but got %zu bytes after "
+ "decompression.\n", *size, final_size);
+ free(ret);
+ ret = NULL;
+ }
}
m->unmap(m, data);