Changeset 286


Ignore:
Timestamp:
Jul 3, 2017, 6:47:34 PM (3 years ago)
Author:
Valery V. Sedletski
Message:

fat32.ifs: Fix some problems remained in previous revision.

  • Fix a trap 000d caused by unzeroed variables.
  • Move check for bad sectors from ReadSector? to ReadBlock? and WriteBlock?.
  • Fix allocating new clusters in SetNextCluster? in exFAT code.
  • Change unlink() to DelFile?() and avoid calling filesystem access functions in CHKDSK when FS is not accessible.
Location:
trunk/src
Files:
5 edited

Legend:

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

    r284 r286  
    601601PSZ      pszFile;
    602602USHORT   rc;
    603 PDIRENTRY pDirEntry;
     603PDIRENTRY pDirEntry = NULL;
    604604#ifdef EXFAT
    605605PDIRENTRY1 pDirEntry1;
     
    610610PSHOPENINFO pDirSHInfo = NULL;
    611611//BYTE     szLongName[ FAT32MAXPATH ];
    612 PSZ      szLongName;
     612PSZ      szLongName = NULL;
    613613
    614614   _asm push es;
     
    40094009{
    40104010ULONG  ulSector;
    4011 //ULONG  ulNextCluster;
     4011ULONG  ulNextCluster;
    40124012USHORT usSectorsPerBlock = (USHORT)(pVolInfo->ulBlockSize / pVolInfo->BootSect.bpb.BytesPerSector);
    40134013USHORT rc;
     
    40264026
    40274027   // check for bad cluster
    4028    //ulNextCluster = GetNextCluster(pVolInfo, NULL, ulCluster);
    4029    //if (ulNextCluster == pVolInfo->ulFatBad)
    4030    //   return ERROR_SECTOR_NOT_FOUND;
     4028   ulNextCluster = GetNextCluster(pVolInfo, NULL, ulCluster);
     4029   if (ulNextCluster == pVolInfo->ulFatBad)
     4030      return ERROR_SECTOR_NOT_FOUND;
    40314031
    40324032   ulSector = pVolInfo->ulStartOfData +
     
    40514051{
    40524052ULONG  ulSector;
    4053 //ULONG  ulNextCluster;
     4053ULONG  ulNextCluster;
    40544054USHORT usSectorsPerBlock = (USHORT)(pVolInfo->ulBlockSize / pVolInfo->BootSect.bpb.BytesPerSector);
    40554055USHORT rc;
     
    40684068
    40694069   // check for bad cluster
    4070    //ulNextCluster = GetNextCluster(pVolInfo, NULL, ulCluster);
    4071    //if (ulNextCluster == pVolInfo->ulFatBad)
    4072    //   return ERROR_SECTOR_NOT_FOUND;
     4070   ulNextCluster = GetNextCluster(pVolInfo, NULL, ulCluster);
     4071   if (ulNextCluster == pVolInfo->ulFatBad)
     4072      return ERROR_SECTOR_NOT_FOUND;
    40734073
    40744074   ulSector = pVolInfo->ulStartOfData +
     
    49034903            }
    49044904
    4905          ReleaseFat(pVolInfo);
     4905         ////ReleaseFat(pVolInfo);
    49064906         if (f32Parms.fMessageActive & LOG_FUNCS)
    49074907            {
     
    53775377
    53785378   if (GetFatAccess(pVolInfo, "SetNextCluster"))
     5379      {
     5380#ifdef EXFAT
     5381      if (pVolInfo->bFatType == FAT_TYPE_EXFAT)
     5382         {
     5383         // mark cluster in exFAT allocation bitmap
     5384         MarkCluster(pVolInfo, ulCluster, FALSE);
     5385         }
     5386#endif
    53795387      return pVolInfo->ulFatEof;
     5388      }
    53805389
    53815390   if (ReadFatSector(pVolInfo, GetFatEntrySec(pVolInfo, ulCluster)))
     5391      {
     5392#ifdef EXFAT
     5393      if (pVolInfo->bFatType == FAT_TYPE_EXFAT)
     5394         {
     5395         // mark cluster in exFAT allocation bitmap
     5396         MarkCluster(pVolInfo, ulCluster, FALSE);
     5397         }
     5398#endif
    53825399      return pVolInfo->ulFatEof;
     5400      }
    53835401
    53845402   fUpdateFSInfo = FALSE;
     
    54035421      {
    54045422      ReleaseFat(pVolInfo);
     5423#ifdef EXFAT
     5424      if (pVolInfo->bFatType == FAT_TYPE_EXFAT)
     5425         {
     5426         // mark cluster in exFAT allocation bitmap
     5427         MarkCluster(pVolInfo, ulCluster, FALSE);
     5428         }
     5429#endif
    54055430      return pVolInfo->ulFatEof;
    54065431      }
     
    58915916//UCHAR  szLongName1[FAT32MAXPATH];
    58925917PSZ pszLongName1;
     5918PSZ pszLongName2;
    58935919//USHORT pusUniName[256];
    58945920PUSHORT pusUniName;
     
    59015927      return pDir;
    59025928
    5903    pszLongName1 = (PSZ)malloc((size_t)FAT32MAXPATH);
    5904    if (!pszLongName1)
     5929   pszLongName2 = (PSZ)malloc((size_t)FAT32MAXPATH);
     5930   if (!pszLongName2)
    59055931      return pDir;
     5932
     5933   pszLongName1 = pszLongName2;
    59065934
    59075935   pusUniName = (PUSHORT)malloc(256 * sizeof(USHORT));
    59085936   if (!pusUniName)
     5937      {
     5938      free(pszLongName2);
    59095939      return pDir;
     5940      }
    59105941
    59115942   // @todo Use upcase table
     
    59165947
    59175948   if (!usNeededEntries)
     5949      {
     5950      free(pszLongName2);
     5951      free(pusUniName);
    59185952      return pDir;
     5953      }
    59195954
    59205955   pLN = (PDIRENTRY1)pDir;
     
    59525987      *pusNameHash = NameHash(pusUniName, DBCSStrlen(r));
    59535988
    5954    free(pusUniName);
    5955    free(pszLongName1);
     5989
     5990   if (pusUniName)
     5991      free(pusUniName);
     5992   if (pszLongName2)
     5993      free(pszLongName2);
    59565994
    59575995   return pLN;
  • trunk/src/ifs/ifscache.c

    r284 r286  
    275275        ULONG ulCluster;
    276276
    277         for( ulCluster = ulStartCluster; ulCluster <= ulEndCluster; ulCluster++ )
     277        /* for( ulCluster = ulStartCluster; ulCluster <= ulEndCluster; ulCluster++ )
    278278        {
    279279            //ulNextCluster = GetNextCluster2( pVolInfo, NULL, ulCluster );
     
    291291        if (usSectors == 0)
    292292            // avoid reading zero sectors
    293             return ERROR_SECTOR_NOT_FOUND;
     293            return ERROR_SECTOR_NOT_FOUND; */
    294294   }
    295295
  • trunk/src/ifs/ifsfile.c

    r284 r286  
    835835         free(pDirOldStream);
    836836#endif
     837         free(szLongName);
    837838         }
    838839      else
  • trunk/src/ufat32/chkdsk.c

    r283 r286  
    109109USHORT fGetUpCaseTbl(PCDINFO pCD, PULONG pulFirstCluster, PULONGLONG pullLen, PULONG pulChecksum);
    110110void SetSHInfo1(PCDINFO pCD, PDIRENTRY1 pStreamEntry, PSHOPENINFO pSHInfo);
     111APIRET DelFile(PCDINFO pCD, PSZ pszFilename);
    111112
    112113USHORT _Far16 _Pascal _loadds INIT16(HMODULE hmod, ULONG flag);
     
    717718
    718719   if (pCD->ulRecoveredClusters)
    719       show_message("%1 bytes in %2 user files.\n", 0, 1365, 2,
     720      show_message("%1 bytes in %2 recovered files.\n", 0, 1366, 2,
    720721         TYPE_DOUBLE, (DOUBLE)pCD->ulRecoveredClusters * pCD->ulClusterSize,
    721722         TYPE_LONG, pCD->ulRecoveredFiles);
     723      //show_message("%1 bytes in %2 user files.\n", 0, 1365, 2,
     724      //   TYPE_DOUBLE, (DOUBLE)pCD->ulRecoveredClusters * pCD->ulClusterSize,
     725      //   TYPE_LONG, pCD->ulRecoveredFiles);
    722726
    723727   if (pCD->ulLostClusters)
     
    14861490                  if (pCD->fFix)
    14871491                     {
    1488                      unlink(Mark.szFileName);
     1492                     DelFile(pCD, Mark.szFileName);
     1493                     //unlink(Mark.szFileName);
    14891494                     strcpy(Mark.szFileName, pbPath);
    14901495                     Mark.fEAS = FILE_HAS_NO_EAS;
     
    21102115                     if (pCD->fFix)
    21112116                        {
    2112                         unlink(Mark.szFileName);
     2117                        DelFile(pCD, Mark.szFileName);
     2118                        //unlink(Mark.szFileName);
    21132119                        strcpy(Mark.szFileName, pbPath);
    21142120                        Mark.fEAS = FILE_HAS_NO_EAS;
  • trunk/src/ufat32/fatfunc.c

    r283 r286  
    9191USHORT fGetAllocBitmap(PCDINFO pCD, PULONG pulFirstCluster, PULONGLONG pullLen);
    9292void SetSHInfo1(PCDINFO pCD, PDIRENTRY1 pStreamEntry, PSHOPENINFO pSHInfo);
     93APIRET DelFile(PCDINFO pCD, PSZ pszFilename);
    9394
    9495void set_datetime(DIRENTRY *pDir);
     
    26882689
    26892690   if (ReadFatSector(pCD, GetFatEntrySec(pCD, ulCluster)))
     2691      {
     2692#ifdef EXFAT
     2693      if (pCD->bFatType == FAT_TYPE_EXFAT)
     2694         {
     2695         // mark cluster in exFAT allocation bitmap
     2696         MarkCluster2(pCD, ulCluster, FALSE);
     2697         }
     2698#endif
    26902699      return pCD->ulFatEof;
     2700      }
    26912701
    26922702   fUpdateFSInfo = FALSE;
     
    27082718   rc = WriteFatSector(pCD, GetFatEntrySec(pCD, ulCluster));
    27092719   if (rc)
     2720      {
     2721#ifdef EXFAT
     2722      if (pCD->bFatType == FAT_TYPE_EXFAT)
     2723         {
     2724         // mark cluster in exFAT allocation bitmap
     2725         MarkCluster2(pCD, ulCluster, FALSE);
     2726         }
     2727#endif
    27102728      return pCD->ulFatEof;
     2729      }
    27112730
    27122731   if (fUpdateFSInfo)
     
    40144033   return rc;
    40154034}
     4035
     4036APIRET DelFile(PCDINFO pCD, PSZ pszFilename)
     4037{
     4038PSZ pszFile;
     4039DIRENTRY DirEntry;
     4040PDIRENTRY1 pDirEntry1;
     4041DIRENTRY1 DirEntryStream;
     4042DIRENTRY1 DirStream;
     4043SHOPENINFO DirSHInfo;
     4044PSHOPENINFO pDirSHInfo = NULL;
     4045ULONG ulDirCluster;
     4046ULONG ulCluster;
     4047APIRET rc;
     4048
     4049   ulDirCluster = FindDirCluster(pCD,
     4050      pszFilename,
     4051      0xffff,
     4052      RETURN_PARENT_DIR,
     4053      &pszFile,
     4054      &DirStream);
     4055
     4056   if (ulDirCluster == pCD->ulFatEof)
     4057      {
     4058      rc = ERROR_PATH_NOT_FOUND;
     4059      goto DeleteFileExit;
     4060      }
     4061
     4062#ifdef EXFAT
     4063   if (pCD->bFatType == FAT_TYPE_EXFAT)
     4064      {
     4065      pDirSHInfo = &DirSHInfo;
     4066      SetSHInfo1(pCD, &DirStream, pDirSHInfo);
     4067      }
     4068#endif
     4069
     4070   ulCluster = FindPathCluster(pCD, ulDirCluster, pszFile, pDirSHInfo,
     4071                               &DirEntry, &DirEntryStream, NULL);
     4072   if (ulCluster == pCD->ulFatEof)
     4073      {
     4074      rc = ERROR_FILE_NOT_FOUND;
     4075      goto DeleteFileExit;
     4076      }
     4077
     4078   pDirEntry1 = (PDIRENTRY1)&DirEntry;
     4079
     4080#ifdef EXFAT
     4081   if ( ((pCD->bFatType <  FAT_TYPE_EXFAT) && (DirEntry.bAttr & FILE_DIRECTORY)) ||
     4082        ((pCD->bFatType == FAT_TYPE_EXFAT) && (pDirEntry1->u.File.usFileAttr & FILE_DIRECTORY)) )
     4083#else
     4084   if ( DirEntry.bAttr & FILE_DIRECTORY )
     4085#endif
     4086      {
     4087      rc = ERROR_ACCESS_DENIED;
     4088      goto DeleteFileExit;
     4089      }
     4090
     4091   rc = ModifyDirectory(pCD, ulDirCluster, pDirSHInfo, MODIFY_DIR_DELETE,
     4092                        &DirEntry, NULL, &DirEntryStream, NULL, NULL);
     4093   if (rc)
     4094      goto DeleteFileExit;
     4095
     4096   if (ulCluster)
     4097      DeleteFatChain(pCD, ulCluster);
     4098   rc = 0;
     4099
     4100DeleteFileExit:
     4101   return rc;
     4102}
Note: See TracChangeset for help on using the changeset viewer.