aboutsummaryrefslogtreecommitdiff
path: root/replay
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2018-11-06 15:33:30 +0000
committerPeter Maydell <peter.maydell@linaro.org>2018-11-08 13:24:35 +0000
commit0b57007755c2ee442740b5321ffc7072aed88714 (patch)
tree56186f8fe222e8007119c7d0eb0b1398348570e1 /replay
parentfa27257432689e8927cb993b251d380d654dcc86 (diff)
downloadqemu-0b57007755c2ee442740b5321ffc7072aed88714.zip
qemu-0b57007755c2ee442740b5321ffc7072aed88714.tar.gz
qemu-0b57007755c2ee442740b5321ffc7072aed88714.tar.bz2
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')
-rw-r--r--replay/replay-internal.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/replay/replay-internal.c b/replay/replay-internal.c
index 1cea1d4..8f87e9b 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();
}
}
}