Context Navigation


Changeset 322


Ignore:
Timestamp:
Oct 5, 2017, 9:56:14 AM (8 years ago)
Author:
Valery V. Sedletski
Message:

fat32.ifs: Fix hangs and traps with removable media.

  • Application (FC/2) hanged when changing CD's. There was a hang when updating FSInfo on unmount, or when reading a volume label, while a CD was already removed.
  • Trap 000d when changing floppies.
Location:
trunk/src/ifs
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/ifs/fat32a.c

    r317 r322
    15621562 if (ulCluster == 1)
    15631563 // reading root directory on FAT12/FAT16
    1564 (削除) (削除ここまで)ReadSector(pVolInfo, ulSector + ulBlock * usSectorsPerBlock, usSectorsPerBlock, (void *)pDirStart, 0);
    1564 (追記) rc = (追記ここまで)ReadSector(pVolInfo, ulSector + ulBlock * usSectorsPerBlock, usSectorsPerBlock, (void *)pDirStart, 0);
    15651565 else
    1566 ReadBlock(pVolInfo, ulCluster, ulBlock, pDirStart, 0);
    1566 rc = ReadBlock(pVolInfo, ulCluster, ulBlock, pDirStart, 0);
    1567 if (rc)
    1568 {
    1569 free(pDirEntry);
    1570 return rc;
    1571 }
    15671572 pDir = pDirStart;
    15681573 pDirEnd = (PDIRENTRY)((PBYTE)pDirStart + pVolInfo->ulBlockSize);
    17101715 else
    17111716 rc = WriteBlock(pVolInfo, ulCluster, ulBlock, (PBYTE)pDirStart, DVIO_OPWRTHRU);
    1717(追記) if (rc) (追記ここまで)
    1718(追記) { (追記ここまで)
    1719(追記) free(pDirEntry); (追記ここまで)
    1720(追記) free(pDirStart); (追記ここまで)
    1721(追記) return rc; (追記ここまで)
    1722(追記) } (追記ここまで)
    17121723 }
    17131724 else
    17331744 memcpy(pBootSect->VolumeLabel, pDirEntry->bFileName, 11);
    17341745 rc = WriteSector(pVolInfo, 0L, 1, (PBYTE)pBootSect, DVIO_OPWRTHRU | DVIO_OPNCACHE);
    1746(追記) if (rc) (追記ここまで)
    1747(追記) { (追記ここまで)
    1748(追記) free(pDirEntry); (追記ここまで)
    1749(追記) free(pDirStart); (追記ここまで)
    1750(追記) return rc; (追記ここまで)
    1751(追記) } (追記ここまで)
    17351752 }
    17361753 free(pDirStart);
    17401757 memcpy(pVolInfo->BootSect.VolumeLabel, pDirEntry->bFileName, 11);
    17411758 rc = FSH_GETVOLPARM(pVolInfo->hVBP, &pvpfsi, &pvpfsd);
    1742 (削除) (削除ここまで)if (!rc)
    1759 (追記) (追記ここまで)if (!rc)
    17431760 memcpy(pvpfsi->vpi_text, pDirEntry->bFileName, 11);
    17441761 }
  • trunk/src/ifs/ifsmount.c

    r304 r322
    715715 pVolInfo->fRemovable = TRUE;
    716716
    717(追記) // consider CDRW (which have 0xffff sectors per track) to be "removables" too (追記ここまで)
    718(追記) if ( ! pVolInfo->fRemovable && pvpfsi->vpi_trksec == 0xffff ) (追記ここまで)
    719(追記) pVolInfo->fRemovable = TRUE; (追記ここまで)
    720(追記) (追記ここまで)
    717721 if (! pVolInfo->fRemovable)
    718722 pVolInfo->fDiskCleanOnMount = pVolInfo->fDiskClean = GetDiskStatus(pVolInfo);
    877881
    878882 case MOUNT_VOL_REMOVED:
    883(追記) break; (追記ここまで)
    884(追記) (追記ここまで)
    879885 case MOUNT_RELEASE:
    886(追記) (追記ここまで)
    880887 if ( *((ULONG *)pvpfsd->vpd_work + 1) != FAT32_VPB_MAGIC )
    881888 {
    882889 /* VPB magic is invalid, so it is not the VPB
    883890 created by fat32.ifs */
    884 return 0;
    891 rc = ERROR_VOLUME_NOT_MOUNTED;
    892 goto FS_MOUNT_EXIT;
    885893 }
    886894
    896904 }
    897905
    898 if (! pVolInfo->fFormatInProgress)
    899 {
    900 usFlushVolume( pVolInfo, FLUSH_DISCARD, TRUE, PRIO_URGENT );
    901 UpdateFSInfo(pVolInfo);
    902
    903 if (! pVolInfo->fRemovable && (pVolInfo->bFatType != FAT_TYPE_FAT12) )
    904 {
    906 if (! pVolInfo->fFormatInProgress &&
    907 ! pVolInfo->fRemovable && (pVolInfo->bFatType != FAT_TYPE_FAT12) )
    908 {
    909 usFlushVolume( pVolInfo, FLUSH_DISCARD, TRUE, PRIO_URGENT );
    910 UpdateFSInfo(pVolInfo);
    911
    905912 // ignore dirty status on floppies (and FAT12)
    906913 MarkDiskStatus(pVolInfo, pVolInfo->fDiskCleanOnMount);
    907(削除) } (削除ここまで)
    908914 }
    909915
Note: See TracChangeset for help on using the changeset viewer.

AltStyle によって変換されたページ (->オリジナル) /