1
0
Fork 0

Fix NULL issues in programs-related code

This commit is contained in:
krcroft 2020-01-18 15:28:53 -08:00 committed by Patryk Obara
parent 3391651323
commit ec52c3ef3d
2 changed files with 117 additions and 77 deletions

View file

@ -21,6 +21,7 @@
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <memory>
#include <string>
#include <vector>
@ -32,7 +33,7 @@
#include "cdrom.h"
#include "dos_system.h"
#include "bios.h"
#include "bios_disk.h"
#include "bios_disk.h"
#include "setup.h"
#include "control.h"
#include "inout.h"
@ -97,7 +98,7 @@ public:
/* remap drives */
Drives[i_newz] = Drives[25];
Drives[25] = 0;
if (!first_shell) return; //Should not be possible
if (!first_shell) return; //Should not be possible
/* Update environment */
std::string line = "";
char ppp[2] = {newz_drive,0};
@ -147,12 +148,12 @@ public:
/* Change 8.3 to 11.0 */
char* dot = strchr(name,'.');
if(dot && (dot - name == 8) ) {
if(dot && (dot - name == 8) ) {
name[8] = name[9];name[9] = name[10];name[10] = name[11];name[11] = 0;
}
root[1] = 0; //This way, the format string can be reused.
WriteOut(MSG_Get("PROGRAM_MOUNT_STATUS_FORMAT"),root, Drives[d]->GetInfo(),name);
WriteOut(MSG_Get("PROGRAM_MOUNT_STATUS_FORMAT"),root, Drives[d]->GetInfo(),name);
}
dos.dta(save_dta);
}
@ -172,7 +173,7 @@ public:
return;
}
/* In secure mode don't allow people to change mount points.
/* In secure mode don't allow people to change mount points.
* Neither mount nor unmount */
if(control->SecureMode()) {
WriteOut(MSG_Get("PROGRAM_CONFIG_SECURE_DISALLOW"));
@ -186,7 +187,7 @@ public:
WriteOut(UnmountHelper(umount[0]), toupper(umount[0]));
return;
}
/* Check for moving Z: */
/* Only allowing moving it once. It is merely a convenience added for the wine team */
if (ZDRIVE_NUM == 25 && cmd->FindString("-z", newz,false)) {
@ -239,7 +240,7 @@ public:
}
str_size=teststr;
}
cmd->FindString("-size",str_size,true);
char number[21] = { 0 };const char * scan = str_size.c_str();
Bitu index = 0;Bitu count = 0;
@ -256,7 +257,7 @@ public:
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;
@ -352,8 +353,8 @@ public:
} else {
/* Give a warning when mount c:\ or the / */
#if defined (WIN32)
if( (temp_line == "c:\\") || (temp_line == "C:\\") ||
(temp_line == "c:/") || (temp_line == "C:/") )
if( (temp_line == "c:\\") || (temp_line == "C:\\") ||
(temp_line == "c:/") || (temp_line == "C:/") )
WriteOut(MSG_Get("PROGRAM_MOUNT_WARNING_WIN"));
#else
if(temp_line == "/") WriteOut(MSG_Get("PROGRAM_MOUNT_WARNING_OTHER"));
@ -369,26 +370,20 @@ public:
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 success
if (newdrive) {
if (o_error) {
if (o_error == 1) WriteOut(MSG_Get("PROGRAM_MOUNT_OVERLAY_MIXED_BASE"));
else if (o_error == 2) WriteOut(MSG_Get("PROGRAM_MOUNT_OVERLAY_SAME_AS_BASE"));
else WriteOut(MSG_Get("PROGRAM_MOUNT_OVERLAY_GENERIC_ERROR"));
delete newdrive;
return;
}
//Copy current directory if not marked as deleted.
if (newdrive->TestDir(ldp->curdir)) {
strcpy(newdrive->curdir,ldp->curdir);
}
delete Drives[drive - 'A'];
Drives[drive - 'A'] = 0;
} else {
WriteOut(MSG_Get("PROGRAM_MOUNT_OVERLAY_GENERIC_ERROR"));
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 file system.");
else WriteOut("Something went wrong");
delete newdrive;
return;
}
//Copy current directory if not marked as deleted.
if (newdrive->TestDir(ldp->curdir)) {
strcpy(newdrive->curdir, ldp->curdir);
}
delete Drives[drive - 'A'];
Drives[drive - 'A'] = 0;
} else {
newdrive = new localDrive(temp_line.c_str(),sizes[0],bit8size,sizes[2],sizes[3],mediaid);
}
@ -397,7 +392,6 @@ public:
WriteOut(MSG_Get("PROGRAM_MOUNT_ILL_TYPE"),type.c_str());
return;
}
if (!newdrive) E_Exit("DOS:Can't create drive");
Drives[drive - 'A'] = newdrive;
/* Set the correct media byte in the table */
mem_writeb(Real2Phys(dos.tables.mediaid) + (drive - 'A') * 9, newdrive->GetMediaByte());
@ -408,7 +402,7 @@ public:
/* For hard drives set the label to DRIVELETTER_Drive.
* For floppy drives set the label to DRIVELETTER_Floppy.
* This way every drive except cdroms should get a label.*/
else if(type == "dir" || type == "overlay") {
else if(type == "dir" || type == "overlay") {
label = drive; label += "_DRIVE";
newdrive->dirCache.SetLabel(label.c_str(),iscdrom,false);
} else if(type == "floppy") {
@ -421,7 +415,7 @@ showusage:
#if defined (WIN32)
WriteOut(MSG_Get("PROGRAM_MOUNT_USAGE"),"d:\\dosprogs","d:\\dosprogs");
#else
WriteOut(MSG_Get("PROGRAM_MOUNT_USAGE"),"~/dosprogs","~/dosprogs");
WriteOut(MSG_Get("PROGRAM_MOUNT_USAGE"),"~/dosprogs","~/dosprogs");
#endif
return;
}
@ -480,7 +474,7 @@ public:
if (!reg_bl) {
WriteOut(MSG_Get("PROGRAM_MEM_EXTEND"),reg_dx);
}
}
}
/* Test for and show free EMS */
Bit16u handle;
char emm[9] = { 'E','M','M','X','X','X','X','0',0 };
@ -503,7 +497,7 @@ extern Bit32u floppytype;
class BOOT : public Program {
private:
FILE *getFSFile_mounted(char const* filename, Bit32u *ksize, Bit32u *bsize, Bit8u *error) {
//if return NULL then put in error the errormessage code if an error was requested
bool tryload = (*error)?true:false;
@ -515,7 +509,7 @@ private:
localDrive* ldp=0;
if (!DOS_MakeName(const_cast<char*>(filename),fullname,&drive)) return NULL;
try {
try {
ldp=dynamic_cast<localDrive*>(Drives[drive]);
if(!ldp) return NULL;
@ -549,7 +543,7 @@ private:
return NULL;
}
}
FILE *getFSFile(char const * filename, Bit32u *ksize, Bit32u *bsize,bool tryload=false) {
Bit8u error = tryload?1:0;
FILE* tmpfile = getFSFile_mounted(filename,ksize,bsize,&error);
@ -598,11 +592,11 @@ private:
}
public:
void Run(void) {
//Hack To allow long commandlines
ChangeToLongCmd();
/* In secure mode don't allow people to boot stuff.
/* In secure mode don't allow people to boot stuff.
* They might try to corrupt the data on it */
if(control->SecureMode()) {
WriteOut(MSG_Get("PROGRAM_CONFIG_SECURE_DISALLOW"));
@ -611,7 +605,7 @@ public:
FILE *usefile_1=NULL;
FILE *usefile_2=NULL;
Bitu i=0;
Bitu i=0;
Bit32u floppysize=0;
Bit32u rombytesize_1=0;
Bit32u rombytesize_2=0;
@ -655,7 +649,7 @@ public:
i++;
continue;
}
if ( i >= MAX_SWAPPABLE_DISKS ) {
return; //TODO give a warning.
}
@ -697,8 +691,11 @@ public:
if (cart_cmd!="") {
/* read cartridge data into buffer */
fseek(usefile_1,0x200L, SEEK_SET);
fread(rombuf, 1, rombytesize_1-0x200, usefile_1);
if (fread(rombuf, 1, rombytesize_1-0x200, usefile_1) < rombytesize_1 - 0x200) {
LOG_MSG("Failed to read sufficient cartridge data");
fclose(usefile_1);
return;
}
char cmdlist[1024];
cmdlist[0]=0;
Bitu ct=6;
@ -766,7 +763,7 @@ public:
FILE *tfile = getFSFile("system.rom", &sz1, &sz2, true);
if (tfile!=NULL) {
fseek(tfile, 0x3000L, SEEK_SET);
Bit32u drd=(Bit32u)fread(rombuf, 1, 0xb000, tfile);
Bit32u drd=(Bit32u) fread(rombuf, 1, 0xb000, tfile);
if (drd==0xb000) {
for(i=0;i<0xb000;i++) phys_writeb(0xf3000+i,rombuf[i]);
}
@ -775,12 +772,22 @@ public:
if (usefile_2!=NULL) {
fseek(usefile_2, 0x0L, SEEK_SET);
fread(rombuf, 1, 0x200, usefile_2);
if (fread(rombuf, 1, 0x200, usefile_2) < 0x200) {
LOG_MSG("Failed to read sufficient ROM data");
fclose(usefile_2);
return;
}
PhysPt romseg_pt=host_readw(&rombuf[0x1ce])<<4;
/* read cartridge data into buffer */
fseek(usefile_2, 0x200L, SEEK_SET);
fread(rombuf, 1, rombytesize_2-0x200, usefile_2);
if (fread(rombuf, 1, rombytesize_2-0x200, usefile_2) < rombytesize_2 - 0x200) {
LOG_MSG("Failed to read sufficient ROM data");
fclose(usefile_2);
return;
}
//fclose(usefile_2); //usefile_2 is in diskSwap structure which should be deleted to close the file
/* write cartridge data into ROM */
@ -788,12 +795,21 @@ public:
}
fseek(usefile_1, 0x0L, SEEK_SET);
fread(rombuf, 1, 0x200, usefile_1);
if (fread(rombuf, 1, 0x200, usefile_1) < 0x200) {
LOG_MSG("Failed to read sufficient cartridge data");
fclose(usefile_1);
return;
}
Bit16u romseg=host_readw(&rombuf[0x1ce]);
/* read cartridge data into buffer */
fseek(usefile_1,0x200L, SEEK_SET);
fread(rombuf, 1, rombytesize_1-0x200, usefile_1);
if (fread(rombuf, 1, rombytesize_1-0x200, usefile_1) < rombytesize_1 - 0x200) {
LOG_MSG("Failed to read sufficient cartridge data");
fclose(usefile_1);
return;
}
//fclose(usefile_1); //usefile_1 is in diskSwap structure which should be deleted to close the file
/* write cartridge data into ROM */
@ -817,7 +833,7 @@ public:
/* boot cartridge (int18) */
SegSet16(cs,RealSeg(new_int18));
reg_ip = RealOff(new_int18);
}
}
} else {
if (cfound_at>0) {
/* run cartridge setup */
@ -982,7 +998,7 @@ public:
memset(&cpu_regs, 0, sizeof(cpu_regs));
memset(&Segs, 0, sizeof(Segs));
SegSet16(cs, 0xf000);
reg_eip = 0xfff0;
}
@ -1005,7 +1021,7 @@ public:
void Run(void);
};
void LOADFIX::Run(void)
void LOADFIX::Run(void)
{
Bit16u commandNr = 1;
Bit16u kb = 64;
@ -1047,15 +1063,15 @@ void LOADFIX::Run(void)
break;
strcat(args,temp_line.c_str());
strcat(args," ");
} while (ok);
} while (ok);
// Use shell to start program
DOS_Shell shell;
shell.Execute(filename,args);
DOS_FreeMemory(segment);
DOS_FreeMemory(segment);
WriteOut(MSG_Get("PROGRAM_LOADFIX_DEALLOC"),kb);
}
} else {
WriteOut(MSG_Get("PROGRAM_LOADFIX_ERROR"),kb);
WriteOut(MSG_Get("PROGRAM_LOADFIX_ERROR"),kb);
}
}
@ -1070,12 +1086,12 @@ public:
void Run(void);
};
void RESCAN::Run(void)
void RESCAN::Run(void)
{
bool all = false;
Bit8u drive = DOS_GetDefaultDrive();
if(cmd->FindCommand(1,temp_line)) {
//-A -All /A /All
if (temp_line.size() >= 2
@ -1116,7 +1132,7 @@ public:
WriteOut(MSG_Get("PROGRAM_INTRO_MOUNT_START"));
#if (WIN32)
WriteOut(MSG_Get("PROGRAM_INTRO_MOUNT_WINDOWS"));
#else
#else
WriteOut(MSG_Get("PROGRAM_INTRO_MOUNT_OTHER"));
#endif
WriteOut(MSG_Get("PROGRAM_INTRO_MOUNT_END"));
@ -1159,7 +1175,7 @@ public:
void Run(void) {
//Hack To allow long commandlines
ChangeToLongCmd();
/* In secure mode don't allow people to change imgmount points.
/* In secure mode don't allow people to change imgmount points.
* Neither mount nor unmount */
if(control->SecureMode()) {
WriteOut(MSG_Get("PROGRAM_CONFIG_SECURE_DISALLOW"));
@ -1191,15 +1207,15 @@ public:
Bit16u sizes[4] = {0};
bool imgsizedetect = false;
std::string str_size = "";
Bit8u mediaid = 0xF8;
if (type == "floppy") {
mediaid = 0xF0;
mediaid = 0xF0;
} else if (type == "iso") {
//str_size="2048,1,65535,0"; // ignored, see drive_iso.cpp (AllocationInfo)
mediaid = 0xF8;
mediaid = 0xF8;
fstype = "iso";
}
@ -1251,10 +1267,10 @@ public:
WriteOut(MSG_Get("PROGRAM_IMGMOUNT_FORMAT_UNSUPPORTED"),fstype.c_str());
return;
}
// find all file parameters, assuming that all option parameters have been removed
while(cmd->FindCommand((unsigned int)(paths.size() + 2), temp_line) && temp_line.size()) {
struct stat test;
if (stat(temp_line.c_str(),&test)) {
//See if it works if the ~ are written out
@ -1296,7 +1312,7 @@ public:
}
if (paths.size() == 0) {
WriteOut(MSG_Get("PROGRAM_IMGMOUNT_SPECIFY_FILE"));
return;
return;
}
if (paths.size() == 1)
temp_line = paths[0];
@ -1340,14 +1356,20 @@ public:
std::vector<DOS_Drive*> imgDisks;
std::vector<std::string>::size_type i;
std::vector<DOS_Drive*>::size_type ct;
for (i = 0; i < paths.size(); i++) {
DOS_Drive* newDrive = new fatDrive(paths[i].c_str(),sizes[0],sizes[1],sizes[2],sizes[3],0);
imgDisks.push_back(newDrive);
if(!(dynamic_cast<fatDrive*>(newDrive))->created_successfully) {
std::unique_ptr<fatDrive> newDrive(
new fatDrive(paths[i].c_str(),sizes[0],sizes[1],sizes[2],sizes[3],0));
if (newDrive->created_successfully) {
imgDisks.push_back(static_cast<DOS_Drive*>(newDrive.release()));
} else {
// Tear-down all prior drives when we hit a problem
WriteOut(MSG_Get("PROGRAM_IMGMOUNT_CANT_CREATE"));
for(ct = 0; ct < imgDisks.size(); ct++) {
delete imgDisks[ct];
for(auto pImgDisk : imgDisks) {
if (pImgDisk) {
delete pImgDisk;
}
}
return;
}
@ -1359,9 +1381,9 @@ public:
}
DriveManager::InitializeDrive(drive - 'A');
// Set the correct media byte in the table
// Set the correct media byte in the table
mem_writeb(Real2Phys(dos.tables.mediaid) + (drive - 'A') * 9, mediaid);
/* Command uses dta so set it to our internal dta */
RealPt save_dta = dos.dta();
dos.dta(dos.tables.tempdta);
@ -1426,10 +1448,10 @@ public:
DriveManager::AppendDisk(drive - 'A', isoDisks[ct]);
}
DriveManager::InitializeDrive(drive - 'A');
// Set the correct media byte in the table
// Set the correct media byte in the table
mem_writeb(Real2Phys(dos.tables.mediaid) + (drive - 'A') * 9, mediaid);
// Print status message (success)
WriteOut(MSG_Get("MSCDEX_SUCCESS"));
std::string tmp(paths[0]);

View file

@ -53,6 +53,11 @@ static std::vector<PROGRAMS_Main*> internal_progs;
void PROGRAMS_MakeFile(char const * const name,PROGRAMS_Main * main) {
Bit8u * comdata=(Bit8u *)malloc(32); //MEM LEAK
if (comdata == nullptr) {
E_Exit("Could not allocate memory for com-file data.");
}
memcpy(comdata,&exe_block,sizeof(exe_block));
comdata[CB_POS]=(Bit8u)(call_program&0xff);
comdata[CB_POS+1]=(Bit8u)((call_program>>8)&0xff);
@ -429,7 +434,7 @@ void CONFIG::Run(void) {
// sanity check
Section* sec = control->GetSection(pvars[0].c_str());
Section* sec2 = control->GetSectionFromProperty(pvars[1].c_str());
if (sec != sec2) {
if (!sec || !sec2 || sec != sec2) {
WriteOut(MSG_Get("PROGRAM_CONFIG_PROPERTY_ERROR"));
}
break;
@ -520,6 +525,10 @@ void CONFIG::Run(void) {
case P_AUTOEXEC_CLEAR: {
Section_line* sec = dynamic_cast <Section_line*>
(control->GetSection(std::string("autoexec")));
if (!sec) {
WriteOut(MSG_Get("PROGRAM_CONFIG_SECTION_ERROR"));
return;
}
sec->data.clear();
break;
}
@ -530,13 +539,22 @@ void CONFIG::Run(void) {
}
Section_line* sec = dynamic_cast <Section_line*>
(control->GetSection(std::string("autoexec")));
for(Bitu i = 0; i < pvars.size(); i++) sec->HandleInputline(pvars[i]);
if (!sec) {
WriteOut(MSG_Get("PROGRAM_CONFIG_SECTION_ERROR"));
return;
}
for(Bitu i = 0; i < pvars.size(); i++) {
sec->HandleInputline(pvars[i]);
}
break;
}
case P_AUTOEXEC_TYPE: {
Section_line* sec = dynamic_cast <Section_line*>
(control->GetSection(std::string("autoexec")));
if (!sec) {
WriteOut(MSG_Get("PROGRAM_CONFIG_SECTION_ERROR"));
return;
}
WriteOut("\n%s",sec->data.c_str());
break;
}