Skip to content

Commit

Permalink
affs_lookup(): close a race with affs_remove_link()
Browse files Browse the repository at this point in the history
we unlock the directory hash too early - if we are looking at secondary
link and primary (in another directory) gets removed just as we unlock,
we could have the old primary moved in place of the secondary, leaving
us to look into freed entry (and leaving our dentry with ->d_fsdata
pointing to a freed entry).

Cc: stable@vger.kernel.org # 2.4.4+
Acked-by: David Sterba <dsterba@suse.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Al Viro committed May 21, 2018
1 parent b127125 commit 30da870
Showing 1 changed file with 7 additions and 3 deletions.
10 changes: 7 additions & 3 deletions fs/affs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -206,9 +206,10 @@ affs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)

affs_lock_dir(dir);
bh = affs_find_entry(dir, dentry);
affs_unlock_dir(dir);
if (IS_ERR(bh))
if (IS_ERR(bh)) {
affs_unlock_dir(dir);
return ERR_CAST(bh);
}
if (bh) {
u32 ino = bh->b_blocknr;

Expand All @@ -222,10 +223,13 @@ affs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
}
affs_brelse(bh);
inode = affs_iget(sb, ino);
if (IS_ERR(inode))
if (IS_ERR(inode)) {
affs_unlock_dir(dir);
return ERR_CAST(inode);
}
}
d_add(dentry, inode);
affs_unlock_dir(dir);
return NULL;
}

Expand Down

0 comments on commit 30da870

Please sign in to comment.