Skip to content

Commit

Permalink
[PATCH] knfsd: Have ext2 reject file handles with bad inode numbers e…
Browse files Browse the repository at this point in the history
…arly

This prevents bad inode numbers from triggering errors in ext2_get_inode.

[[email protected]: speedup, cleanup]
Signed-off-by: Neil Brown <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
neilbrown authored and Linus Torvalds committed Sep 16, 2006
1 parent 55ebcc3 commit ecaff75
Showing 1 changed file with 39 additions and 0 deletions.
39 changes: 39 additions & 0 deletions fs/ext2/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,13 +251,52 @@ static struct super_operations ext2_sops = {
#endif
};

static struct dentry *ext2_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 < EXT2_FIRST_INO(sb) && ino != EXT2_ROOT_INO)
return ERR_PTR(-ESTALE);
if (ino > le32_to_cpu(EXT2_SB(sb)->s_es->s_inodes_count))
return ERR_PTR(-ESTALE);

/* iget isn't really right if the inode is currently unallocated!!
* ext2_read_inode currently does appropriate checks, but
* it might be "neater" to call ext2_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;
}

/* Yes, most of these are left as NULL!!
* A NULL value implies the default, which works with ext2-like file
* systems, but can be improved upon.
* Currently only get_parent is required.
*/
static struct export_operations ext2_export_ops = {
.get_parent = ext2_get_parent,
.get_dentry = ext2_get_dentry,
};

static unsigned long get_sb_block(void **data)
Expand Down

0 comments on commit ecaff75

Please sign in to comment.