Modules/Ext2 - Fixed zero-length filenames and memory leaks
[tpg/acess2.git] / KernelLand / Modules / Filesystems / Ext2 / dir.c
index 30cc86e..4039a7c 100644 (file)
@@ -61,14 +61,14 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos)
        Ext2_int_ReadInode(disk, Node->Inode, &inode);
        size = inode.i_size;
        
-       LOG("inode.i_block[0] = 0x%x", inode.i_block[0]);
+       LOG("inode={.i_block[0]= 0x%x, .i_size=0x%x}", inode.i_block[0], inode.i_size);
        
        // Find Entry
        // Get First Block
        // - Do this ourselves as it is a simple operation
        Base = inode.i_block[0] * disk->BlockSize;
        // Scan directory
-       while(Pos -- && size > 0)
+       while(Pos -- && size > 0 && size <= inode.i_size)
        {
                VFS_ReadAt( disk->FD, Base+ofs, sizeof(tExt2_DirEnt), &dirent);
                ofs += dirent.rec_len;
@@ -83,22 +83,29 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos)
                        }
                        ofs = 0;
                        Base = Ext2_int_GetBlockAddr( disk, inode.i_block, block );
+                       if( Base == 0 ) {
+                               size = 0;
+                               break;
+                       }
                }
        }
        
        // Check for the end of the list
-       if(size <= 0) {
+       if(size <= 0 || size > inode.i_size) {
                LEAVE('n');
                return NULL;
        }
        
        // Read Entry
        VFS_ReadAt( disk->FD, Base+ofs, sizeof(tExt2_DirEnt), &dirent );
-       //LOG("dirent.inode = %i", dirent.inode);
-       //LOG("dirent.rec_len = %i", dirent.rec_len);
-       //LOG("dirent.name_len = %i", dirent.name_len);
+       LOG("dirent={.rec_len=%i,.inode=0x%x,.name_len=%i}",
+               dirent.rec_len, dirent.inode, dirent.name_len);
        dirent.name[ dirent.name_len ] = '\0';  // Cap off string
        
+       if( dirent.name_len == 0 ) {
+               LEAVE('p', VFS_SKIP);
+               return VFS_SKIP;
+       }
        
        // Ignore . and .. (these are done in the VFS)
        if( (dirent.name[0] == '.' && dirent.name[1] == '\0')
@@ -342,7 +349,8 @@ tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeID)
        
        if( (tmpNode = Inode_GetCache(Disk->CacheID, InodeID)) )
                return tmpNode;
-       
+
+       memset(&retNode, 0, sizeof(retNode));   
        
        // Set identifiers
        retNode.Inode = InodeID;
@@ -350,7 +358,6 @@ tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeID)
        
        // Set file length
        retNode.Size = inode.i_size;
-       retNode.Data = NULL;
        
        // Set Access Permissions
        retNode.UID = inode.i_uid;

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