1
0
Fork 0

Add some size checks when accessing Drives[], mostly needed when DOS_DRIVES is not set to 26, make size parsing not go outside the target array.

Let's not try to assign a drive in the switchlist to a too high number.
Don't access imagelist for drives >D when unmounting. 


Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@4239
This commit is contained in:
Peter Veenstra 2019-06-25 06:12:13 +00:00
parent e90de61263
commit ad88f982c0
4 changed files with 52 additions and 31 deletions

View file

@ -75,8 +75,10 @@ void incrementFDD(void);
#define MAX_HDD_IMAGES 2
extern imageDisk *imageDiskList[2 + MAX_HDD_IMAGES];
extern imageDisk *diskSwap[20];
#define MAX_DISK_IMAGES (2 + MAX_HDD_IMAGES)
extern imageDisk *imageDiskList[MAX_DISK_IMAGES];
extern imageDisk *diskSwap[MAX_SWAPPABLE_DISKS];
extern Bit32s swapPosition;
extern Bit16u imgDTASeg; /* Real memory location of temporary DTA pointer for fat image disk access */
extern RealPt imgDTAPtr; /* Real memory location of temporary DTA pointer for fat image disk access */

View file

@ -52,7 +52,7 @@ Bit8u DOS_GetDefaultDrive(void) {
void DOS_SetDefaultDrive(Bit8u drive) {
// if (drive<=DOS_DRIVES && ((drive<2) || Drives[drive])) DOS_SDA(DOS_SDA_SEG,DOS_SDA_OFS).SetDrive(drive);
if (drive<=DOS_DRIVES && ((drive<2) || Drives[drive])) {dos.current_drive = drive; DOS_SDA(DOS_SDA_SEG,DOS_SDA_OFS).SetDrive(drive);}
if (drive<DOS_DRIVES && ((drive<2) || Drives[drive])) {dos.current_drive = drive; DOS_SDA(DOS_SDA_SEG,DOS_SDA_OFS).SetDrive(drive);}
}
bool DOS_MakeName(char const * const name,char * const fullname,Bit8u * drive) {

View file

@ -66,7 +66,13 @@ static const char* UnmountHelper(char umount) {
else
i_drive = umount - '0';
if (i_drive >= DOS_DRIVES || i_drive < 0 || (Drives[i_drive] == NULL && imageDiskList[i_drive] == NULL))
if (i_drive >= DOS_DRIVES || i_drive < 0)
return MSG_Get("PROGRAM_MOUNT_UMOUNT_NOT_MOUNTED");
if (i_drive < MAX_DISK_IMAGES && Drives[i_drive] == NULL && imageDiskList[i_drive] == NULL)
return MSG_Get("PROGRAM_MOUNT_UMOUNT_NOT_MOUNTED");
if (i_drive >= MAX_DISK_IMAGES && Drives[i_drive] == NULL)
return MSG_Get("PROGRAM_MOUNT_UMOUNT_NOT_MOUNTED");
if (Drives[i_drive]) {
@ -82,7 +88,7 @@ static const char* UnmountHelper(char umount) {
}
if (imageDiskList[i_drive]) {
if (i_drive < MAX_DISK_IMAGES && imageDiskList[i_drive]) {
delete imageDiskList[i_drive];
imageDiskList[i_drive] = NULL;
}
@ -245,23 +251,29 @@ public:
}
cmd->FindString("-size",str_size,true);
char number[20];const char * scan=str_size.c_str();
Bitu index=0;Bitu count=0;
char number[21] = { 0 };const char * scan = str_size.c_str();
Bitu index = 0;Bitu count = 0;
/* Parse the str_size string */
while (*scan) {
while (*scan && index < 20 && count < 4) {
if (*scan==',') {
number[index]=0;sizes[count++]=atoi(number);
index=0;
} else number[index++]=*scan;
number[index] = 0;
sizes[count++] = atoi(number);
index = 0;
} else number[index++] = *scan;
scan++;
}
number[index]=0;sizes[count++]=atoi(number);
if (count < 4) {
number[index] = 0; //always goes correct as index is max 20 at this point.
sizes[count] = atoi(number);
}
// get the drive letter
cmd->FindCommand(1,temp_line);
if ((temp_line.size() > 2) || ((temp_line.size()>1) && (temp_line[1]!=':'))) goto showusage;
drive=toupper(temp_line[0]);
if (!isalpha(drive)) goto showusage;
int i_drive = toupper(temp_line[0]);
if (!isalpha(i_drive)) goto showusage;
if ((i_drive - 'A') >= DOS_DRIVES || (i_drive-'A') < 0 ) goto showusage;
drive = static_cast<char>(i_drive);
if (!cmd->FindCommand(2,temp_line)) goto showusage;
if (!temp_line.size()) goto showusage;
@ -407,11 +419,11 @@ public:
std::string base = ldp->getBasedir();
Bit8u o_error = 0;
newdrive = new Overlay_Drive(base.c_str(),temp_line.c_str(),sizes[0],bit8size,sizes[2],sizes[3],mediaid,o_error);
//Erase old drive on succes
//Erase old drive on success
if (newdrive) {
if (o_error) {
if (o_error == 1) WriteOut("No mixing of relative and absolute paths. Overlay failed.");
else if (o_error == 2) WriteOut("overlay directory can not be the same as underlying filesystem.");
else if (o_error == 2) WriteOut("overlay directory can not be the same as underlying file system.");
else WriteOut("Something went wrong");
delete newdrive;
return;
@ -693,7 +705,10 @@ public:
i++;
continue;
}
if ( i >= MAX_SWAPPABLE_DISKS ) {
return; //TODO give a warning.
}
WriteOut(MSG_Get("PROGRAM_BOOT_IMAGE_OPEN"), temp_line.c_str());
Bit32u rombytesize;
FILE *usefile = getFSFile(temp_line.c_str(), &floppysize, &rombytesize);
@ -1190,18 +1205,21 @@ public:
if ((type=="hdd") && (str_size.size()==0)) {
imgsizedetect=true;
} else {
char number[20];
const char * scan=str_size.c_str();
Bitu index=0;Bitu count=0;
while (*scan) {
char number[21] = { 0 };const char * scan = str_size.c_str();
Bitu index = 0;Bitu count = 0;
/* Parse the str_size string */
while (*scan && index < 20 && count < 4) {
if (*scan==',') {
number[index]=0;sizes[count++]=atoi(number);
index=0;
} else number[index++]=*scan;
number[index] = 0;
sizes[count++] = atoi(number);
index = 0;
} else number[index++] = *scan;
scan++;
}
number[index]=0;sizes[count++]=atoi(number);
if (count < 4) {
number[index] = 0; //always goes correct as index is max 20 at this point.
sizes[count] = atoi(number);
}
}
if(fstype=="fat" || fstype=="iso") {
@ -1210,11 +1228,12 @@ public:
WriteOut_NoParsing(MSG_Get("PROGRAM_IMGMOUNT_SPECIFY_DRIVE"));
return;
}
drive=toupper(temp_line[0]);
if (!isalpha(drive)) {
int i_drive = toupper(temp_line[0]);
if (!isalpha(drive) || (i_drive - 'A') >= DOS_DRIVES || (i_drive - 'A') <0) {
WriteOut_NoParsing(MSG_Get("PROGRAM_IMGMOUNT_SPECIFY_DRIVE"));
return;
}
drive = static_cast<char>(i_drive);
} else if (fstype=="none") {
cmd->FindCommand(1,temp_line);
if ((temp_line.size() > 1) || (!isdigit(temp_line[0]))) {
@ -1222,7 +1241,7 @@ public:
return;
}
drive=temp_line[0];
if ((drive<'0') || (drive>3+'0')) {
if ((drive<'0') || (drive>=(MAX_DISK_IMAGES+'0'))) {
WriteOut_NoParsing(MSG_Get("PROGRAM_IMGMOUNT_SPECIFY2"));
return;
}
@ -1452,7 +1471,7 @@ public:
WriteOut(MSG_Get("PROGRAM_IMGMOUNT_MOUNT_NUMBER"),drive-'0',temp_line.c_str());
}
// check if volume label is given. becareful for cdrom
// check if volume label is given. be careful for cdrom
//if (cmd->FindString("-label",label,true)) newdrive->dirCache.SetLabel(label.c_str());
return;
}

View file

@ -27,7 +27,7 @@
#include "../dos/drives.h"
#include "mapper.h"
#define MAX_DISK_IMAGES 4
diskGeo DiskGeometryList[] = {
{ 160, 8, 1, 40, 0},