From 02e11b323b819140590d99b6af440d36c12d161b Mon Sep 17 00:00:00 2001 From: Randall Spangler Date: Wed, 19 Nov 2014 12:48:36 -0800 Subject: vboot2: Add host library functions to read/write files and objects And unit tests for them. Move roundup32() into hostlib. Fix WriteFile() returning success even if it failed to write to the file. BUG=chromium:423882 BRANCH=none TEST=VBOOT2=1 make runtests Change-Id: I8a115335c088dc5c66c88423d1ccbda7eaca1996 Signed-off-by: Randall Spangler Reviewed-on: https://chromium-review.googlesource.com/230844 --- host/lib/host_misc.c | 1 + host/lib/host_misc2.c | 84 ++++++++++++++++++++++++++++++++++++++++++++ host/lib/include/host_misc.h | 41 +++++++++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 host/lib/host_misc2.c (limited to 'host') diff --git a/host/lib/host_misc.c b/host/lib/host_misc.c index adc39420..3fb9b24e 100644 --- a/host/lib/host_misc.c +++ b/host/lib/host_misc.c @@ -108,6 +108,7 @@ int WriteFile(const char* filename, const void *data, uint64_t size) { VBDEBUG(("Unable to write to file %s\n", filename)); fclose(f); unlink(filename); /* Delete any partial file */ + return 1; } fclose(f); diff --git a/host/lib/host_misc2.c b/host/lib/host_misc2.c new file mode 100644 index 00000000..88b58f5b --- /dev/null +++ b/host/lib/host_misc2.c @@ -0,0 +1,84 @@ +/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + * Host functions for verified boot. + */ + +#include +#include + +#include "2sysincludes.h" +#include "2common.h" +#include "host_common.h" + +int vb2_read_file(const char *filename, uint8_t **data_ptr, uint32_t *size_ptr) +{ + FILE *f; + uint8_t *buf; + long size; + + *data_ptr = NULL; + *size_ptr = 0; + + f = fopen(filename, "rb"); + if (!f) { + VB2_DEBUG("Unable to open file %s\n", filename); + return VB2_ERROR_READ_FILE_OPEN; + } + + fseek(f, 0, SEEK_END); + size = ftell(f); + rewind(f); + + if (size < 0 || size > UINT32_MAX) { + fclose(f); + return VB2_ERROR_READ_FILE_SIZE; + } + + buf = malloc(size); + if (!buf) { + fclose(f); + return VB2_ERROR_READ_FILE_ALLOC; + } + + if(1 != fread(buf, size, 1, f)) { + VB2_DEBUG("Unable to read file %s\n", filename); + fclose(f); + free(buf); + return VB2_ERROR_READ_FILE_DATA; + } + + fclose(f); + + *data_ptr = buf; + *size_ptr = size; + return VB2_SUCCESS; +} + +int vb2_write_file(const char *filename, const void *buf, uint32_t size) +{ + FILE *f = fopen(filename, "wb"); + + if (!f) { + VB2_DEBUG("Unable to open file %s\n", filename); + return VB2_ERROR_WRITE_FILE_OPEN; + } + + if (1 != fwrite(buf, size, 1, f)) { + VB2_DEBUG("Unable to write to file %s\n", filename); + fclose(f); + unlink(filename); /* Delete any partial file */ + return VB2_ERROR_WRITE_FILE_DATA; + } + + fclose(f); + return VB2_SUCCESS; +} + +int vb2_write_object(const char *filename, const void *buf) +{ + const struct vb2_struct_common *cptr = buf; + + return vb2_write_file(filename, buf, cptr->total_size); +} diff --git a/host/lib/include/host_misc.h b/host/lib/include/host_misc.h index b2b4fb94..2e18d90b 100644 --- a/host/lib/include/host_misc.h +++ b/host/lib/include/host_misc.h @@ -43,4 +43,45 @@ int ReadFileBit(const char* filename, int bitmask); * Returns 0 if success, 1 if error. */ int WriteFile(const char* filename, const void *data, uint64_t size); +/** + * Read data from a file into a newly allocated buffer. + * + * @param filename Name of file to read from + * @param data_ptr On exit, pointer to newly allocated buffer with data + * will be stored here. Caller must free() the buffer + * when done with it. + * @param size_ptr On exit, size of data will be stored here. + * @return VB2_SUCCESS, or non-zero if error. + */ +int vb2_read_file(const char *filename, uint8_t **data_ptr, uint32_t *size_ptr); + +/** + * Write data to a file from a buffer. + * + * @param filename Name of file to write to + * @param buf Buffer to write + * @param size Number of bytes of data to write + * @return VB2_SUCCESS, or non-zero if error. + */ +int vb2_write_file(const char *filename, const void *buf, uint32_t size); + +/** + * Write a buffer which starts with a standard vb2_struct_common header. + * + * Determines the buffer size from the common header total size field. + * + * @param filename Name of file to write to + * @param buf Buffer to write + * @return VB2_SUCCESS, or non-zero if error. + */ +int vb2_write_object(const char *filename, const void *buf); + +/** + * Round up a size to a multiple of 32 bits (4 bytes). + */ +static __inline const uint32_t roundup32(uint32_t v) +{ + return (v + 3) & ~3; +} + #endif /* VBOOT_REFERENCE_HOST_MISC_H_ */ -- cgit v1.2.1