Fixed mode sense loading mess (that was messing up the heap and destabilizing the emulator) in the ZIP, CD-ROM, and SCSI disk code.
This commit is contained in:
@@ -9,7 +9,7 @@
|
|||||||
* Implementation of the Iomega ZIP drive with SCSI(-like)
|
* Implementation of the Iomega ZIP drive with SCSI(-like)
|
||||||
* commands, for both ATAPI and SCSI usage.
|
* commands, for both ATAPI and SCSI usage.
|
||||||
*
|
*
|
||||||
* Version: @(#)zip.c 1.0.33 2018/10/26
|
* Version: @(#)zip.c 1.0.34 2018/10/27
|
||||||
*
|
*
|
||||||
* Author: Miran Grca, <mgrca8@gmail.com>
|
* Author: Miran Grca, <mgrca8@gmail.com>
|
||||||
*
|
*
|
||||||
@@ -561,11 +561,20 @@ zip_disk_reload(zip_t *dev)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
zip_disk_close(zip_t *dev)
|
zip_disk_unload(zip_t *dev)
|
||||||
{
|
{
|
||||||
if (dev->drv->f) {
|
if (dev->drv->f) {
|
||||||
fclose(dev->drv->f);
|
fclose(dev->drv->f);
|
||||||
dev->drv->f = NULL;
|
dev->drv->f = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
zip_disk_close(zip_t *dev)
|
||||||
|
{
|
||||||
|
if (dev->drv->f) {
|
||||||
|
zip_disk_unload(dev);
|
||||||
|
|
||||||
memcpy(dev->drv->prev_image_path, dev->drv->image_path, sizeof(dev->drv->prev_image_path));
|
memcpy(dev->drv->prev_image_path, dev->drv->image_path, sizeof(dev->drv->prev_image_path));
|
||||||
memset(dev->drv->image_path, 0, sizeof(dev->drv->image_path));
|
memset(dev->drv->image_path, 0, sizeof(dev->drv->image_path));
|
||||||
@@ -698,36 +707,20 @@ zip_mode_sense_load(zip_t *dev)
|
|||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
wchar_t file_name[512];
|
wchar_t file_name[512];
|
||||||
int i;
|
|
||||||
|
|
||||||
memset(&dev->ms_pages_saved, 0, sizeof(mode_sense_pages_t));
|
memset(&dev->ms_pages_saved, 0, sizeof(mode_sense_pages_t));
|
||||||
for (i = 0; i < 0x3f; i++) {
|
|
||||||
if (dev->drv->is_250) {
|
if (dev->drv->is_250) {
|
||||||
if (zip_250_mode_sense_pages_default.pages[i][1] != 0) {
|
if (zip_drives[dev->id].bus_type == ZIP_BUS_SCSI)
|
||||||
if (zip_drives[dev->id].bus_type == ZIP_BUS_SCSI) {
|
memcpy(&dev->ms_pages_saved, &zip_250_mode_sense_pages_default_scsi, sizeof(mode_sense_pages_t));
|
||||||
memcpy(dev->ms_pages_saved.pages[i],
|
else
|
||||||
zip_250_mode_sense_pages_default_scsi.pages[i],
|
memcpy(&dev->ms_pages_saved, &zip_250_mode_sense_pages_default, sizeof(mode_sense_pages_t));
|
||||||
zip_250_mode_sense_pages_default_scsi.pages[i][1] + 2);
|
|
||||||
} else {
|
} else {
|
||||||
memcpy(dev->ms_pages_saved.pages[i],
|
if (zip_drives[dev->id].bus_type == ZIP_BUS_SCSI)
|
||||||
zip_250_mode_sense_pages_default.pages[i],
|
memcpy(&dev->ms_pages_saved, &zip_mode_sense_pages_default_scsi, sizeof(mode_sense_pages_t));
|
||||||
zip_250_mode_sense_pages_default.pages[i][1] + 2);
|
else
|
||||||
}
|
memcpy(&dev->ms_pages_saved, &zip_mode_sense_pages_default, sizeof(mode_sense_pages_t));
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (zip_mode_sense_pages_default.pages[i][1] != 0) {
|
|
||||||
if (dev->drv->bus_type == ZIP_BUS_SCSI) {
|
|
||||||
memcpy(dev->ms_pages_saved.pages[i],
|
|
||||||
zip_mode_sense_pages_default_scsi.pages[i],
|
|
||||||
zip_mode_sense_pages_default_scsi.pages[i][1] + 2);
|
|
||||||
} else {
|
|
||||||
memcpy(dev->ms_pages_saved.pages[i],
|
|
||||||
zip_mode_sense_pages_default.pages[i],
|
|
||||||
zip_mode_sense_pages_default.pages[i][1] + 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(file_name, 0, 512 * sizeof(wchar_t));
|
memset(file_name, 0, 512 * sizeof(wchar_t));
|
||||||
if (dev->drv->bus_type == ZIP_BUS_SCSI)
|
if (dev->drv->bus_type == ZIP_BUS_SCSI)
|
||||||
swprintf(file_name, 512, L"scsi_zip_%02i_mode_sense_bin", dev->id);
|
swprintf(file_name, 512, L"scsi_zip_%02i_mode_sense_bin", dev->id);
|
||||||
@@ -2815,7 +2808,7 @@ zip_close(void)
|
|||||||
dev = (zip_t *) zip_drives[c].priv;
|
dev = (zip_t *) zip_drives[c].priv;
|
||||||
|
|
||||||
if (dev) {
|
if (dev) {
|
||||||
zip_disk_close(dev);
|
zip_disk_unload(dev);
|
||||||
|
|
||||||
free(dev);
|
free(dev);
|
||||||
zip_drives[c].priv = NULL;
|
zip_drives[c].priv = NULL;
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
* Implementation of the CD-ROM drive with SCSI(-like)
|
* Implementation of the CD-ROM drive with SCSI(-like)
|
||||||
* commands, for both ATAPI and SCSI usage.
|
* commands, for both ATAPI and SCSI usage.
|
||||||
*
|
*
|
||||||
* Version: @(#)scsi_cdrom.c 1.0.62 2018/10/26
|
* Version: @(#)scsi_cdrom.c 1.0.63 2018/10/27
|
||||||
*
|
*
|
||||||
* Author: Miran Grca, <mgrca8@gmail.com>
|
* Author: Miran Grca, <mgrca8@gmail.com>
|
||||||
*
|
*
|
||||||
@@ -477,21 +477,13 @@ scsi_cdrom_mode_sense_load(scsi_cdrom_t *dev)
|
|||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
wchar_t file_name[512];
|
wchar_t file_name[512];
|
||||||
int i;
|
|
||||||
|
|
||||||
memset(&dev->ms_pages_saved, 0, sizeof(mode_sense_pages_t));
|
memset(&dev->ms_pages_saved, 0, sizeof(mode_sense_pages_t));
|
||||||
for (i = 0; i < 0x3f; i++) {
|
|
||||||
if (scsi_cdrom_mode_sense_pages_default.pages[i][1] != 0) {
|
|
||||||
if (dev->drv->bus_type == CDROM_BUS_SCSI)
|
if (dev->drv->bus_type == CDROM_BUS_SCSI)
|
||||||
memcpy(dev->ms_pages_saved.pages[i],
|
memcpy(&dev->ms_pages_saved, &scsi_cdrom_mode_sense_pages_default_scsi, sizeof(mode_sense_pages_t));
|
||||||
scsi_cdrom_mode_sense_pages_default_scsi.pages[i],
|
|
||||||
scsi_cdrom_mode_sense_pages_default_scsi.pages[i][1] + 2);
|
|
||||||
else
|
else
|
||||||
memcpy(dev->ms_pages_saved.pages[i],
|
memcpy(&dev->ms_pages_saved, &scsi_cdrom_mode_sense_pages_default, sizeof(mode_sense_pages_t));
|
||||||
scsi_cdrom_mode_sense_pages_default.pages[i],
|
|
||||||
scsi_cdrom_mode_sense_pages_default.pages[i][1] + 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
memset(file_name, 0, 512 * sizeof(wchar_t));
|
memset(file_name, 0, 512 * sizeof(wchar_t));
|
||||||
if (dev->drv->bus_type == CDROM_BUS_SCSI)
|
if (dev->drv->bus_type == CDROM_BUS_SCSI)
|
||||||
swprintf(file_name, 512, L"scsi_cdrom_%02i_mode_sense_bin", dev->id);
|
swprintf(file_name, 512, L"scsi_cdrom_%02i_mode_sense_bin", dev->id);
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Emulation of SCSI fixed disks.
|
* Emulation of SCSI fixed disks.
|
||||||
*
|
*
|
||||||
* Version: @(#)scsi_disk.c 1.0.26 2018/10/26
|
* Version: @(#)scsi_disk.c 1.0.27 2018/10/27
|
||||||
*
|
*
|
||||||
* Author: Miran Grca, <mgrca8@gmail.com>
|
* Author: Miran Grca, <mgrca8@gmail.com>
|
||||||
*
|
*
|
||||||
@@ -177,14 +177,10 @@ scsi_disk_mode_sense_load(scsi_disk_t *dev)
|
|||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
wchar_t file_name[512];
|
wchar_t file_name[512];
|
||||||
int i;
|
|
||||||
memset(&dev->ms_pages_saved, 0, sizeof(mode_sense_pages_t));
|
memset(&dev->ms_pages_saved, 0, sizeof(mode_sense_pages_t));
|
||||||
for (i = 0; i < 0x3f; i++) {
|
memcpy(&dev->ms_pages_saved, &scsi_disk_mode_sense_pages_default, sizeof(mode_sense_pages_t));
|
||||||
if (scsi_disk_mode_sense_pages_default.pages[i][1] != 0) {
|
|
||||||
memcpy(dev->ms_pages_saved.pages[i], scsi_disk_mode_sense_pages_default.pages[i],
|
|
||||||
scsi_disk_mode_sense_pages_default.pages[i][1] + 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
swprintf(file_name, 512, L"scsi_disk_%02i_mode_sense.bin", dev->id);
|
swprintf(file_name, 512, L"scsi_disk_%02i_mode_sense.bin", dev->id);
|
||||||
memset(file_name, 0, 512 * sizeof(wchar_t));
|
memset(file_name, 0, 512 * sizeof(wchar_t));
|
||||||
f = plat_fopen(nvr_path(file_name), L"rb");
|
f = plat_fopen(nvr_path(file_name), L"rb");
|
||||||
|
Reference in New Issue
Block a user