X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=KernelLand%2FModules%2FFilesystems%2FExt2%2Fdir.c;fp=KernelLand%2FModules%2FFilesystems%2FExt2%2Fdir.c;h=4039a7c0256ea8c6d24a0107899b6a673f7cd635;hb=06a3eb8135ecb748c998e6827d20338158526d12;hp=30cc86edac51447e960b467fe99e80f1b4ba386c;hpb=5f9ecf4fc516d7ed6f4c86002648d6fa032e012b;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Filesystems/Ext2/dir.c b/KernelLand/Modules/Filesystems/Ext2/dir.c index 30cc86ed..4039a7c0 100644 --- a/KernelLand/Modules/Filesystems/Ext2/dir.c +++ b/KernelLand/Modules/Filesystems/Ext2/dir.c @@ -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;