• David Disseldorp's avatar
    cifs: fix DFS traversal oops without CONFIG_CIFS_DFS_UPCALL · 179a88a8
    David Disseldorp authored
    When compiled with CONFIG_CIFS_DFS_UPCALL disabled, cifs_dfs_d_automount
    is NULL. cifs.ko logic for mapping CIFS_FATTR_DFS_REFERRAL attributes to
    S_AUTOMOUNT and corresponding dentry flags is retained regardless of
    CONFIG_CIFS_DFS_UPCALL, leading to a NULL pointer dereference in
    VFS follow_automount() when traversing a DFS referral link:
      BUG: kernel NULL pointer dereference, address: 0000000000000000
      ...
      Call Trace:
       <TASK>
       __traverse_mounts+0xb5/0x220
       ? cifs_revalidate_mapping+0x65/0xc0 [cifs]
       step_into+0x195/0x610
       ? lookup_fast+0xe2/0xf0
       path_lookupat+0x64/0x140
       filename_lookup+0xc2/0x140
       ? __create_object+0x299/0x380
       ? kmem_cache_alloc+0x119/0x220
       ? user_path_at_empty+0x31/0x50
       user_path_at_empty+0x31/0x50
       __x64_sys_chdir+0x2a/0xd0
       ? exit_to_user_mode_prepare+0xca/0x100
       do_syscall_64+0x42/0x90
       entry_SYSCALL_64_after_hwframe+0x72/0xdc
    
    This fix adds an inline cifs_dfs_d_automount() {return -EREMOTE} handler
    when CONFIG_CIFS_DFS_UPCALL is disabled. An alternative would be to
    avoid flagging S_AUTOMOUNT, etc. without CONFIG_CIFS_DFS_UPCALL. This
    approach was chosen as it provides more control over the error path.
    Signed-off-by: default avatarDavid Disseldorp <ddiss@suse.de>
    Cc: stable@vger.kernel.org
    Reviewed-by: default avatarPaulo Alcantara (SUSE) <pc@manguebit.com>
    Reviewed-by: default avatarRonnie Sahlberg <lsahlber@redhat.com>
    Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
    179a88a8
cifsfs.h 6.75 KB