fix from boeckmann (Bernd Böckmann) for Format GitHub issue #1 - format divide by 0 due to kernel function 440D, subfunction 60 returning a zero for logical_sectors_per_fat as initdisk overflows and calculates incorrect value

This commit is contained in:
Kenneth J Davis 2023-12-17 21:01:37 -05:00
parent f1249dcd6f
commit cfdd09963f
No known key found for this signature in database
GPG Key ID: 59D5F216C38F11FD

View File

@ -434,7 +434,7 @@ VOID CalculateFATData(ddt * pddt, ULONG NumSectors, UBYTE FileSystem)
else else
{ /* FAT16/FAT32 */ { /* FAT16/FAT32 */
CLUSTER fatlength, maxcl; CLUSTER fatlength, maxcl;
unsigned long clust, maxclust; unsigned long clust, maxclust, rest;
unsigned fatentpersec; unsigned fatentpersec;
unsigned divisor; unsigned divisor;
@ -458,7 +458,7 @@ VOID CalculateFATData(ddt * pddt, ULONG NumSectors, UBYTE FileSystem)
defbpb->bpb_ndirent = 0; defbpb->bpb_ndirent = 0;
defbpb->bpb_nreserved = 0x20; defbpb->bpb_nreserved = 0x20;
fatdata = NumSectors - 0x20; fatdata = NumSectors - 0x20;
fatentpersec = FLOPPY_SEC_SIZE/4; fatentpersec = FLOPPY_SEC_SIZE/4; /* how many 32bit FAT values fit in a default 512 byte sector */
maxcl = FAT32MAX; maxcl = FAT32MAX;
} }
else else
@ -473,7 +473,7 @@ VOID CalculateFATData(ddt * pddt, ULONG NumSectors, UBYTE FileSystem)
max FAT16 size for FreeDOS = 4,293,984,256 bytes = 4GiB-983,040 */ max FAT16 size for FreeDOS = 4,293,984,256 bytes = 4GiB-983,040 */
if (fatdata > 8386688ul) if (fatdata > 8386688ul)
fatdata = 8386688ul; fatdata = 8386688ul;
fatentpersec = FLOPPY_SEC_SIZE/2; fatentpersec = FLOPPY_SEC_SIZE/2; /* how many 16bit FAT values fit in a default 512 byte sector */
maxcl = FAT16MAX; maxcl = FAT16MAX;
} }
@ -481,9 +481,11 @@ VOID CalculateFATData(ddt * pddt, ULONG NumSectors, UBYTE FileSystem)
do do
{ {
DebugPrintf(("Trying with %d sectors/cluster:\n", defbpb->bpb_nsector)); DebugPrintf(("Trying with %d sectors/cluster:\n", defbpb->bpb_nsector));
divisor = fatentpersec * defbpb->bpb_nsector + NFAT; divisor = fatentpersec * defbpb->bpb_nsector + NFAT; /* # of fat entries per cluster + 2 */
fatlength = (CLUSTER)((fatdata + (2 * defbpb->bpb_nsector + divisor - 1))/ rest = (unsigned)(fatdata % divisor);
divisor); fatlength = (CLUSTER)(fatdata / divisor);
fatlength += (CLUSTER)((2 * defbpb->bpb_nsector + divisor + rest - 1) / divisor);
/* Need to calculate number of clusters, since the unused parts of the /* Need to calculate number of clusters, since the unused parts of the
* FATS and data area together could make up space for an additional, * FATS and data area together could make up space for an additional,
* not really present cluster. */ * not really present cluster. */
@ -562,7 +564,7 @@ void DosDefinePartition(struct DriveParamS *driveParam,
pddt->ddt_driveno = driveParam->driveno; pddt->ddt_driveno = driveParam->driveno;
pddt->ddt_logdriveno = nUnits; pddt->ddt_logdriveno = nUnits;
pddt->ddt_descflags = driveParam->descflags; pddt->ddt_descflags = driveParam->descflags;
/* Turn of LBA if not forced and the partition is within 1023 cyls and of the right type */ /* Turn off LBA if not forced and the partition is within 1023 cyls and of the right type */
/* the FileSystem type was internally converted to LBA_xxxx if a non-LBA partition /* the FileSystem type was internally converted to LBA_xxxx if a non-LBA partition
above cylinder 1023 was found */ above cylinder 1023 was found */
if (!InitKernelConfig.ForceLBA && !ExtLBAForce && !IsLBAPartition(pEntry->FileSystem)) if (!InitKernelConfig.ForceLBA && !ExtLBAForce && !IsLBAPartition(pEntry->FileSystem))
@ -634,7 +636,7 @@ STATIC int LBA_Get_Drive_Parameters(int drive, struct DriveParamS *driveParam)
iregs regs; iregs regs;
struct _bios_LBA_disk_parameterS lba_bios_parameters; struct _bios_LBA_disk_parameterS lba_bios_parameters;
ExtLBAForce = FALSE; ExtLBAForce = InitKernelConfig.ForceLBA;
memset(driveParam, 0, sizeof *driveParam); memset(driveParam, 0, sizeof *driveParam);
drive |= 0x80; drive |= 0x80;