Commit cbca4f2e authored by Eric Sandeen's avatar Eric Sandeen Committed by Adrian Bunk

Have ext3 reject file handles with bad inode numbers early

blatantly ripped off from Neil Brown's ext2 patch.
Signed-off-by: default avatarEric Sandeen <sandeen@sandeen.net>
Acked-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
Signed-off-by: default avatarAdrian Bunk <bunk@stusta.de>
parent 06e34650
...@@ -619,8 +619,48 @@ static struct super_operations ext3_sops = { ...@@ -619,8 +619,48 @@ static struct super_operations ext3_sops = {
#endif #endif
}; };
static struct dentry *ext3_get_dentry(struct super_block *sb, void *vobjp)
{
__u32 *objp = vobjp;
unsigned long ino = objp[0];
__u32 generation = objp[1];
struct inode *inode;
struct dentry *result;
if (ino != EXT3_ROOT_INO && ino < EXT3_FIRST_INO(sb))
return ERR_PTR(-ESTALE);
if (ino > le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count))
return ERR_PTR(-ESTALE);
/* iget isn't really right if the inode is currently unallocated!!
* ext3_read_inode currently does appropriate checks, but
* it might be "neater" to call ext3_get_inode first and check
* if the inode is valid.....
*/
inode = iget(sb, ino);
if (inode == NULL)
return ERR_PTR(-ENOMEM);
if (is_bad_inode(inode)
|| (generation && inode->i_generation != generation)
) {
/* we didn't find the right inode.. */
iput(inode);
return ERR_PTR(-ESTALE);
}
/* now to find a dentry.
* If possible, get a well-connected one
*/
result = d_alloc_anon(inode);
if (!result) {
iput(inode);
return ERR_PTR(-ENOMEM);
}
return result;
}
static struct export_operations ext3_export_ops = { static struct export_operations ext3_export_ops = {
.get_parent = ext3_get_parent, .get_parent = ext3_get_parent,
.get_dentry = ext3_get_dentry,
}; };
enum { enum {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment