1
0
Fork 0

Fix unitialized access to some isoDrive fields. Pause audio before switching. Use right subunit with multiple CDs on one driveletter. (krcroft, jmarsh and qbix)

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@4223
This commit is contained in:
Peter Veenstra 2019-05-06 08:37:53 +00:00
parent 2aaa951fd4
commit dfce234cfb
4 changed files with 34 additions and 10 deletions

View file

@ -52,6 +52,7 @@ CDROM_Interface_Image::BinaryFile::BinaryFile(const char *filename, bool &error)
CDROM_Interface_Image::BinaryFile::~BinaryFile()
{
delete file;
file = NULL;
}
bool CDROM_Interface_Image::BinaryFile::read(Bit8u *buffer, int seek, int count)
@ -128,12 +129,13 @@ int CDROM_Interface_Image::AudioFile::getLength()
// initialize static members
int CDROM_Interface_Image::refCount = 0;
CDROM_Interface_Image* CDROM_Interface_Image::images[26];
CDROM_Interface_Image* CDROM_Interface_Image::images[26] = {};
CDROM_Interface_Image::imagePlayer CDROM_Interface_Image::player = {
NULL, NULL, NULL, {0}, 0, 0, 0, false, false, false, {0} };
CDROM_Interface_Image::CDROM_Interface_Image(Bit8u subUnit)
:subUnit(subUnit)
{
images[subUnit] = this;
if (refCount == 0) {
@ -375,6 +377,7 @@ bool CDROM_Interface_Image::LoadIsoFile(char* filename)
track.file = new BinaryFile(filename, error);
if (error) {
delete track.file;
track.file = NULL;
return false;
}
track.number = 1;
@ -544,6 +547,7 @@ bool CDROM_Interface_Image::LoadCueSheet(char *cuefile)
#endif
if (error) {
delete track.file;
track.file = NULL;
success = false;
}
}

View file

@ -407,9 +407,11 @@ bool CMscdex::HasDrive(Bit16u drive) {
}
void CMscdex::ReplaceDrive(CDROM_Interface* newCdrom, Bit8u subUnit) {
delete cdrom[subUnit];
if (cdrom[subUnit] != NULL) {
StopAudio(subUnit);
delete cdrom[subUnit];
}
cdrom[subUnit] = newCdrom;
StopAudio(subUnit);
}
PhysPt CMscdex::GetDefaultBuffer(void) {
@ -1298,6 +1300,11 @@ void MSCDEX_ReplaceDrive(CDROM_Interface* cdrom, Bit8u subUnit)
mscdex->ReplaceDrive(cdrom, subUnit);
}
Bit8u MSCDEX_GetSubUnit(char driveLetter)
{
return mscdex->GetSubUnit(driveLetter-'A');
}
bool MSCDEX_GetVolumeName(Bit8u subUnit, char* name)
{
return mscdex->GetVolumeName(subUnit,name);

View file

@ -133,13 +133,22 @@ Bit16u isoFile::GetInformation(void) {
return 0x40; // read-only drive
}
int MSCDEX_RemoveDrive(char driveLetter);
int MSCDEX_AddDrive(char driveLetter, const char* physicalPath, Bit8u& subUnit);
void MSCDEX_ReplaceDrive(CDROM_Interface* cdrom, Bit8u subUnit);
bool MSCDEX_HasDrive(char driveLetter);
bool MSCDEX_GetVolumeName(Bit8u subUnit, char* name);
int MSCDEX_RemoveDrive(char driveLetter);
int MSCDEX_AddDrive(char driveLetter, const char* physicalPath, Bit8u& subUnit);
void MSCDEX_ReplaceDrive(CDROM_Interface* cdrom, Bit8u subUnit);
bool MSCDEX_HasDrive(char driveLetter);
bool MSCDEX_GetVolumeName(Bit8u subUnit, char* name);
Bit8u MSCDEX_GetSubUnit(char driveLetter);
isoDrive::isoDrive(char driveLetter, const char *fileName, Bit8u mediaid, int &error) {
isoDrive::isoDrive(char driveLetter, const char *fileName, Bit8u mediaid, int &error)
:iso(false),
dataCD(false),
mediaid(0),
fileName{'\0'},
subUnit(0),
driveLetter('\0'),
discLabel{'\0'}
{
nextFreeDirIterator = 0;
memset(dirIterators, 0, sizeof(dirIterators));
memset(sectorHashEntries, 0, sizeof(sectorHashEntries));
@ -174,6 +183,7 @@ isoDrive::~isoDrive() { }
int isoDrive::UpdateMscdex(char driveLetter, const char* path, Bit8u& subUnit) {
if (MSCDEX_HasDrive(driveLetter)) {
subUnit = MSCDEX_GetSubUnit(driveLetter);
CDROM_Interface_Image* oldCdrom = CDROM_Interface_Image::images[subUnit];
CDROM_Interface* cdrom = new CDROM_Interface_Image(subUnit);
char pathCopy[CROSS_LEN];

View file

@ -559,7 +559,10 @@ bool MSCDEX_GetVolumeName(Bit8u subUnit, char* name);
cdromDrive::cdromDrive(const char driveLetter, const char * startdir,Bit16u _bytes_sector,Bit8u _sectors_cluster,Bit16u _total_clusters,Bit16u _free_clusters,Bit8u _mediaid, int& error)
:localDrive(startdir,_bytes_sector,_sectors_cluster,_total_clusters,_free_clusters,_mediaid) {
:localDrive(startdir,_bytes_sector,_sectors_cluster,_total_clusters,_free_clusters,_mediaid),
subUnit(0),
driveLetter('\0')
{
// Init mscdex
error = MSCDEX_AddDrive(driveLetter,startdir,subUnit);
strcpy(info, "CDRom ");