History

afs: Fix dynamic root getattr

The recent patch to make afs_getattr consult the server didn't account for the pseudo-inodes employed by the dynamic root-type afs superblock not having a volume or a server to access, and thus an oops occurs if such a directory is stat'd. Fix this by checking to see if the vnode->volume pointer actually points anywhere before following it in afs_getattr(). This can be tested by stat'ing a directory in /afs. It may be sufficient just to do "ls /afs" and the oops looks something like: BUG: kernel NULL pointer dereference, address: 0000000000000020 ... RIP: 0010:afs_getattr+0x8b/0x14b ... Call Trace: <TASK> vfs_statx+0x79/0xf5 vfs_fstatat+0x49/0x62

David Howells committed 4 years ago

Commit cb78d1b1 parent 78ca5581 file · +2 −1Browse files

Unified · Split

fs/afs/inode.c+2−1
@@ -745,7 +745,8 @@ int afs_getattr(struct user_namespace *mnt_userns, const struct path *path, · 744 unmodified lines
745745
746746 _enter("{ ino=%lu v=%u }", inode->i_ino, inode->i_generation);
747747
748− if (!(query_flags & AT_STATX_DONT_SYNC) &&
748+ if (vnode->volume &&
749+ !(query_flags & AT_STATX_DONT_SYNC) &&
749750 !test_bit(AFS_VNODE_CB_PROMISED, &vnode->flags)) {
750751 key = afs_request_key(vnode->volume->cell);
751752 if (IS_ERR(key))