Kernel - Fix compilation on x86_64 and armv7 (for MM changes)
[tpg/acess2.git] / KernelLand / Modules / Filesystems / NTFS / dir.c
index 17785fb..f72c637 100644 (file)
@@ -76,13 +76,15 @@ int NTFS_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX])
                // Check allocation
                struct sNTFS_IndexHeader *hdr = (void*)buf;
                ASSERT(hdr->EntriesOffset + 0x18 < len);
+               // Apply update sequence
+               ASSERT(hdr->UpdateSequenceOfs + 2*hdr->UpdateSequenceSize <= len);
+               NTFS_int_ApplyUpdateSequence(buf,len, (void*)(buf+hdr->UpdateSequenceOfs), hdr->UpdateSequenceSize);
                size_t  ofs = hdr->EntriesOffset + 0x18;
                ent = NTFS_int_IterateIndex(buf + ofs, len - ofs, &Pos);
                vcn ++;
        }
        if( !ent ) {
-               LEAVE('i', 1);
-               return -1;
+               LEAVE_RET('i', -1);
        }
 
        // TODO: This is not future-proof
@@ -163,6 +165,10 @@ void NTFS_int_DumpIndex(tNTFS_Attrib *Allocation, Uint AttribID)
        while( (len = NTFS_ReadAttribData(Allocation, vcn*block_size, block_size, buf)) )
        {
                struct sNTFS_IndexHeader        *hdr = (void*)buf;
+               // Apply update sequence
+               ASSERT(hdr->UpdateSequenceOfs + 2*hdr->UpdateSequenceSize <= len);
+               NTFS_int_ApplyUpdateSequence(buf,len, (void*)(buf+hdr->UpdateSequenceOfs), hdr->UpdateSequenceSize);
+               
                LOG("VCN %x: Ofs=%x, Size=%x",
                        vcn, hdr->EntriesOffset, hdr->EntriesSize);
                if( hdr->ThisVCN != vcn ) {
@@ -266,6 +272,7 @@ tVFS_Node *NTFS_int_CreateNode(tNTFS_Disk *Disk, Uint64 MFTEntry)
                ret = &types.tpl_file.Node;
                ret->Type = &gNTFS_FileType;
                types.tpl_file.Data = NTFS_GetAttrib(Disk, MFTEntry, NTFS_FileAttrib_Data, "", 0); 
+               ret->Size = types.tpl_file.Data->DataSize;
        }
        ret->Inode = MFTEntry;
        ret->ImplPtr = Disk;
@@ -312,6 +319,21 @@ tVFS_Node *NTFS_FindDir(tVFS_Node *Node, const char *Name, Uint Flags)
                if( len == 0 )
                        break;
                tNTFS_IndexHeader       *hdr = (void*)buf;
+               
+               if( memcmp(&hdr->Magic, "INDX", 4) != 0 ) {
+                       Log_Notice("NTFS", "FindDir %p:%X:%x index magic bad %08x",
+                               disk, Node->Inode, ofs / unit_len, hdr->Magic);
+                       break;
+               }
+               // Apply update sequence
+               if(hdr->UpdateSequenceOfs + 2*hdr->UpdateSequenceSize > len) {
+                       Log_Notice("NTFS", "FindDir %p:%X:%x index update sequence out of buffer (%x+%x>%x)",
+                               disk, Node->Inode, ofs / unit_len,
+                               hdr->UpdateSequenceOfs, 2*hdr->UpdateSequenceSize, len);
+                       break;
+               }
+               NTFS_int_ApplyUpdateSequence(buf,len, (void*)(buf+hdr->UpdateSequenceOfs), hdr->UpdateSequenceSize);
+               // Search
                //mftent = NTFS_BTreeSearch(len, (void*)buf, NTFS_BTreeSearch_CmpI30, name16len*2, name16);
                mftent = NTFS_BTreeSearch(
                        len-(hdr->EntriesOffset+0x18), buf+hdr->EntriesOffset+0x18,
@@ -319,7 +341,7 @@ tVFS_Node *NTFS_FindDir(tVFS_Node *Node, const char *Name, Uint Flags)
                        );
        }
        
-       if( !mftent ) {
+       if( !mftent || (mftent & (1ULL << 63)) ) {
                LEAVE('n');
                return NULL;
        }

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