diff options
author | Richard Spiegel <richard.spiegel@silverbackltd.com> | 2018-01-17 10:23:19 -0700 |
---|---|---|
committer | Martin Roth <martinroth@google.com> | 2018-01-24 16:24:29 +0000 |
commit | 137484dee70b378ee557de4e6bbe59716e4791f0 (patch) | |
tree | fddc4b2a15f627631de37385cd7fb1281c56bc24 | |
parent | 1014de685883186b4a501118c66fb35bfe5b588e (diff) | |
download | coreboot-137484dee70b378ee557de4e6bbe59716e4791f0.tar.xz |
util/amdfwtool/amdfwtool.c: Verify it actually read bytes
The function read() returns the number of bytes actually read. Program is
assuming it actually read the required number of bytes without checking.
This is wrong.
This fixes CIDs 1353019 and 1353021
BUG=b:72062481
TEST=Build no errors
Change-Id: I22d41b3de4eac5369f512f78b1b31cc1a250f787
Signed-off-by: Richard Spiegel <richard.spiegel@silverbackltd.com>
Reviewed-on: https://review.coreboot.org/23304
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
-rw-r--r-- | util/amdfwtool/amdfwtool.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/util/amdfwtool/amdfwtool.c b/util/amdfwtool/amdfwtool.c index 289d47a53e..303a31df3f 100644 --- a/util/amdfwtool/amdfwtool.c +++ b/util/amdfwtool/amdfwtool.c @@ -285,6 +285,7 @@ static uint32_t integrate_firmwares(char *base, uint32_t pos, uint32_t *romsig, amd_fw_entry *fw_table, uint32_t rom_size) { int fd; + ssize_t bytes; struct stat fd_stat; int i; uint32_t rom_base_address = 0xFFFFFFFF - rom_size + 1; @@ -323,9 +324,17 @@ static uint32_t integrate_firmwares(char *base, uint32_t pos, uint32_t *romsig, exit(1); } - read(fd, (void *)(base + pos), (size_t)fd_stat.st_size); + bytes = read(fd, (void *)(base + pos), + (size_t)fd_stat.st_size); + if (bytes == (ssize_t)fd_stat.st_size) + pos += fd_stat.st_size; + else { + printf("Error while reading %s\n", + fw_table[i].filename); + free(base); + exit(1); + } - pos += fd_stat.st_size; close(fd); pos = ALIGN(pos, 0x100U); } @@ -340,6 +349,7 @@ static uint32_t integrate_psp_firmwares(char *base, uint32_t pos, uint32_t rom_size) { int fd; + ssize_t bytes; struct stat fd_stat; unsigned int i; uint32_t rom_base_address = 0xFFFFFFFF - rom_size + 1; @@ -373,9 +383,17 @@ static uint32_t integrate_psp_firmwares(char *base, uint32_t pos, exit(1); } - read(fd, (void *)(base + pos), (size_t)fd_stat.st_size); + bytes = read(fd, (void *)(base + pos), + (size_t)fd_stat.st_size); + if (bytes == (ssize_t)fd_stat.st_size) + pos += fd_stat.st_size; + else { + printf("Error while reading %s\n", + fw_table[i].filename); + free(base); + exit(1); + } - pos += fd_stat.st_size; close(fd); pos = ALIGN(pos, 0x100U); } else { |