From 3af69850507e6e6afac7c0de689bbd8545a6085a Mon Sep 17 00:00:00 2001 From: Nico Huber Date: Thu, 26 Jan 2017 23:22:46 +0100 Subject: [PATCH] util/nvramtool: Bail out on unaligned multi-byte entries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit coreboot doesn't support CMOS options that are not byte aligned but span multiple bytes. So treat them as error. Change-Id: I2bcff62f153932e9c6646b4ce08e8da1c1532947 Signed-off-by: Nico Huber Reviewed-on: https://review.coreboot.org/18246 Reviewed-by: Philippe Mathieu-Daudé Tested-by: build bot (Jenkins) Reviewed-by: Arthur Heymans --- util/nvramtool/accessors/layout-bin.c | 6 ++++++ util/nvramtool/accessors/layout-text.c | 6 ++++++ util/nvramtool/layout.c | 3 +++ util/nvramtool/layout.h | 1 + 4 files changed, 16 insertions(+) diff --git a/util/nvramtool/accessors/layout-bin.c b/util/nvramtool/accessors/layout-bin.c index 34507c9af2..9f92283480 100644 --- a/util/nvramtool/accessors/layout-bin.c +++ b/util/nvramtool/accessors/layout-bin.c @@ -481,6 +481,12 @@ static void try_add_cmos_table_entry(cmos_entry_t * cmos_entry) */ return; + case LAYOUT_MULTIBYTE_ENTRY_NOT_ALIGNED: + fprintf(stderr, + "%s: Unaligned CMOS option table entry %s " + "spans multiple bytes.\n", prog_name, cmos_entry->name); + break; + default: BUG(); } diff --git a/util/nvramtool/accessors/layout-text.c b/util/nvramtool/accessors/layout-text.c index bea3b3e9ec..f2735b9e35 100644 --- a/util/nvramtool/accessors/layout-text.c +++ b/util/nvramtool/accessors/layout-text.c @@ -695,6 +695,12 @@ static void try_add_layout_file_entry(const cmos_entry_t * cmos_entry) */ return; + case LAYOUT_MULTIBYTE_ENTRY_NOT_ALIGNED: + fprintf(stderr, + "%s: Unaligned CMOS option table entry %s " + "spans multiple bytes.\n", prog_name, cmos_entry->name); + break; + default: BUG(); } diff --git a/util/nvramtool/layout.c b/util/nvramtool/layout.c index 241dd19c6d..6fdb28216b 100644 --- a/util/nvramtool/layout.c +++ b/util/nvramtool/layout.c @@ -169,6 +169,9 @@ int add_cmos_entry(const cmos_entry_t * e, const cmos_entry_t ** conflict) if (e->length < 1) return LAYOUT_ENTRY_BAD_LENGTH; + if (e->bit % 8 && e->bit / 8 != (e->bit + e->length - 1) / 8) + return LAYOUT_MULTIBYTE_ENTRY_NOT_ALIGNED; + if ((new_entry = (cmos_entry_item_t *) malloc(sizeof(*new_entry))) == NULL) out_of_memory(); diff --git a/util/nvramtool/layout.h b/util/nvramtool/layout.h index 8a39ab90ac..bde060393b 100644 --- a/util/nvramtool/layout.h +++ b/util/nvramtool/layout.h @@ -40,6 +40,7 @@ #define LAYOUT_CHECKSUM_OVERLAPS_SUMMED_AREA (LAYOUT_RESULT_START + 7) #define LAYOUT_SUMMED_AREA_OUT_OF_RANGE (LAYOUT_RESULT_START + 8) #define LAYOUT_CHECKSUM_LOCATION_OUT_OF_RANGE (LAYOUT_RESULT_START + 9) +#define LAYOUT_MULTIBYTE_ENTRY_NOT_ALIGNED (LAYOUT_RESULT_START + 10) typedef enum { CMOS_ENTRY_ENUM = 'e',