Fixed Infinite reading in ext2 driver, removed debug from DrvUitl
authorJohn Hodge <[email protected]>
Sat, 10 Oct 2009 01:53:33 +0000 (09:53 +0800)
committerJohn Hodge <[email protected]>
Sat, 10 Oct 2009 01:53:33 +0000 (09:53 +0800)
Kernel/vfs/fs/ext2.c

index 1da9c0f..0c4b527 100644 (file)
@@ -201,9 +201,22 @@ Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        // Get Inode\r
        Ext2_int_GetInode(Node, &inode);\r
        \r
+       // Sanity Checks\r
+       if(Offset >= inode.i_size) {\r
+               LEAVE('i', 0);\r
+               return 0;\r
+       }\r
+       if(Offset + Length > inode.i_size)\r
+               Length = inode.i_size - Offset;\r
+       \r
        block = Offset / disk->BlockSize;\r
        Offset = Offset / disk->BlockSize;\r
        base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);\r
+       if(base == 0) {\r
+               Warning("[EXT2 ] NULL Block Detected in INode 0x%llx\n", Node->Inode);\r
+               LEAVE('i', 0);\r
+               return 0;\r
+       }\r
        \r
        // Read only block\r
        if(Length <= disk->BlockSize - Offset)\r
@@ -224,6 +237,11 @@ Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        while(remLen > disk->BlockSize)\r
        {\r
                base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);\r
+               if(base == 0) {\r
+                       Warning("[EXT2 ] NULL Block Detected in INode 0x%llx\n", Node->Inode);\r
+                       LEAVE('i', 0);\r
+                       return 0;\r
+               }\r
                VFS_ReadAt( disk->FD, base, disk->BlockSize, Buffer);\r
                Buffer += disk->BlockSize;\r
                remLen -= disk->BlockSize;\r

UCC git Repository :: git.ucc.asn.au