Author: pschweitzer
Date: Sat Jun 11 09:32:00 2016
New Revision: 71610

URL: http://svn.reactos.org/svn/reactos?rev=71610&view=rev
Log:
[FASTFAT]
Properly round up 64b values.
This fixes reads on 4GB+ volumes.

Patch by Wim Hueskes.

CORE-10932 #resolve #comment Thanks for the patch! Commited in r71610

Modified:
    trunk/reactos/drivers/filesystems/fastfat/fcb.c
    trunk/reactos/drivers/filesystems/fastfat/finfo.c
    trunk/reactos/drivers/filesystems/fastfat/fsctl.c
    trunk/reactos/drivers/filesystems/fastfat/rw.c
    trunk/reactos/drivers/filesystems/fastfat/vfat.h

Modified: trunk/reactos/drivers/filesystems/fastfat/fcb.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/fcb.c?rev=71610&r1=71609&r2=71610&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/fcb.c     [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/fcb.c     [iso-8859-1] Sat Jun 11 
09:32:00 2016
@@ -668,7 +668,7 @@
     }
     rcFCB->RFCB.FileSize.QuadPart = Size;
     rcFCB->RFCB.ValidDataLength.QuadPart = Size;
-    rcFCB->RFCB.AllocationSize.QuadPart = ROUND_UP(Size, 
vcb->FatInfo.BytesPerCluster);
+    rcFCB->RFCB.AllocationSize.QuadPart = ROUND_UP_64(Size, 
vcb->FatInfo.BytesPerCluster);
     rcFCB->RefCount = 1;
     if (vfatFCBIsDirectory(rcFCB))
     {

Modified: trunk/reactos/drivers/filesystems/fastfat/finfo.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/finfo.c?rev=71610&r1=71609&r2=71610&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/finfo.c   [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/finfo.c   [iso-8859-1] Sat Jun 11 
09:32:00 2016
@@ -1114,7 +1114,7 @@
 {
     if (Size > 0)
     {
-        Fcb->RFCB.AllocationSize.QuadPart = ROUND_UP(Size, ClusterSize);
+        Fcb->RFCB.AllocationSize.QuadPart = ROUND_UP_64(Size, ClusterSize);
     }
     else
     {

Modified: trunk/reactos/drivers/filesystems/fastfat/fsctl.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/fsctl.c?rev=71610&r1=71609&r2=71610&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/fsctl.c   [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/fsctl.c   [iso-8859-1] Sat Jun 11 
09:32:00 2016
@@ -576,7 +576,7 @@
     }
 
     VolumeFcb->Flags = FCB_IS_VOLUME;
-    VolumeFcb->RFCB.FileSize.QuadPart = DeviceExt->FatInfo.Sectors * 
DeviceExt->FatInfo.BytesPerSector;
+    VolumeFcb->RFCB.FileSize.QuadPart = (LONGLONG) DeviceExt->FatInfo.Sectors 
* DeviceExt->FatInfo.BytesPerSector;
     VolumeFcb->RFCB.ValidDataLength = VolumeFcb->RFCB.FileSize;
     VolumeFcb->RFCB.AllocationSize = VolumeFcb->RFCB.FileSize;
     DeviceExt->VolumeFcb = VolumeFcb;

Modified: trunk/reactos/drivers/filesystems/fastfat/rw.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/rw.c?rev=71610&r1=71609&r2=71610&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/rw.c      [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/rw.c      [iso-8859-1] Sat Jun 11 
09:32:00 2016
@@ -150,7 +150,7 @@
     BytesPerSector = DeviceExt->FatInfo.BytesPerSector;
     BytesPerCluster = DeviceExt->FatInfo.BytesPerCluster;
 
-    ASSERT(ReadOffset.QuadPart + Length <= 
ROUND_UP(Fcb->RFCB.FileSize.QuadPart, BytesPerSector));
+    ASSERT(ReadOffset.QuadPart + Length <= 
ROUND_UP_64(Fcb->RFCB.FileSize.QuadPart, BytesPerSector));
     ASSERT(ReadOffset.u.LowPart % BytesPerSector == 0);
     ASSERT(Length % BytesPerSector == 0);
 
@@ -711,9 +711,9 @@
     else
     {
         // non cached read
-        if (ByteOffset.QuadPart + Length > 
ROUND_UP(Fcb->RFCB.FileSize.QuadPart, BytesPerSector))
-        {
-            Length = (ULONG)(ROUND_UP(Fcb->RFCB.FileSize.QuadPart, 
BytesPerSector) - ByteOffset.QuadPart);
+        if (ByteOffset.QuadPart + Length > 
ROUND_UP_64(Fcb->RFCB.FileSize.QuadPart, BytesPerSector))
+        {
+            Length = (ULONG)(ROUND_UP_64(Fcb->RFCB.FileSize.QuadPart, 
BytesPerSector) - ByteOffset.QuadPart);
         }
 
         Status = VfatReadFileData(IrpContext, Length, ByteOffset, 
&ReturnedLength);

Modified: trunk/reactos/drivers/filesystems/fastfat/vfat.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/vfat.h?rev=71610&r1=71609&r2=71610&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat/vfat.h    [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat/vfat.h    [iso-8859-1] Sat Jun 11 
09:32:00 2016
@@ -24,6 +24,12 @@
 
 #define ROUND_UP(n, align) \
     ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
+
+#define ROUND_DOWN_64(n, align) \
+    (((ULONGLONG)n) & ~((align) - 1LL))
+
+#define ROUND_UP_64(n, align) \
+    ROUND_DOWN_64(((ULONGLONG)n) + (align) - 1LL, (align))
 
 #include <pshpack1.h>
 struct _BootSector


Reply via email to