From 874977614411a0e1cd0e60ff57d49e21819ff3d5 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 15 Jan 2020 03:04:59 +0100 Subject: [PATCH] Fixed the first batch of problems. --- src/config.c | 12 +++++++++++- src/disk/hdd_image.c | 5 ++++- src/floppy/fdd_86f.c | 18 ++++++++++++------ src/floppy/fdd_img.c | 20 ++++++++++++++------ src/machine/m_tandy.c | 3 ++- src/machine/m_xt.c | 8 ++++---- src/nvr_ps2.c | 3 ++- src/video/vid_ati_eeprom.c | 10 ++++++---- src/video/vid_pgc.c | 8 ++++++-- src/video/vid_tgui9440.c | 1 + 10 files changed, 62 insertions(+), 26 deletions(-) diff --git a/src/config.c b/src/config.c index e33eabac8..3bcd6dbea 100644 --- a/src/config.c +++ b/src/config.c @@ -566,6 +566,7 @@ load_video(void) { char *cat = "Video"; char *p; + int free_p = 0; if (machines[machine].flags & MACHINE_VIDEO_FIXED) { config_delete_var(cat, "gfxcard"); @@ -580,8 +581,11 @@ load_video(void) p = (char *)malloc((strlen("none")+1)*sizeof(char)); strcpy(p, "none"); } + free_p = 1; } gfxcard = video_get_video_from_internal_name(p); + if (free_p) + free(p); } voodoo_enabled = !!config_get_int(cat, "voodoo", 0); @@ -763,7 +767,7 @@ load_other_peripherals(void) char *cat = "Other peripherals"; char *p; char temp[512]; - int c; + int c, free_p = 0; p = config_get_string(cat, "scsicard", NULL); if (p != NULL) @@ -780,6 +784,7 @@ load_other_peripherals(void) p = (char *)malloc((strlen("none")+1)*sizeof(char)); strcpy(p, "none"); } + free_p = 1; } if (!strcmp(p, "mfm_xt")) hdc_current = hdc_get_from_internal_name("st506_xt"); @@ -790,6 +795,11 @@ load_other_peripherals(void) else hdc_current = hdc_get_from_internal_name(p); + if (free_p) { + free(p); + p = NULL; + } + ide_ter_enabled = !!config_get_int(cat, "ide_ter", 0); ide_qua_enabled = !!config_get_int(cat, "ide_qua", 0); diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index 63d140014..5a84116eb 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -166,7 +166,10 @@ image_is_vhd(const wchar_t *s, int check_signature) return 0; fseeko64(f, 0, SEEK_END); filelen = ftello64(f); - fseeko64(f, -512, SEEK_END); + if (fseeko64(f, -512, SEEK_END) == -1) { + fclose(f); + fatal("image_is_vhd(): Error seeking\n"); + } if (filelen < 512) { if (f != NULL) fclose(f); diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index 4fb68c606..797d6bf80 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -3779,10 +3779,13 @@ d86f_load(int drive, wchar_t *fn) } /* Load track 0 flags as default. */ - fseek(dev->f, dev->track_offset[0], SEEK_SET); - fread(&(dev->side_flags[0]), 2, 1, dev->f); + if (fseek(dev->f, dev->track_offset[0], SEEK_SET) == -1) + fatal("d86f_load(): Track 0: Error seeking to the beginning of the file\n"); + if (fread(&(dev->side_flags[0]), 1, 2, dev->f) != 2) + fatal("d86f_load(): Track 0: Error reading side flags\n"); if (dev->disk_flags & 0x80) { - fread(&(dev->extra_bit_cells[0]), 4, 1, dev->f); + if (fread(&(dev->extra_bit_cells[0]), 1, 4, dev->f) != 4) + fatal("d86f_load(): Track 0: Error reading the amount of extra bit cells\n"); if ((dev->disk_flags & 0x1060) != 0x1000) { if (dev->extra_bit_cells[0] < -32768) dev->extra_bit_cells[0] = -32768; if (dev->extra_bit_cells[0] > 32768) dev->extra_bit_cells[0] = 32768; @@ -3792,10 +3795,13 @@ d86f_load(int drive, wchar_t *fn) } if (d86f_get_sides(drive) == 2) { - fseek(dev->f, dev->track_offset[1], SEEK_SET); - fread(&(dev->side_flags[1]), 2, 1, dev->f); + if (fseek(dev->f, dev->track_offset[1], SEEK_SET) == -1) + fatal("d86f_load(): Track 1: Error seeking to the beginning of the file\n"); + if (fread(&(dev->side_flags[1]), 1, 2, dev->f) != 2) + fatal("d86f_load(): Track 1: Error reading side flags\n"); if (dev->disk_flags & 0x80) { - fread(&(dev->extra_bit_cells[1]), 4, 1, dev->f); + if (fread(&(dev->extra_bit_cells[1]), 1, 4, dev->f) != 4) + fatal("d86f_load(): Track 4: Error reading the amount of extra bit cells\n"); if ((dev->disk_flags & 0x1060) != 0x1000) { if (dev->extra_bit_cells[1] < -32768) dev->extra_bit_cells[1] = -32768; if (dev->extra_bit_cells[1] > 32768) dev->extra_bit_cells[1] = 32768; diff --git a/src/floppy/fdd_img.c b/src/floppy/fdd_img.c index f040d2086..6d0c626dc 100644 --- a/src/floppy/fdd_img.c +++ b/src/floppy/fdd_img.c @@ -393,15 +393,19 @@ write_back(int drive) { img_t *dev = img[drive]; int ssize = 128 << ((int) dev->sector_size); - int side; + int side, size; if (dev->f == NULL) return; if (dev->disk_at_once) return; - fseek(dev->f, dev->base + (dev->track * dev->sectors * ssize * dev->sides), SEEK_SET); - for (side = 0; side < dev->sides; side++) - fwrite(dev->track_data[side], dev->sectors * ssize, 1, dev->f); + if (fseek(dev->f, dev->base + (dev->track * dev->sectors * ssize * dev->sides), SEEK_SET) == -1) + pclog("IMG write_back(): Error seeking to the beginning of the file\n"); + for (side = 0; side < dev->sides; side++) { + size = dev->sectors * ssize; + if (fwrite(dev->track_data[side], 1, size, dev->f) != size) + fatal("IMG write_back(): Error writing data\n"); + } } @@ -1156,8 +1160,12 @@ jump_if_fdf: dev->gap2_size = (temp_rate == 3) ? 41 : 22; if (dev->dmf) dev->gap3_size = 8; - else - dev->gap3_size = gap3_sizes[temp_rate][dev->sector_size][dev->sectors]; + else { + if (dev->sectors == -1) + dev->gap3_size = 8; + else + dev->gap3_size = gap3_sizes[temp_rate][dev->sector_size][dev->sectors]; + } if (! dev->gap3_size) { img_log("ERROR: Floppy image of unknown format was inserted into drive %c:!\n", drive + 0x41); fclose(dev->f); diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 3dbc65748..4a578d3b6 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -1293,7 +1293,8 @@ eep_init(const device_t *info) f = nvr_fopen(eep->path, L"rb"); if (f != NULL) { - fread(eep->store, 128, 1, f); + if (fread(eep->store, 1, 128, f) != 128) + fatal("eep_init(): Error reading Tandy EEPROM\n"); (void)fclose(f); } diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index 22a01c882..0366517d1 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -157,10 +157,10 @@ machine_xt86_init(const machine_t *model) ret = bios_load_linear(L"roms/machines/ibmxt86/BIOS_5160_09MAY86_U18_59X7268_62X0890_27256_F800.BIN", 0x000fe000, 65536, 0x6000); if (ret) { - bios_load_aux_linear(L"roms/machines/ibmxt86/BIOS_5160_09MAY86_U18_59X7268_62X0890_27256_F800.BIN", - 0x000f8000, 24576, 0); - bios_load_aux_linear(L"roms/machines/ibmxt86/BIOS_5160_09MAY86_U19_62X0819_68X4370_27256_F000.BIN", - 0x000f0000, 32768, 0); + (void) bios_load_aux_linear(L"roms/machines/ibmxt86/BIOS_5160_09MAY86_U18_59X7268_62X0890_27256_F800.BIN", + 0x000f8000, 24576, 0); + (void) bios_load_aux_linear(L"roms/machines/ibmxt86/BIOS_5160_09MAY86_U19_62X0819_68X4370_27256_F000.BIN", + 0x000f0000, 32768, 0); } if (bios_only || !ret) diff --git a/src/nvr_ps2.c b/src/nvr_ps2.c index 5c943a0eb..c98d12e77 100644 --- a/src/nvr_ps2.c +++ b/src/nvr_ps2.c @@ -128,7 +128,8 @@ ps2_nvr_init(const device_t *info) memset(nvr->ram, 0xff, 8192); if (f != NULL) { - (void)fread(nvr->ram, 8192, 1, f); + if (fread(nvr->ram, 1, 8192, f) != 8192) + fatal("ps2_nvr_init(): Error reading EEPROM data\n"); fclose(f); } diff --git a/src/video/vid_ati_eeprom.c b/src/video/vid_ati_eeprom.c index f1fb0753f..00e193913 100644 --- a/src/video/vid_ati_eeprom.c +++ b/src/video/vid_ati_eeprom.c @@ -58,18 +58,20 @@ enum void ati_eeprom_load(ati_eeprom_t *eeprom, wchar_t *fn, int type) { FILE *f; + int size; eeprom->type = type; if (wcslen(fn) <= 256) wcscpy(eeprom->fn, fn); else wcsncpy(eeprom->fn, fn, 256); f = nvr_fopen(eeprom->fn, L"rb"); - if (!f) - { - memset(eeprom->data, 0, eeprom->type ? 512 : 128); + int size = eeprom->type ? 512 : 128; + if (!f) { + memset(eeprom->data, 0, size); return; } - fread(eeprom->data, 1, eeprom->type ? 512 : 128, f); + if (fread(eeprom->data, 1, size, f) != size) + memset(eeprom->data, 0, size); fclose(f); } diff --git a/src/video/vid_pgc.c b/src/video/vid_pgc.c index 954157b18..4ffb62a30 100644 --- a/src/video/vid_pgc.c +++ b/src/video/vid_pgc.c @@ -2065,8 +2065,12 @@ pgc_parse_coords(pgc_t *dev, pgc_cl_t *cl, int count) return 0; } - for (n = 0; n < count; n++) - if (! pgc_param_coord(dev, ¶m[n])) return 0; + for (n = 0; n < count; n++) { + if (! pgc_param_coord(dev, ¶m[n])) { + free(param); + return 0; + } + } /* Here is how the real PGC serializes coords: * diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index c366fae12..a80ea293f 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -308,6 +308,7 @@ void tgui_out(uint16_t addr, uint8_t val, void *p) } return; } + /*FALLTHROUGH*/ case 0x3C7: case 0x3C8: case 0x3C9: if (tgui->type == TGUI_9400CXI) {