diff --git a/src/chipset/scat.c b/src/chipset/scat.c index fce0e772b..79f18d396 100644 --- a/src/chipset/scat.c +++ b/src/chipset/scat.c @@ -1056,17 +1056,14 @@ scat_out(uint16_t port, uint8_t val, void *priv) break; case SCAT_EMS_CONTROL: + io_removehandler(0x0208, 0x0003, scat_in, NULL, NULL, scat_out, NULL, NULL, dev); + io_removehandler(0x0218, 0x0003, scat_in, NULL, NULL, scat_out, NULL, NULL, dev); + if (val & 0x40) { - if (val & 1) { + if (val & 1) io_sethandler(0x0218, 3, scat_in, NULL, NULL, scat_out, NULL, NULL, dev); - io_removehandler(0x0208, 3, scat_in, NULL, NULL, scat_out, NULL, NULL, dev); - } else { + else io_sethandler(0x0208, 3, scat_in, NULL, NULL, scat_out, NULL, NULL, dev); - io_removehandler(0x0218, 3, scat_in, NULL, NULL, scat_out, NULL, NULL, dev); - } - } else { - io_removehandler(0x0208, 0x0003, scat_in, NULL, NULL, scat_out, NULL, NULL, dev); - io_removehandler(0x0218, 0x0003, scat_in, NULL, NULL, scat_out, NULL, NULL, dev); } set_global_EMS_state(dev, val & 0x80); reg_valid = 1; diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index 5831fee88..a980ec6e8 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -1333,7 +1333,8 @@ loadrom(hdc_t *dev, const wchar_t *fn) /* Load the ROM data. */ dev->bios_rom.rom = (uint8_t *)malloc(size); memset(dev->bios_rom.rom, 0xff, size); - (void)fread(dev->bios_rom.rom, size, 1, fp); + if (fread(dev->bios_rom.rom, 1, size, fp) != size) + fatal("ST-506 XT loadrom(): Error reading data\n"); (void)fclose(fp); /* Set up an address mask for this memory. */ diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index 5a84116eb..26c312824 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -641,13 +641,19 @@ hdd_image_load(int id) } } else { if (image_is_hdi(fn)) { - fseeko64(hdd_images[id].file, 0x8, SEEK_SET); - fread(&(hdd_images[id].base), 1, 4, hdd_images[id].file); - fseeko64(hdd_images[id].file, 0xC, SEEK_SET); + if (fseeko64(hdd_images[id].file, 0x8, SEEK_SET) == -1) + fatal("hdd_image_load(): HDI: Error seeking to offset 0x8\n"); + if (fread(&(hdd_images[id].base), 1, 4, hdd_images[id].file) != 4) + fatal("hdd_image_load(): HDI: Error reading base offset\n"); + if (fseeko64(hdd_images[id].file, 0xC, SEEK_SET) == -1) + fatal("hdd_image_load(): HDI: Error seeking to offest 0xC\n"); full_size = 0LL; - fread(&full_size, 1, 4, hdd_images[id].file); - fseeko64(hdd_images[id].file, 0x10, SEEK_SET); - fread(§or_size, 1, 4, hdd_images[id].file); + if (fread(&full_size, 1, 4, hdd_images[id].file) != 4) + fatal("hdd_image_load(): HDI: Error reading full size\n"); + if (fseeko64(hdd_images[id].file, 0x10, SEEK_SET) == -1) + fatal("hdd_image_load(): HDI: Error seeking to offset 0x10\n"); + if (fread(§or_size, 1, 4, hdd_images[id].file) != 4) + fatal("hdd_image_load(): HDI: Error reading sector size\n"); if (sector_size != 512) { /* Sector size is not 512 */ hdd_image_log("HDI: Sector size is not 512\n"); @@ -656,19 +662,26 @@ hdd_image_load(int id) memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); return 0; } - fread(&spt, 1, 4, hdd_images[id].file); - fread(&hpc, 1, 4, hdd_images[id].file); - fread(&tracks, 1, 4, hdd_images[id].file); + if (fread(&spt, 1, 4, hdd_images[id].file) != 4) + fatal("hdd_image_load(): HDI: Error reading sectors per track\n"); + if (fread(&hpc, 1, 4, hdd_images[id].file) != 4) + fatal("hdd_image_load(): HDI: Error reading heads per cylinder\n"); + if (fread(&tracks, 1, 4, hdd_images[id].file) != 4) + fatal("hdd_image_load(): HDI: Error reading number of tracks\n"); hdd[id].spt = spt; hdd[id].hpc = hpc; hdd[id].tracks = tracks; hdd_images[id].type = 1; } else if (is_hdx[1]) { hdd_images[id].base = 0x28; - fseeko64(hdd_images[id].file, 8, SEEK_SET); - fread(&full_size, 1, 8, hdd_images[id].file); - fseeko64(hdd_images[id].file, 0x10, SEEK_SET); - fread(§or_size, 1, 4, hdd_images[id].file); + if (fseeko64(hdd_images[id].file, 8, SEEK_SET) == -1) + fatal("hdd_image_load(): HDX: Error seeking to offset 0x8\n"); + if (fread(&full_size, 1, 8, hdd_images[id].file) != 8) + fatal("hdd_image_load(): HDX: Error reading full size\n"); + if (fseeko64(hdd_images[id].file, 0x10, SEEK_SET) == -1) + fatal("hdd_image_load(): HDX: Error seeking to offset 0x10\n"); + if (fread(§or_size, 1, 4, hdd_images[id].file) != 4) + fatal("hdd_image_load(): HDX: Error reading sector size\n"); if (sector_size != 512) { /* Sector size is not 512 */ hdd_image_log("HDX: Sector size is not 512\n"); @@ -677,16 +690,21 @@ hdd_image_load(int id) memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); return 0; } - fread(&spt, 1, 4, hdd_images[id].file); - fread(&hpc, 1, 4, hdd_images[id].file); - fread(&tracks, 1, 4, hdd_images[id].file); + if (fread(&spt, 1, 4, hdd_images[id].file) != 4) + fatal("hdd_image_load(): HDI: Error reading sectors per track\n"); + if (fread(&hpc, 1, 4, hdd_images[id].file) != 4) + fatal("hdd_image_load(): HDI: Error reading heads per cylinder\n"); + if (fread(&tracks, 1, 4, hdd_images[id].file) != 4) + fatal("hdd_image_load(): HDX: Error reading number of tracks\n"); hdd[id].spt = spt; hdd[id].hpc = hpc; hdd[id].tracks = tracks; hdd_images[id].type = 2; } else if (is_vhd[1]) { - fseeko64(hdd_images[id].file, -512, SEEK_END); - fread(empty_sector, 1, 512, hdd_images[id].file); + if (fseeko64(hdd_images[id].file, -512, SEEK_END) == -1) + fatal("hdd_image_load(): VHD: Error seeking to 512 bytes before the end of file\n"); + if (fread(empty_sector, 1, 512, hdd_images[id].file) != 512) + fatal("hdd_image_load(): HDX: Error reading the footer\n"); new_vhd_footer(&vft); vhd_footer_from_bytes(vft, (uint8_t *) empty_sector); if (vft->type != 2) { @@ -720,7 +738,8 @@ hdd_image_load(int id) } } - fseeko64(hdd_images[id].file, 0, SEEK_END); + if (fseeko64(hdd_images[id].file, 0, SEEK_END) == -1) + fatal("hdd_image_load(): Error seeking to the end of file\n"); s = ftello64(hdd_images[id].file); if (s < (full_size + hdd_images[id].base)) ret = prepare_new_hard_disk(id, full_size); @@ -731,7 +750,8 @@ hdd_image_load(int id) } if (is_vhd[0]) { - fseeko64(hdd_images[id].file, 0, SEEK_END); + if (fseeko64(hdd_images[id].file, 0, SEEK_END) == -1) + fatal("hdd_image_load(): VHD: Error seeking to the end of file\n"); s = ftello64(hdd_images[id].file); if (s == (full_size + hdd_images[id].base)) { /* VHD image. */ diff --git a/src/disk/zip.c b/src/disk/zip.c index 85f4e677f..9185aafae 100644 --- a/src/disk/zip.c +++ b/src/disk/zip.c @@ -527,7 +527,8 @@ zip_load(zip_t *dev, wchar_t *fn) dev->drv->medium_size = size >> 9; - fseek(dev->drv->f, dev->drv->base, SEEK_SET); + if (fseek(dev->drv->f, dev->drv->base, SEEK_SET) == -1) + fatal("zip_load(): Error seeking to the beginning of the file\n"); memcpy(dev->drv->image_path, fn, sizeof(dev->drv->image_path)); @@ -1180,10 +1181,13 @@ zip_blocks(zip_t *dev, int32_t *len, int first_batch, int out) if (feof(dev->drv->f)) break; - if (out) - fwrite(dev->buffer + (i << 9), 1, 512, dev->drv->f); - else - fread(dev->buffer + (i << 9), 1, 512, dev->drv->f); + if (out) { + if (fwrite(dev->buffer + (i << 9), 1, 512, dev->drv->f) != 512) + fatal("zip_blocks(): Error writing data\n"); + } else { + if (fread(dev->buffer + (i << 9), 1, 512, dev->drv->f) != 512) + fatal("zip_blocks(): Error reading data\n"); + } } zip_log("%s %i bytes of blocks...\n", out ? "Written" : "Read", *len); @@ -1444,6 +1448,7 @@ zip_command(scsi_common_t *sc, uint8_t *cdb) zip_invalid_field(dev); return; } + /*FALLTHROUGH*/ case GPCMD_SCSI_RESERVE: case GPCMD_SCSI_RELEASE: case GPCMD_TEST_UNIT_READY: diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index 797d6bf80..70540105b 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -3161,7 +3161,7 @@ d86f_writeback(int drive) { d86f_t *dev = d86f[drive]; uint8_t header[32]; - int header_size; + int header_size, size; #ifdef D86F_COMPRESS uint32_t len; int ret = 0; @@ -3172,11 +3172,16 @@ d86f_writeback(int drive) if (! dev->f) return; /* First write the track offsets table. */ - fseek(dev->f, 0, SEEK_SET); - fread(header, 1, header_size, dev->f); + if (fseek(dev->f, 0, SEEK_SET) == -1) + fatal("86F write_back(): Error seeking to the beginning of the file\n"); + if (fread(header, 1, header_size, dev->f) != header_size) + fatal("86F write_back(): Error reading header size\n"); - fseek(dev->f, 8, SEEK_SET); - fwrite(dev->track_offset, 1, d86f_get_track_table_size(drive), dev->f); + if (fseek(dev->f, 8, SEEK_SET) == -1) + fatal("86F write_back(): Error seeking\n"); + size = d86f_get_track_table_size(drive); + if (fwrite(dev->track_offset, 1, size, dev->f) != size) + fatal("86F write_back(): Error writing data\n"); d86f_write_tracks(drive, &dev->f, NULL); @@ -3586,7 +3591,9 @@ d86f_load(int drive, wchar_t *fn) return; } - fread(&(dev->version), 2, 1, dev->f); + if (fread(&(dev->version), 1, 2, dev->f) != 2) + fatal("d86f_load(): Error reading format version\n"); + if (dev->version != D86FVER) { /* File is not of a recognized format version, abort. */ if (dev->version == 0x0063) { diff --git a/src/floppy/fdd_imd.c b/src/floppy/fdd_imd.c index 421e339cf..c892e24c5 100644 --- a/src/floppy/fdd_imd.c +++ b/src/floppy/fdd_imd.c @@ -638,8 +638,10 @@ imd_load(int drive, wchar_t *fn) writeprot[drive] = 1; fwriteprot[drive] = writeprot[drive]; - fseek(dev->f, 0, SEEK_SET); - fread(&magic, 1, 4, dev->f); + if (fseek(dev->f, 0, SEEK_SET) == -1) + fatal("imd_load(): Error seeking to the beginning of the file\n"); + if (fread(&magic, 1, 4, dev->f) != 4) + fatal("imd_load(): Error reading the magic number\n"); if (magic != 0x20444D49) { imd_log("IMD: Not a valid ImageDisk image\n"); fclose(dev->f); @@ -649,11 +651,14 @@ imd_load(int drive, wchar_t *fn) } else imd_log("IMD: Valid ImageDisk image\n"); - fseek(dev->f, 0, SEEK_END); + if (fseek(dev->f, 0, SEEK_END) == -1) + fatal("imd_load(): Error seeking to the end of the file\n"); fsize = ftell(dev->f); - fseek(dev->f, 0, SEEK_SET); + if (fseek(dev->f, 0, SEEK_SET) == -1) + fatal("imd_load(): Error seeking to the beginning of the file again\n"); dev->buffer = malloc(fsize); - fread(dev->buffer, 1, fsize, dev->f); + if (fread(dev->buffer, 1, fsize, dev->f) != fsize) + fatal("imd_load(): Error reading data\n"); buffer = dev->buffer; buffer2 = strchr(buffer, 0x1A); diff --git a/src/floppy/fdd_mfm.c b/src/floppy/fdd_mfm.c index c2062baad..6da06f48d 100644 --- a/src/floppy/fdd_mfm.c +++ b/src/floppy/fdd_mfm.c @@ -401,7 +401,7 @@ mfm_load(int drive, wchar_t *fn) { mfm_t *dev; double dbr; - int i; + int i, size; writeprot[drive] = fwriteprot[drive] = 1; @@ -419,16 +419,22 @@ mfm_load(int drive, wchar_t *fn) d86f_unregister(drive); /* Read the header. */ - fread(&dev->hdr, 1, sizeof(mfm_header_t), dev->f); + size = sizeof(mfm_header_t); + if (fread(&dev->hdr, 1, size, dev->f) != size) + fatal("mfm_load(): Error reading header\n"); /* Calculate tracks * sides, allocate the tracks array, and read it. */ dev->total_tracks = dev->hdr.tracks_no * dev->hdr.sides_no; if (dev->hdr.if_type & 0x80) { dev->adv_tracks = (mfm_adv_track_t *) malloc(dev->total_tracks * sizeof(mfm_adv_track_t)); - fread(dev->adv_tracks, 1, dev->total_tracks * sizeof(mfm_adv_track_t), dev->f); + size = dev->total_tracks * sizeof(mfm_adv_track_t); + if (fread(dev->adv_tracks, 1, size, dev->f) != size) + fatal("mfm_load(): Error reading advanced tracks\n"); } else { dev->tracks = (mfm_track_t *) malloc(dev->total_tracks * sizeof(mfm_track_t)); - fread(dev->tracks, 1, dev->total_tracks * sizeof(mfm_track_t), dev->f); + size = dev->total_tracks * sizeof(mfm_track_t); + if (fread(dev->tracks, 1, size, dev->f) != size) + fatal("mfm_load(): Error reading tracks\n"); } /* The chances of finding a HxC MFM image of a single-sided thin track diff --git a/src/floppy/fdd_td0.c b/src/floppy/fdd_td0.c index 6762f78f5..2326b2aa4 100644 --- a/src/floppy/fdd_td0.c +++ b/src/floppy/fdd_td0.c @@ -262,7 +262,8 @@ state_data_read(td0dsk_t *state, uint8_t *buf, uint16_t size) size = (image_size - state->fdd_file_offset) & 0xffff; if (fseek(state->fdd_file, state->fdd_file_offset, SEEK_SET) == -1) fatal("TD0: Failed to seek in state_data_read()\n"); - fread(buf, 1, size, state->fdd_file); + if (fread(buf, 1, size, state->fdd_file) != size) + fatal("TD0: Error reading data in state_data_read()\n"); state->fdd_file_offset += size; return(size); diff --git a/src/floppy/fdi2raw.c b/src/floppy/fdi2raw.c index 03ddf460f..feb597ef9 100644 --- a/src/floppy/fdi2raw.c +++ b/src/floppy/fdi2raw.c @@ -2137,8 +2137,10 @@ int fdi2raw_loadtrack (FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int trac fdi->err = 0; fdi->track_src_len = fdi->track_offsets[track + 1] - fdi->track_offsets[track]; - fseek (fdi->file, fdi->track_offsets[track], SEEK_SET); - fread (fdi->track_src_buffer, fdi->track_src_len, 1, fdi->file); + if (fseek (fdi->file, fdi->track_offsets[track], SEEK_SET) == -1) + fatal("fdi2raw_loadtrack(): Error seeking to the beginning of the file\n"); + if (fread (fdi->track_src_buffer, 1, fdi->track_src_len, fdi->file) != fdi->track_src_len) + fatal("fdi2raw_loadtrack(): Error reading data\n"); memset (fdi->track_dst_buffer, 0, MAX_DST_BUFFER); fdi->track_dst_buffer_timing[0] = 0; @@ -2177,7 +2179,7 @@ int fdi2raw_loadtrack (FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int trac zxx (fdi); outlen = -1; - } else if (fdi->track_type < 0x10) { + } else if (fdi->track_type < 0x0f) { decode_normal_track[fdi->track_type](fdi); fix_mfm_sync (fdi); diff --git a/src/rom.c b/src/rom.c index cbb43a82b..17c31e3ba 100644 --- a/src/rom.c +++ b/src/rom.c @@ -183,8 +183,10 @@ rom_load_linear(wchar_t *fn, uint32_t addr, int sz, int off, uint8_t *ptr) } if (ptr != NULL) { - (void)fseek(f, off, SEEK_SET); - (void)fread(ptr+addr, sz, 1, f); + if (fseek(f, off, SEEK_SET) == -1) + fatal("rom_load_linear(): Error seeking to the beginning of the file\n"); + if (fread(ptr+addr, 1, sz, f) != sz) + fatal("rom_load_linear(): Error reading data\n"); } (void)fclose(f); @@ -221,9 +223,12 @@ rom_load_linear_inverted(wchar_t *fn, uint32_t addr, int sz, int off, uint8_t *p } if (ptr != NULL) { - (void)fseek(f, off, SEEK_SET); - (void)fread(ptr+addr+0x10000, sz >> 1, 1, f); - (void)fread(ptr+addr, sz >> 1, 1, f); + if (fseek(f, off, SEEK_SET) == -1) + fatal("rom_load_linear_inverted(): Error seeking to the beginning of the file\n"); + if (fread(ptr+addr+0x10000, 1, sz >> 1, f) > (sz >> 1)) + fatal("rom_load_linear_inverted(): Error reading the upper half of the data\n"); + if (fread(ptr+addr, sz >> 1, 1, f) > (sz >> 1)) + fatal("rom_load_linear_inverted(): Error reading the lower half of the data\n"); } (void)fclose(f); diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index cbe32f15a..201d597d2 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -450,7 +450,8 @@ scsi_cdrom_mode_sense_load(scsi_cdrom_t *dev) swprintf(file_name, 512, L"cdrom_%02i_mode_sense_bin", dev->id); f = plat_fopen(nvr_path(file_name), L"rb"); if (f) { - fread(dev->ms_pages_saved.pages[GPMODE_CDROM_AUDIO_PAGE], 1, 0x10, f); + if (fread(dev->ms_pages_saved.pages[GPMODE_CDROM_AUDIO_PAGE], 1, 0x10, f) != 0x10) + fatal("scsi_cdrom_mode_sense_load(): Error reading data\n"); fclose(f); } } diff --git a/src/video/vid_ati18800.c b/src/video/vid_ati18800.c index 648772c77..fa4b22044 100644 --- a/src/video/vid_ati18800.c +++ b/src/video/vid_ati18800.c @@ -86,6 +86,7 @@ static void ati18800_out(uint16_t addr, uint8_t val, void *p) { case 0xb0: svga_recalctimings(svga); + break; case 0xb2: case 0xbe: if (ati18800->regs[0xbe] & 8) /*Read/write bank mode*/ diff --git a/src/video/vid_im1024.c b/src/video/vid_im1024.c index 6a297d9ca..00954e2d6 100644 --- a/src/video/vid_im1024.c +++ b/src/video/vid_im1024.c @@ -523,6 +523,10 @@ hndl_poly(pgc_t *pgc) #ifdef ENABLE_IM1024_LOG im1024_log("IM1024: POLY: out of memory\n"); #endif + if (x) + free(x); + if (y) + free(y); return; } diff --git a/src/video/video.c b/src/video/video.c index 35ca81a33..1cbdfdac4 100644 --- a/src/video/video.c +++ b/src/video/video.c @@ -933,11 +933,15 @@ loadfont(wchar_t *s, int format) case 1: /* PC200 */ for (d = 0; d < 4; d++) { /* There are 4 fonts in the ROM */ - for (c = 0; c < 256; c++) /* 8x14 MDA in 8x16 cell */ - fread(&fontdatm[256*d + c][0], 1, 16, f); + for (c = 0; c < 256; c++) { /* 8x14 MDA in 8x16 cell */ + if (fread(&fontdatm[256*d + c][0], 1, 16, f) != 16) + fatal("loadfont(): Error reading 8x16 font in PC200 mode, c = %i\n", c); + } for (c = 0; c < 256; c++) { /* 8x8 CGA in 8x16 cell */ - fread(&fontdat[256*d + c][0], 1, 8, f); - fseek(f, 8, SEEK_CUR); + if (fread(&fontdat[256*d + c][0], 1, 8, f) != 8) + fatal("loadfont(): Error reading 8x8 font in PC200 mode, c = %i\n", c); + if (fseek(f, 8, SEEK_CUR) == -1) + fatal("loadfont(): Error seeking in PC200 mode, c = %i\n", c); } } break; @@ -1015,7 +1019,7 @@ loadfont(wchar_t *s, int format) /* The second 4k holds an 8x16 font */ for (c = 0; c < 256; c++) { if (fread(&fontdatm[c][0], 1, 16, f) != 16) - fatal("loadfont(): Error reading font file in Sigma Coloar 400 mdoe, c = %i\n", c); + fatal("loadfont(): Error reading 8x16 font in Sigma Color 400 mode, c = %i\n", c); } break;