summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2016-09-02 12:10:31 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-09-06 22:02:13 -0700
commit1589f94dc19b4f6613993ced9f25048aa9cbef18 (patch)
tree48e7d3d5d6ec5e1ffdf7bda0f3b9c31becfaa4c0
parentf7559e4b4652134b1e15de3ce31ee50a3de00f69 (diff)
downloadvboot-1589f94dc19b4f6613993ced9f25048aa9cbef18.tar.gz
Fix coverity warnings in firmware
Assorted minor code issues, which we should fix so any new errors stand out more. BUG=chromium:643769 BRANCH=none TEST=make runtests Change-Id: I84182df0d0e222f4f60206c621ec62e1ee283adb Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/380697 Reviewed-by: Stefan Reinauer <reinauer@chromium.org>
-rw-r--r--firmware/bdb/host.c1
-rw-r--r--firmware/lib/gpt_misc.c17
-rw-r--r--firmware/lib/tpm_lite/tlcl.c2
-rw-r--r--firmware/lib/vboot_api_kernel.c33
-rw-r--r--firmware/lib/vboot_common.c8
-rw-r--r--firmware/stub/vboot_api_stub_init.c2
6 files changed, 37 insertions, 26 deletions
diff --git a/firmware/bdb/host.c b/firmware/bdb/host.c
index 68a62803..62b2c410 100644
--- a/firmware/bdb/host.c
+++ b/firmware/bdb/host.c
@@ -123,6 +123,7 @@ struct bdb_key *bdb_create_key(const char *filename,
} else {
fprintf(stderr, "%s: bad key size from %s\n",
__func__, filename);
+ free(kdata);
return NULL;
}
key_size += kdata_size;
diff --git a/firmware/lib/gpt_misc.c b/firmware/lib/gpt_misc.c
index c9b71701..3957cb89 100644
--- a/firmware/lib/gpt_misc.c
+++ b/firmware/lib/gpt_misc.c
@@ -123,13 +123,20 @@ int AllocAndReadGptData(VbExDiskHandle_t disk_handle, GptData *gptdata)
int WriteAndFreeGptData(VbExDiskHandle_t disk_handle, GptData *gptdata)
{
int skip_primary = 0;
- GptHeader *header = (GptHeader *)gptdata->primary_header;
- uint64_t entries_bytes =
- (uint64_t)header->number_of_entries
- * header->size_of_entry;
- uint64_t entries_sectors = entries_bytes / gptdata->sector_bytes;
+ GptHeader *header;
+ uint64_t entries_bytes, entries_sectors;
int ret = 1;
+ header = (GptHeader *)gptdata->primary_header;
+ if (!header)
+ header = (GptHeader *)gptdata->secondary_header;
+ if (!header)
+ return 1; /* No headers at all, so nothing to write */
+
+ entries_bytes = (uint64_t)header->number_of_entries
+ * header->size_of_entry;
+ entries_sectors = entries_bytes / gptdata->sector_bytes;
+
/*
* TODO(namnguyen): Preserve padding between primary GPT header and
* its entries.
diff --git a/firmware/lib/tpm_lite/tlcl.c b/firmware/lib/tpm_lite/tlcl.c
index bf2d27f9..78944314 100644
--- a/firmware/lib/tpm_lite/tlcl.c
+++ b/firmware/lib/tpm_lite/tlcl.c
@@ -223,6 +223,8 @@ uint32_t TlclRead(uint32_t index, void* data, uint32_t length) {
if (result == TPM_SUCCESS && length > 0) {
uint8_t* nv_read_cursor = response + kTpmResponseHeaderLength;
FromTpmUint32(nv_read_cursor, &result_length);
+ if (result_length > length)
+ result_length = length; /* Truncate to fit buffer */
nv_read_cursor += sizeof(uint32_t);
Memcpy(data, nv_read_cursor, result_length);
}
diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c
index 90703a90..4aa2fbdc 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -1081,6 +1081,22 @@ VbError_t VbSelectAndLoadKernel(VbCommonParams *cparams,
VbExNvStorageRead(vnc.raw);
VbNvSetup(&vnc);
+ /* Fill in params for calls to LoadKernel() */
+ Memset(&p, 0, sizeof(p));
+ p.shared_data_blob = cparams->shared_data_blob;
+ p.shared_data_size = cparams->shared_data_size;
+ p.gbb_data = cparams->gbb_data;
+ p.gbb_size = cparams->gbb_size;
+ p.fwmp = &fwmp;
+ p.nv_context = &vnc;
+
+ /*
+ * This could be set to NULL, in which case the vboot header
+ * information about the load address and size will be used.
+ */
+ p.kernel_buffer = kparams->kernel_buffer;
+ p.kernel_buffer_size = kparams->kernel_buffer_size;
+
/* Clear output params in case we fail */
kparams->disk_handle = NULL;
kparams->partition_number = 0;
@@ -1169,22 +1185,7 @@ VbError_t VbSelectAndLoadKernel(VbCommonParams *cparams,
}
}
- /* Fill in params for calls to LoadKernel() */
- Memset(&p, 0, sizeof(p));
- p.shared_data_blob = cparams->shared_data_blob;
- p.shared_data_size = cparams->shared_data_size;
- p.gbb_data = cparams->gbb_data;
- p.gbb_size = cparams->gbb_size;
- p.fwmp = &fwmp;
-
- /*
- * This could be set to NULL, in which case the vboot header
- * information about the load address and size will be used.
- */
- p.kernel_buffer = kparams->kernel_buffer;
- p.kernel_buffer_size = kparams->kernel_buffer_size;
-
- p.nv_context = &vnc;
+ /* Set up boot flags */
p.boot_flags = 0;
if (shared->flags & VBSD_BOOT_DEV_SWITCH_ON)
p.boot_flags |= BOOT_FLAG_DEVELOPER;
diff --git a/firmware/lib/vboot_common.c b/firmware/lib/vboot_common.c
index 3535952f..49929151 100644
--- a/firmware/lib/vboot_common.c
+++ b/firmware/lib/vboot_common.c
@@ -419,14 +419,14 @@ int VerifyVmlinuzInsideKBlob(uint64_t kblob, uint64_t kblob_size,
uint64_t VbSharedDataReserve(VbSharedDataHeader *header, uint64_t size)
{
- uint64_t offs = header->data_used;
-
- VBDEBUG(("VbSharedDataReserve %d bytes at %d\n", (int)size, (int)offs));
-
if (!header || size > header->data_size - header->data_used) {
VBDEBUG(("VbSharedData buffer out of space.\n"));
return 0; /* Not initialized, or not enough space left. */
}
+
+ uint64_t offs = header->data_used;
+ VBDEBUG(("VbSharedDataReserve %d bytes at %d\n", (int)size, (int)offs));
+
header->data_used += size;
return offs;
}
diff --git a/firmware/stub/vboot_api_stub_init.c b/firmware/stub/vboot_api_stub_init.c
index 34387837..214387a2 100644
--- a/firmware/stub/vboot_api_stub_init.c
+++ b/firmware/stub/vboot_api_stub_init.c
@@ -24,7 +24,7 @@ static char fmtbuf[MAX_FMT+1];
static const char *fixfmt(const char *format)
{
int i;
- for(i=0; i<MAX_FMT && format[i]; i++) {
+ for(i=0; i<sizeof(fmtbuf)-1 && format[i]; i++) {
fmtbuf[i] = format[i];
if(format[i] == '%' && format[i+1] == 'L') {
fmtbuf[i+1] = 'l';