smbd: use real dirfsp for SMB_VFS_UNLINKAT() in py_smbd_unlink()
authorRalph Boehme <slow@samba.org>
Fri, 22 Jan 2021 13:54:18 +0000 (14:54 +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/pysmbd.c

index fdc8cd7e022f06da021f7bddae2088c93df6440d..c78aefd32f78f45a4521469f4f90049897a2c1f8 100644 (file)
@@ -648,10 +648,13 @@ static PyObject *py_smbd_unlink(PyObject *self, PyObject *args, PyObject *kwargs
        connection_struct *conn;
        int ret;
        struct smb_filename *smb_fname = NULL;
+       struct smb_filename *parent_fname = NULL;
+       struct smb_filename *at_fname = NULL;
        PyObject *py_session = Py_None;
        struct auth_session_info *session_info = NULL;
        char *fname, *service = NULL;
        TALLOC_CTX *frame;
+       NTSTATUS status;
 
        frame = talloc_stackframe();
 
@@ -694,9 +697,19 @@ static PyObject *py_smbd_unlink(PyObject *self, PyObject *args, PyObject *kwargs
                return PyErr_NoMemory();
        }
 
+       status = parent_pathref(frame,
+                               conn->cwd_fsp,
+                               smb_fname,
+                               &parent_fname,
+                               &at_fname);
+       if (!NT_STATUS_IS_OK(status)) {
+               TALLOC_FREE(frame);
+               return PyErr_NoMemory();
+       }
+
        ret = SMB_VFS_UNLINKAT(conn,
-                       conn->cwd_fsp,
-                       smb_fname,
+                       parent_fname->fsp,
+                       at_fname,
                        0);
        if (ret != 0) {
                TALLOC_FREE(frame);