From 329d32a8ddf5711c8be4701e60ec2934fd4a6879 Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Mon, 17 Apr 2006 10:45:32 +0000 Subject: [PATCH] Fix some issues with mounting floppy images with invalid bootsector. Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2602 --- src/dos/dos_programs.cpp | 39 ++++++++++++++++++++++----------------- src/dos/drive_fat.cpp | 16 ++++++++-------- src/dos/drive_local.cpp | 6 +++--- src/dos/drives.h | 7 ++++--- 4 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/dos/dos_programs.cpp b/src/dos/dos_programs.cpp index c3b21ee6..b9ca13be 100644 --- a/src/dos/dos_programs.cpp +++ b/src/dos/dos_programs.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dos_programs.cpp,v 1.57 2006-04-07 15:15:45 qbix79 Exp $ */ +/* $Id: dos_programs.cpp,v 1.58 2006-04-17 10:45:32 qbix79 Exp $ */ #include #include @@ -54,22 +54,22 @@ public: /* Check for unmounting */ if (cmd->FindString("-u",umount,false)) { umount[0] = toupper(umount[0]); - int drive = umount[0]-'A'; - if(drive < DOS_DRIVES && Drives[drive]) { - if(drive == DOS_GetDefaultDrive()) { + int i_drive = umount[0]-'A'; + if(i_drive < DOS_DRIVES && Drives[i_drive]) { + if(i_drive == DOS_GetDefaultDrive()) { WriteOut(MSG_Get("PROGRAM_MOUNT_UMOUNT_CURRENT")); return; } try { /* Check if virtualdrive */ - if( dynamic_cast(Drives[drive]) == 0 ) throw 0; + if( dynamic_cast(Drives[i_drive]) == 0 ) throw 0; } catch(...) { WriteOut(MSG_Get("PROGRAM_MOUNT_UMOUNT_NO_VIRTUAL")); return; } WriteOut(MSG_Get("PROGRAM_MOUNT_UMOUNT_SUCCES"),umount[0]); - delete Drives[drive]; - Drives[drive] = 0; + delete Drives[i_drive]; + Drives[i_drive] = 0; } else { WriteOut(MSG_Get("PROGRAM_MOUNT_UMOUNT_NOT_MOUNTED"),umount[0]); } @@ -331,7 +331,8 @@ public: } /* Test for and show free EMS */ Bit16u handle; - if (DOS_OpenFile("EMMXXXX0",0,&handle)) { + char emm[9] = { 'E','M','M','X','X','X','X','0',0 }; + if (DOS_OpenFile(emm,0,&handle)) { DOS_CloseFile(handle); reg_ah=0x42; CALLBACK_RunRealInt(0x67); @@ -714,8 +715,8 @@ public: WriteOut(MSG_Get("PROGRAM_IMGMOUNT_SPECIFY2")); return; } - drive=temp_line[0]-'0'; - if(drive>3) { + drive=temp_line[0]; + if((drive-'0')>3) { WriteOut(MSG_Get("PROGRAM_IMGMOUNT_SPECIFY2")); return; } @@ -739,13 +740,13 @@ public: char tmp[CROSS_LEN]; safe_strncpy(tmp, temp_line.c_str(), CROSS_LEN); - Bit8u drive; - if (!DOS_MakeName(tmp, fullname, &drive) || strncmp(Drives[drive]->GetInfo(),"local directory",15)) { + Bit8u dummy; + if (!DOS_MakeName(tmp, fullname, &dummy) || strncmp(Drives[dummy]->GetInfo(),"local directory",15)) { WriteOut(MSG_Get("PROGRAM_IMGMOUNG_FILE_NOT_FOUND")); return; } - localDrive *ldp = (localDrive*)Drives[drive]; + localDrive *ldp = (localDrive*)Drives[dummy]; ldp->GetSystemFilename(tmp, fullname); temp_line = tmp; @@ -762,6 +763,10 @@ public: if(fstype=="fat") { newdrive=new fatDrive(temp_line.c_str(),sizes[0],sizes[1],sizes[2],sizes[3],0); + if(!(dynamic_cast(newdrive))->created_succesfully) { + delete newdrive; + newdrive = 0; + } } else if (fstype=="iso") { int error; MSCDEX_SetCDInterface(CDROM_USE_SDL, -1); @@ -798,7 +803,7 @@ public: if (newdrive) delete newdrive; return; } - if (!newdrive) WriteOut(MSG_Get("PROGRAM_IMGMOUNT_CANT_CREATE")); + if (!newdrive) {WriteOut(MSG_Get("PROGRAM_IMGMOUNT_CANT_CREATE"));return;} Drives[drive-'A']=newdrive; // Set the correct media byte in the table mem_writeb(Real2Phys(dos.tables.mediaid)+(drive-'A')*2,mediaid); @@ -830,10 +835,10 @@ public: mem_writeb(Real2Phys(dos.tables.mediaid)+(drive-'A')*2,mediaid); WriteOut(MSG_Get("PROGRAM_MOUNT_STATUS_2"),drive,temp_line.c_str()); } else if (fstype=="none") { - if(imageDiskList[drive] != NULL) delete imageDiskList[drive]; - imageDiskList[drive] = newImage; + if(imageDiskList[drive-'0'] != NULL) delete imageDiskList[drive-'0']; + imageDiskList[drive-'0'] = newImage; updateDPT(); - WriteOut(MSG_Get("PROGRAM_IMGMOUNT_MOUNT_NUMBER"),drive,temp_line.c_str()); + WriteOut(MSG_Get("PROGRAM_IMGMOUNT_MOUNT_NUMBER"),drive-'0',temp_line.c_str()); } // check if volume label is given diff --git a/src/dos/drive_fat.cpp b/src/dos/drive_fat.cpp index 19a50b0a..54a6b4d2 100644 --- a/src/dos/drive_fat.cpp +++ b/src/dos/drive_fat.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: drive_fat.cpp,v 1.12 2006-02-20 08:59:52 qbix79 Exp $ */ +/* $Id: drive_fat.cpp,v 1.13 2006-04-17 10:45:32 qbix79 Exp $ */ #include #include @@ -582,6 +582,7 @@ bool fatDrive::allocateCluster(Bit32u useCluster, Bit32u prevCluster) { } fatDrive::fatDrive(const char *sysFilename, Bit32u bytesector, Bit32u cylsector, Bit32u headscyl, Bit32u cylinders, Bit32u startSector) { + created_succesfully = true; FILE *diskfile; Bit32u filesize; struct partTable mbrData; @@ -593,14 +594,14 @@ fatDrive::fatDrive(const char *sysFilename, Bit32u bytesector, Bit32u cylsector, } diskfile = fopen(sysFilename, "rb+"); - if(!diskfile) return; + if(!diskfile) {created_succesfully = false;return;} fseek(diskfile, 0L, SEEK_END); filesize = (Bit32u)ftell(diskfile) / 1024L; - /* Load disk image */ + /* Load disk image */ loadedDisk = new imageDisk(diskfile, (Bit8u *)sysFilename, filesize, (filesize > 2880)); if(!loadedDisk) { - delete this; + created_succesfully = false; return; } @@ -629,13 +630,12 @@ fatDrive::fatDrive(const char *sysFilename, Bit32u bytesector, Bit32u cylsector, loadedDisk->Read_AbsoluteSector(0+partSectOff,&bootbuffer); if ((bootbuffer.magic1 != 0x55) || (bootbuffer.magic2 != 0xaa)) { /* Not a FAT filesystem */ - delete this; - return; + LOG_MSG("Loaded image has no valid magicnumbers at the end!"); } if(!bootbuffer.sectorsperfat) { /* FAT32 not implemented yet */ - delete this; + created_succesfully = false; return; } @@ -673,7 +673,7 @@ fatDrive::fatDrive(const char *sysFilename, Bit32u bytesector, Bit32u cylsector, cwdDirCluster = 0; memset(fatSectBuffer,0,1024); - curFatSect = 0xffffffff; + curFatSect = 0xffffffff; } bool fatDrive::AllocationInfo(Bit16u *_bytes_sector, Bit8u *_sectors_cluster, Bit16u *_total_clusters, Bit16u *_free_clusters) { diff --git a/src/dos/drive_local.cpp b/src/dos/drive_local.cpp index 6ea92f08..cca4e2bf 100644 --- a/src/dos/drive_local.cpp +++ b/src/dos/drive_local.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: drive_local.cpp,v 1.65 2006-04-16 14:04:03 qbix79 Exp $ */ +/* $Id: drive_local.cpp,v 1.66 2006-04-17 10:45:30 qbix79 Exp $ */ #include #include @@ -114,7 +114,7 @@ bool localDrive::FileOpen(DOS_File * * file,char * name,Bit32u flags) { return true; }; -FILE * localDrive::GetSystemFilePtr(char * name, char * type) { +FILE * localDrive::GetSystemFilePtr(char const * const name, char const * const type) { char newname[CROSS_LEN]; strcpy(newname,basedir); @@ -125,7 +125,7 @@ FILE * localDrive::GetSystemFilePtr(char * name, char * type) { return fopen(newname,type); } -bool localDrive::GetSystemFilename(char *sysName, char *dosName) { +bool localDrive::GetSystemFilename(char *sysName, char const * const dosName) { strcpy(sysName, basedir); strcat(sysName, dosName); diff --git a/src/dos/drives.h b/src/dos/drives.h index 2c65ff1d..30503d1e 100644 --- a/src/dos/drives.h +++ b/src/dos/drives.h @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: drives.h,v 1.31 2006-02-12 13:32:30 qbix79 Exp $ */ +/* $Id: drives.h,v 1.32 2006-04-17 10:45:32 qbix79 Exp $ */ #ifndef _DRIVES_H__ #define _DRIVES_H__ @@ -33,8 +33,8 @@ class localDrive : public DOS_Drive { public: localDrive(const char * startdir,Bit16u _bytes_sector,Bit8u _sectors_cluster,Bit16u _total_clusters,Bit16u _free_clusters,Bit8u _mediaid); virtual bool FileOpen(DOS_File * * file,char * name,Bit32u flags); - virtual FILE *GetSystemFilePtr(char * name, char * type); - virtual bool GetSystemFilename(char *sysName, char *dosName); + virtual FILE *GetSystemFilePtr(char const * const name, char const * const type); + virtual bool GetSystemFilename(char* sysName, char const * const dosName); virtual bool FileCreate(DOS_File * * file,char * name,Bit16u attributes); virtual bool FileUnlink(char * name); virtual bool RemoveDir(char * dir); @@ -153,6 +153,7 @@ public: bool directoryBrowse(Bit32u dirClustNumber, direntry *useEntry, Bit32s entNum); bool directoryChange(Bit32u dirClustNumber, direntry *useEntry, Bit32s entNum); imageDisk *loadedDisk; + bool created_succesfully; private: Bit32u getClusterValue(Bit32u clustNum); void setClusterValue(Bit32u clustNum, Bit32u clustValue);