From 828fe4c901ea92b18479f5c35b23977eaa368313 Mon Sep 17 00:00:00 2001 From: Leo Broukhis Date: Thu, 9 Mar 2017 21:20:19 -0800 Subject: [PATCH] BESM6: Added checks for calls to fseek (COVERITY) --- BESM6/besm6_disk.c | 34 +++++++++++++++++++--------------- BESM6/besm6_drum.c | 35 +++++++++++++++++++---------------- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/BESM6/besm6_disk.c b/BESM6/besm6_disk.c index fd49e89b..91954488 100644 --- a/BESM6/besm6_disk.c +++ b/BESM6/besm6_disk.c @@ -287,9 +287,10 @@ void disk_write (UNIT *u) if (disk_dev.dctrl) besm6_debug ("::: запись МД %o зона %04o память %05o-%05o", c->dev, c->zone, c->memory, c->memory + 1023); - fseek (u->fileref, ZONE_SIZE * c->zone * 8, SEEK_SET); - sim_fwrite (c->sysdata, 8, 8, u->fileref); - sim_fwrite (&memory [c->memory], 8, 1024, u->fileref); + if (fseek (u->fileref, ZONE_SIZE * c->zone * 8, SEEK_SET) == 0) { + sim_fwrite (c->sysdata, 8, 8, u->fileref); + sim_fwrite (&memory [c->memory], 8, 1024, u->fileref); + } if (ferror (u->fileref)) longjmp (cpu_halt, SCPE_IOERR); } @@ -301,11 +302,14 @@ void disk_write_track (UNIT *u) if (disk_dev.dctrl) besm6_debug ("::: запись МД %o полузона %04o.%d память %05o-%05o", c->dev, c->zone, c->track, c->memory, c->memory + 511); - fseek (u->fileref, (ZONE_SIZE*c->zone + 4*c->track) * 8, SEEK_SET); - sim_fwrite (c->sysdata + 4*c->track, 8, 4, u->fileref); - fseek (u->fileref, (8 + ZONE_SIZE*c->zone + 512*c->track) * 8, - SEEK_SET); - sim_fwrite (&memory [c->memory], 8, 512, u->fileref); + if (fseek (u->fileref, (ZONE_SIZE*c->zone + 4*c->track) * 8, + SEEK_SET) == 0) { + sim_fwrite (c->sysdata + 4*c->track, 8, 4, u->fileref); + if (fseek (u->fileref, (8 + ZONE_SIZE*c->zone + 512*c->track) * 8, + SEEK_SET) == 0) { + sim_fwrite (&memory [c->memory], 8, 512, u->fileref); + } + } if (ferror (u->fileref)) longjmp (cpu_halt, SCPE_IOERR); } @@ -358,8 +362,8 @@ void disk_read (UNIT *u) "::: чтение МД %o зона %04o служебные слова" : "::: чтение МД %o зона %04o память %05o-%05o", c->dev, c->zone, c->memory, c->memory + 1023); - fseek (u->fileref, ZONE_SIZE * c->zone * 8, SEEK_SET); - if (sim_fread (c->sysdata, 8, 8, u->fileref) != 8) { + if (fseek (u->fileref, ZONE_SIZE * c->zone * 8, SEEK_SET) != 0 || + sim_fread (c->sysdata, 8, 8, u->fileref) != 8) { /* Чтение неинициализированного диска */ disk_fail |= c->mask_fail; return; @@ -395,16 +399,16 @@ void disk_read_track (UNIT *u) "::: чтение МД %o полузона %04o.%d служебные слова" : "::: чтение МД %o полузона %04o.%d память %05o-%05o", c->dev, c->zone, c->track, c->memory, c->memory + 511); - fseek (u->fileref, (ZONE_SIZE*c->zone + 4*c->track) * 8, SEEK_SET); - if (sim_fread (c->sysdata + 4*c->track, 8, 4, u->fileref) != 4) { + if (fseek (u->fileref, (ZONE_SIZE*c->zone + 4*c->track) * 8, SEEK_SET) != 0 || + sim_fread (c->sysdata + 4*c->track, 8, 4, u->fileref) != 4) { /* Чтение неинициализированного диска */ disk_fail |= c->mask_fail; return; } if (! (c->op & DISK_READ_SYSDATA)) { - fseek (u->fileref, (8 + ZONE_SIZE*c->zone + 512*c->track) * 8, - SEEK_SET); - if (sim_fread (&memory [c->memory], 8, 512, u->fileref) != 512) { + if (fseek (u->fileref, (8 + ZONE_SIZE*c->zone + 512*c->track) * 8, + SEEK_SET) != 0 || + sim_fread (&memory [c->memory], 8, 512, u->fileref) != 512) { /* Чтение неинициализированного диска */ disk_fail |= c->mask_fail; return; diff --git a/BESM6/besm6_drum.c b/BESM6/besm6_drum.c index 9b7781ee..e7963727 100644 --- a/BESM6/besm6_drum.c +++ b/BESM6/besm6_drum.c @@ -180,9 +180,10 @@ void drum_write (UNIT *u) ctlr = (u == &drum_unit[1]); sysdata = ctlr ? &memory [020] : &memory [010]; - fseek (u->fileref, ZONE_SIZE * drum_zone * 8, SEEK_SET); - sim_fwrite (sysdata, 8, 8, u->fileref); - sim_fwrite (&memory [drum_memory], 8, 1024, u->fileref); + if (fseek (u->fileref, ZONE_SIZE * drum_zone * 8, SEEK_SET) == 0) { + sim_fwrite (sysdata, 8, 8, u->fileref); + sim_fwrite (&memory [drum_memory], 8, 1024, u->fileref); + } if (ferror (u->fileref)) longjmp (cpu_halt, SCPE_IOERR); } @@ -194,12 +195,14 @@ void drum_write_sector (UNIT *u) ctlr = (u == &drum_unit[1]); sysdata = ctlr ? &memory [020] : &memory [010]; - fseek (u->fileref, (ZONE_SIZE*drum_zone + drum_sector*2) * 8, - SEEK_SET); - sim_fwrite (&sysdata [drum_sector*2], 8, 2, u->fileref); - fseek (u->fileref, (ZONE_SIZE*drum_zone + 8 + drum_sector*256) * 8, - SEEK_SET); - sim_fwrite (&memory [drum_memory], 8, 256, u->fileref); + if (fseek (u->fileref, (ZONE_SIZE*drum_zone + drum_sector*2) * 8, + SEEK_SET) == 0) { + sim_fwrite (&sysdata [drum_sector*2], 8, 2, u->fileref); + if (fseek (u->fileref, (ZONE_SIZE*drum_zone + 8 + drum_sector*256) * 8, + SEEK_SET) == 0) { + sim_fwrite (&memory [drum_memory], 8, 256, u->fileref); + } + } if (ferror (u->fileref)) longjmp (cpu_halt, SCPE_IOERR); } @@ -214,8 +217,8 @@ void drum_read (UNIT *u) ctlr = (u == &drum_unit[1]); sysdata = ctlr ? &memory [020] : &memory [010]; - fseek (u->fileref, ZONE_SIZE * drum_zone * 8, SEEK_SET); - if (sim_fread (sysdata, 8, 8, u->fileref) != 8) { + if (fseek (u->fileref, ZONE_SIZE * drum_zone * 8, SEEK_SET) != 0 || + sim_fread (sysdata, 8, 8, u->fileref) != 8) { /* Чтение неинициализированного барабана */ drum_fail |= 0100 >> ctlr; return; @@ -237,16 +240,16 @@ void drum_read_sector (UNIT *u) ctlr = (u == &drum_unit[1]); sysdata = ctlr ? &memory [020] : &memory [010]; - fseek (u->fileref, (ZONE_SIZE*drum_zone + drum_sector*2) * 8, SEEK_SET); - if (sim_fread (&sysdata [drum_sector*2], 8, 2, u->fileref) != 2) { + if (fseek (u->fileref, (ZONE_SIZE*drum_zone + drum_sector*2) * 8, SEEK_SET) != 0 || + sim_fread (&sysdata [drum_sector*2], 8, 2, u->fileref) != 2) { /* Чтение неинициализированного барабана */ drum_fail |= 0100 >> ctlr; return; } if (! (drum_op & DRUM_READ_SYSDATA)) { - fseek (u->fileref, (ZONE_SIZE*drum_zone + 8 + drum_sector*256) * 8, - SEEK_SET); - if (sim_fread (&memory[drum_memory], 8, 256, u->fileref) != 256) { + if (fseek (u->fileref, (ZONE_SIZE*drum_zone + 8 + drum_sector*256) * 8, + SEEK_SET) != 0 || + sim_fread (&memory[drum_memory], 8, 256, u->fileref) != 256) { /* Чтение неинициализированного барабана */ drum_fail |= 0100 >> ctlr; return;