smbd: use real dirfsp for SMB_VFS_UNLINKAT() in remove_msdfs_link()
authorRalph Boehme <slow@samba.org>
Fri, 22 Jan 2021 13:51:33 +0000 (14:51 +0100)
committerJeremy Allison <jra@samba.org>
Thu, 28 Jan 2021 08:11:49 +0000 (08:11 +0000)
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/smbd/msdfs.c

index dbdca66a530a02dbdf122c98bee38944f4668e8a..6f7707dbc9b005df4c0b784e89e29e6243e49db1 100644 (file)
@@ -1464,6 +1464,9 @@ bool remove_msdfs_link(const struct junction_map *jucn,
        connection_struct *conn;
        bool ret = False;
        struct smb_filename *smb_fname;
+       struct smb_filename *parent_fname = NULL;
+       struct smb_filename *at_fname = NULL;
+       NTSTATUS status;
        bool ok;
        int retval;
 
@@ -1496,9 +1499,19 @@ bool remove_msdfs_link(const struct junction_map *jucn,
                return false;
        }
 
+       status = parent_pathref(frame,
+                               conn->cwd_fsp,
+                               smb_fname,
+                               &parent_fname,
+                               &at_fname);
+       if (!NT_STATUS_IS_OK(status)) {
+               TALLOC_FREE(frame);
+               return false;
+       }
+
        retval = SMB_VFS_UNLINKAT(conn,
-                       conn->cwd_fsp,
-                       smb_fname,
+                       parent_fname->fsp,
+                       at_fname,
                        0);
        if (retval == 0) {
                ret = True;