git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Modules/Ext2 - Fixed zero-length filenames and memory leaks
[tpg/acess2.git]
/
KernelLand
/
Modules
/
Filesystems
/
Ext2
/
dir.c
diff --git
a/KernelLand/Modules/Filesystems/Ext2/dir.c
b/KernelLand/Modules/Filesystems/Ext2/dir.c
index
30cc86e
..
4039a7c
100644
(file)
--- 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;
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
// 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;
{
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 );
}
ofs = 0;
Base = Ext2_int_GetBlockAddr( disk, inode.i_block, block );
+ if( Base == 0 ) {
+ size = 0;
+ break;
+ }
}
}
// Check for the end of the list
}
}
// 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 );
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
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')
// 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;
if( (tmpNode = Inode_GetCache(Disk->CacheID, InodeID)) )
return tmpNode;
-
+
+ memset(&retNode, 0, sizeof(retNode));
// Set identifiers
retNode.Inode = InodeID;
// 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;
// Set file length
retNode.Size = inode.i_size;
- retNode.Data = NULL;
// Set Access Permissions
retNode.UID = inode.i_uid;
// Set Access Permissions
retNode.UID = inode.i_uid;
UCC
git Repository :: git.ucc.asn.au