diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2018-11-06 15:33:30 +0000 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2018-11-08 13:24:35 +0000 |
commit | 0b57007755c2ee442740b5321ffc7072aed88714 (patch) | |
tree | 56186f8fe222e8007119c7d0eb0b1398348570e1 /replay/replay-internal.c | |
parent | fa27257432689e8927cb993b251d380d654dcc86 (diff) |
replay: Exit on errors reading from replay log
Currently replay_get_byte() does not check for an error
from getc(). Coverity points out (CID 1390622) that this
could result in unexpected behaviour (such as looping
forever, if we use the replay_get_dword() return value
for a loop count). We don't expect reads from the replay
log to fail, and if they do there is no way we can
continue. So make them fatal errors.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
Message-id: 20181106153330.5139-1-peter.maydell@linaro.org
Diffstat (limited to 'replay/replay-internal.c')
-rw-r--r-- | replay/replay-internal.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/replay/replay-internal.c b/replay/replay-internal.c index 1cea1d4dc9..8f87e9b957 100644 --- a/replay/replay-internal.c +++ b/replay/replay-internal.c @@ -35,6 +35,12 @@ static void replay_write_error(void) } } +static void replay_read_error(void) +{ + error_report("error reading the replay data"); + exit(1); +} + void replay_put_byte(uint8_t byte) { if (replay_file) { @@ -83,7 +89,11 @@ uint8_t replay_get_byte(void) { uint8_t byte = 0; if (replay_file) { - byte = getc(replay_file); + int r = getc(replay_file); + if (r == EOF) { + replay_read_error(); + } + byte = r; } return byte; } @@ -126,7 +136,7 @@ void replay_get_array(uint8_t *buf, size_t *size) if (replay_file) { *size = replay_get_dword(); if (fread(buf, 1, *size, replay_file) != *size) { - error_report("replay read error"); + replay_read_error(); } } } @@ -137,7 +147,7 @@ void replay_get_array_alloc(uint8_t **buf, size_t *size) *size = replay_get_dword(); *buf = g_malloc(*size); if (fread(*buf, 1, *size, replay_file) != *size) { - error_report("replay read error"); + replay_read_error(); } } } |