Use shared_ptr to prevent double free on imageDisk
Also, replacing unique_ptr with shared_ptr makes it unnecessary to move a pointer when swapping boot disks; moving shared_ptr would lead to inconsistent internal state. Fixes: #94
This commit is contained in:
parent
70a1f9f0d1
commit
5f282f6015
4 changed files with 23 additions and 42 deletions
|
@ -81,8 +81,8 @@ void incrementFDD(void);
|
|||
|
||||
#define MAX_DISK_IMAGES (2 + MAX_HDD_IMAGES)
|
||||
|
||||
extern std::array<std::unique_ptr<imageDisk>, MAX_DISK_IMAGES> imageDiskList;
|
||||
extern std::array<std::unique_ptr<imageDisk>, MAX_SWAPPABLE_DISKS> diskSwap;
|
||||
extern std::array<std::shared_ptr<imageDisk>, MAX_DISK_IMAGES> imageDiskList;
|
||||
extern std::array<std::shared_ptr<imageDisk>, MAX_SWAPPABLE_DISKS> diskSwap;
|
||||
|
||||
extern Bit32s swapPosition;
|
||||
extern Bit16u imgDTASeg; /* Real memory location of temporary DTA pointer for fat image disk access */
|
||||
|
|
|
@ -83,7 +83,7 @@ static const char* UnmountHelper(char umount) {
|
|||
}
|
||||
|
||||
if (i_drive < MAX_DISK_IMAGES && imageDiskList[i_drive]) {
|
||||
imageDiskList[i_drive].reset(nullptr);
|
||||
imageDiskList[i_drive].reset();
|
||||
}
|
||||
|
||||
return MSG_Get("PROGRAM_MOUNT_UMOUNT_SUCCESS");
|
||||
|
@ -718,9 +718,8 @@ public:
|
|||
} else {
|
||||
WriteOut(MSG_Get("PROGRAM_BOOT_CART_NO_CMDS"));
|
||||
}
|
||||
for(Bitu dct=0;dct<MAX_SWAPPABLE_DISKS;dct++) {
|
||||
diskSwap[dct].reset(nullptr);
|
||||
}
|
||||
for (auto &disk : diskSwap)
|
||||
disk.reset();
|
||||
//fclose(usefile_1); //delete diskSwap closes the file
|
||||
return;
|
||||
} else {
|
||||
|
@ -747,9 +746,8 @@ public:
|
|||
} else {
|
||||
WriteOut(MSG_Get("PROGRAM_BOOT_CART_NO_CMDS"));
|
||||
}
|
||||
for(Bitu dct=0;dct<MAX_SWAPPABLE_DISKS;dct++) {
|
||||
diskSwap[dct].reset(nullptr);
|
||||
}
|
||||
for (auto &disk : diskSwap)
|
||||
disk.reset();
|
||||
//fclose(usefile_1); //Delete diskSwap closes the file
|
||||
return;
|
||||
}
|
||||
|
@ -800,10 +798,8 @@ public:
|
|||
for(i=0;i<rombytesize_1-0x200;i++) phys_writeb((romseg<<4)+i,rombuf[i]);
|
||||
|
||||
//Close cardridges
|
||||
for(Bitu dct=0;dct<MAX_SWAPPABLE_DISKS;dct++) {
|
||||
diskSwap[dct].reset(nullptr);
|
||||
}
|
||||
|
||||
for (auto &disk : diskSwap)
|
||||
disk.reset();
|
||||
|
||||
if (cart_cmd=="") {
|
||||
Bit32u old_int18=mem_readd(0x60);
|
||||
|
@ -1383,21 +1379,11 @@ public:
|
|||
WriteOut(MSG_Get("PROGRAM_MOUNT_STATUS_2"), drive, tmp.c_str());
|
||||
|
||||
if (paths.size() == 1) {
|
||||
DOS_Drive * newdrive = imgDisks[0];
|
||||
switch (drive - 'A') {
|
||||
case 0:
|
||||
case 1:
|
||||
if (!((fatDrive *)newdrive)->loadedDisk->hardDrive) {
|
||||
imageDiskList[drive - 'A'].reset(((fatDrive *)newdrive)->loadedDisk.get());
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
if (((fatDrive *)newdrive)->loadedDisk->hardDrive) {
|
||||
imageDiskList[drive - 'A'].reset(((fatDrive *)newdrive)->loadedDisk.get());
|
||||
updateDPT();
|
||||
}
|
||||
break;
|
||||
auto *newdrive = static_cast<fatDrive*>(imgDisks[0]);
|
||||
if ('A' <= drive && drive <= 'D' && !(newdrive->loadedDisk->hardDrive)) {
|
||||
const size_t idx = drive - 'A';
|
||||
imageDiskList[idx] = newdrive->loadedDisk;
|
||||
updateDPT();
|
||||
}
|
||||
}
|
||||
} else if (fstype=="iso") {
|
||||
|
|
|
@ -185,7 +185,7 @@ public:
|
|||
Bit32u getFirstFreeClust(void);
|
||||
bool directoryBrowse(Bit32u dirClustNumber, direntry *useEntry, Bit32s entNum, Bit32s start=0);
|
||||
bool directoryChange(Bit32u dirClustNumber, direntry *useEntry, Bit32s entNum);
|
||||
std::unique_ptr<imageDisk> loadedDisk;
|
||||
std::shared_ptr<imageDisk> loadedDisk;
|
||||
bool created_successfully;
|
||||
private:
|
||||
Bit32u getClusterValue(Bit32u clustNum);
|
||||
|
|
|
@ -56,8 +56,8 @@ static bool swapping_requested;
|
|||
void CMOS_SetRegister(Bitu regNr, Bit8u val); //For setting equipment word
|
||||
|
||||
/* 2 floppys and 2 harddrives, max */
|
||||
std::array<std::unique_ptr<imageDisk>, MAX_DISK_IMAGES> imageDiskList;
|
||||
std::array<std::unique_ptr<imageDisk>, MAX_SWAPPABLE_DISKS> diskSwap;
|
||||
std::array<std::shared_ptr<imageDisk>, MAX_DISK_IMAGES> imageDiskList;
|
||||
std::array<std::shared_ptr<imageDisk>, MAX_SWAPPABLE_DISKS> diskSwap;
|
||||
Bit32s swapPosition;
|
||||
|
||||
void updateDPT(void) {
|
||||
|
@ -120,7 +120,7 @@ void swapInDisks(void) {
|
|||
while(diskcount<2) {
|
||||
if(diskSwap[swapPos]) {
|
||||
LOG_MSG("Loaded disk %d from swaplist position %d - \"%s\"", diskcount, swapPos, diskSwap[swapPos]->diskname);
|
||||
imageDiskList[diskcount] = std::move(diskSwap[swapPos]);
|
||||
imageDiskList[diskcount] = diskSwap[swapPos];
|
||||
diskcount++;
|
||||
}
|
||||
swapPos++;
|
||||
|
@ -572,15 +572,10 @@ void BIOS_SetupDisks(void) {
|
|||
call_int13=CALLBACK_Allocate();
|
||||
CALLBACK_Setup(call_int13,&INT13_DiskHandler,CB_INT13,"Int 13 Bios disk");
|
||||
RealSetVec(0x13,CALLBACK_RealPointer(call_int13));
|
||||
int i;
|
||||
for(i=0;i<4;i++) {
|
||||
imageDiskList[i].reset(nullptr);
|
||||
}
|
||||
|
||||
for(i=0;i<MAX_SWAPPABLE_DISKS;i++) {
|
||||
diskSwap[i].reset(nullptr);
|
||||
}
|
||||
|
||||
for (auto &disk : imageDiskList)
|
||||
disk.reset();
|
||||
for (auto &disk : diskSwap)
|
||||
disk.reset();
|
||||
diskparm0 = CALLBACK_Allocate();
|
||||
diskparm1 = CALLBACK_Allocate();
|
||||
swapPosition = 0;
|
||||
|
@ -590,7 +585,7 @@ void BIOS_SetupDisks(void) {
|
|||
|
||||
PhysPt dp0physaddr=CALLBACK_PhysPointer(diskparm0);
|
||||
PhysPt dp1physaddr=CALLBACK_PhysPointer(diskparm1);
|
||||
for(i=0;i<16;i++) {
|
||||
for (int i = 0; i < 16; i++) {
|
||||
phys_writeb(dp0physaddr+i,0);
|
||||
phys_writeb(dp1physaddr+i,0);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue