[NTFS]
[reactos.git] / drivers / filesystems / ntfs / attrib.c
index 3cf40d8..e0c41fa 100644 (file)
@@ -88,25 +88,40 @@ AddRun(PNTFS_VCB Vcb,
     ULONGLONG NextVBN = AttrContext->Record.NonResident.LowestVCN;
 
     // Allocate some memory for the RunBuffer
-    PUCHAR RunBuffer = ExAllocatePoolWithTag(NonPagedPool, Vcb->NtfsInfo.BytesPerFileRecord, TAG_NTFS);
-    int RunBufferOffset = 0;
+    PUCHAR RunBuffer;
+    ULONG RunBufferOffset = 0;
 
     if (!AttrContext->Record.IsNonResident)
         return STATUS_INVALID_PARAMETER;
 
+    RunBuffer = ExAllocatePoolWithTag(NonPagedPool, Vcb->NtfsInfo.BytesPerFileRecord, TAG_NTFS);
+
     // Convert the data runs to a map control block
     Status = ConvertDataRunsToLargeMCB(DataRun, &DataRunsMCB, &NextVBN);
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("Unable to convert data runs to MCB (probably ran out of memory)!\n");
+        ExFreePoolWithTag(RunBuffer, TAG_NTFS);
         return Status;
     }
 
     // Add newly-assigned clusters to mcb
-    FsRtlAddLargeMcbEntry(&DataRunsMCB,
-                          NextVBN,
-                          NextAssignedCluster,
-                          RunLength);
+    _SEH2_TRY{
+        if (!FsRtlAddLargeMcbEntry(&DataRunsMCB,
+                                   NextVBN,
+                                   NextAssignedCluster,
+                                   RunLength))
+        {
+            FsRtlUninitializeLargeMcb(&DataRunsMCB);
+            ExFreePoolWithTag(RunBuffer, TAG_NTFS);
+            return STATUS_INSUFFICIENT_RESOURCES;
+        }
+    } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
+        FsRtlUninitializeLargeMcb(&DataRunsMCB);
+        ExFreePoolWithTag(RunBuffer, TAG_NTFS);
+        _SEH2_YIELD(return STATUS_INSUFFICIENT_RESOURCES);
+    } _SEH2_END;
+
 
     // Convert the map control block back to encoded data runs
     ConvertLargeMCBToDataRuns(&DataRunsMCB, RunBuffer, Vcb->NtfsInfo.BytesPerCluster, &RunBufferOffset);
@@ -202,8 +217,6 @@ ConvertDataRunsToLargeMCB(PUCHAR DataRun,
     LONGLONG  DataRunOffset;
     ULONGLONG DataRunLength;
     LONGLONG  DataRunStartLCN;
-    ULONGLONG NextCluster;
-
     ULONGLONG LastLCN = 0;
 
     // Initialize the MCB, potentially catch an exception
@@ -222,8 +235,6 @@ ConvertDataRunsToLargeMCB(PUCHAR DataRun,
             // Normal data run.
             DataRunStartLCN = LastLCN + DataRunOffset;
             LastLCN = DataRunStartLCN;
-            NextCluster = LastLCN + DataRunLength;
-
 
             _SEH2_TRY{
                 if (!FsRtlAddLargeMcbEntry(DataRunsMCB,
@@ -280,14 +291,14 @@ ConvertLargeMCBToDataRuns(PLARGE_MCB DataRunsMCB,
     ULONG RunBufferOffset = 0;
     LONGLONG  DataRunOffset;
     ULONGLONG LastLCN = 0;
-
     LONGLONG Vbn, Lbn, Count;
+    int i;
 
 
     DPRINT("\t[Vbn, Lbn, Count]\n");
 
     // convert each mcb entry to a data run
-    for (int i = 0; FsRtlGetNextLargeMcbEntry(DataRunsMCB, i, &Vbn, &Lbn, &Count); i++)
+    for (i = 0; FsRtlGetNextLargeMcbEntry(DataRunsMCB, i, &Vbn, &Lbn, &Count); i++)
     {
         UCHAR DataRunOffsetSize = 0;
         UCHAR DataRunLengthSize = 0;