Changeset 322
- 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
- fat32a.c (modified) (4 diffs)
- ifsmount.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ifs/fat32a.c
r317 r322 1562 1562 if (ulCluster == 1) 1563 1563 // 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); 1565 1565 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 } 1567 1572 pDir = pDirStart; 1568 1573 pDirEnd = (PDIRENTRY)((PBYTE)pDirStart + pVolInfo->ulBlockSize); … … 1710 1715 else 1711 1716 rc = WriteBlock(pVolInfo, ulCluster, ulBlock, (PBYTE)pDirStart, DVIO_OPWRTHRU); 1717 (追記) if (rc) (追記ここまで) 1718 (追記) { (追記ここまで) 1719 (追記) free(pDirEntry); (追記ここまで) 1720 (追記) free(pDirStart); (追記ここまで) 1721 (追記) return rc; (追記ここまで) 1722 (追記) } (追記ここまで) 1712 1723 } 1713 1724 else … … 1733 1744 memcpy(pBootSect->VolumeLabel, pDirEntry->bFileName, 11); 1734 1745 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 (追記) } (追記ここまで) 1735 1752 } 1736 1753 free(pDirStart); … … 1740 1757 memcpy(pVolInfo->BootSect.VolumeLabel, pDirEntry->bFileName, 11); 1741 1758 rc = FSH_GETVOLPARM(pVolInfo->hVBP, &pvpfsi, &pvpfsd); 1742 (削除) (削除ここまで)if (!rc)1759 (追記) (追記ここまで)if (!rc) 1743 1760 memcpy(pvpfsi->vpi_text, pDirEntry->bFileName, 11); 1744 1761 } -
trunk/src/ifs/ifsmount.c
r304 r322 715 715 pVolInfo->fRemovable = TRUE; 716 716 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 (追記) (追記ここまで) 717 721 if (! pVolInfo->fRemovable) 718 722 pVolInfo->fDiskCleanOnMount = pVolInfo->fDiskClean = GetDiskStatus(pVolInfo); … … 877 881 878 882 case MOUNT_VOL_REMOVED: 883 (追記) break; (追記ここまで) 884 (追記) (追記ここまで) 879 885 case MOUNT_RELEASE: 886 (追記) (追記ここまで) 880 887 if ( *((ULONG *)pvpfsd->vpd_work + 1) != FAT32_VPB_MAGIC ) 881 888 { 882 889 /* VPB magic is invalid, so it is not the VPB 883 890 created by fat32.ifs */ 884 return 0; 891 rc = ERROR_VOLUME_NOT_MOUNTED; 892 goto FS_MOUNT_EXIT; 885 893 } 886 894 … … 896 904 } 897 905 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 905 912 // ignore dirty status on floppies (and FAT12) 906 913 MarkDiskStatus(pVolInfo, pVolInfo->fDiskCleanOnMount); 907 (削除) } (削除ここまで)908 914 } 909 915
Note:
See TracChangeset
for help on using the changeset viewer.