s3: smbd: Correctly set smb2req->smb1req->posix_pathnames from the calling fsp on...
authorJeremy Allison <jra@samba.org>
Tue, 28 Mar 2023 20:53:20 +0000 (13:53 -0700)
committerRalph Boehme <slow@samba.org>
Fri, 31 Mar 2023 20:22:38 +0000 (20:22 +0000)
We must always do SMB3+POSIX operations on fsp's opened with a posix create context.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
14 files changed:
source3/smbd/globals.h
source3/smbd/smb2_break.c
source3/smbd/smb2_close.c
source3/smbd/smb2_create.c
source3/smbd/smb2_flush.c
source3/smbd/smb2_getinfo.c
source3/smbd/smb2_glue.c
source3/smbd/smb2_ioctl.c
source3/smbd/smb2_lock.c
source3/smbd/smb2_notify.c
source3/smbd/smb2_query_directory.c
source3/smbd/smb2_read.c
source3/smbd/smb2_setinfo.c
source3/smbd/smb2_write.c

index 5fb9f2e647c213c9dd8ecfe7b08b3d3841f5e704..ff69d95ddfb9f2f0a08aa030b08522e0b5f7dc72 100644 (file)
@@ -277,7 +277,8 @@ NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req,
                                         struct tevent_req *subreq,
                                         uint32_t defer_time);
 
-struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req);
+struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req,
+                                              struct files_struct *fsp);
 size_t smbd_smb2_unread_bytes(struct smbd_smb2_request *req);
 void remove_smb2_chained_fsp(files_struct *fsp);
 
index e8f6b99610108c9510b7a6cd9839c6f63c34f29b..f837b8eccc14584ec93122e743908a3bc7cca2a3 100644 (file)
@@ -185,7 +185,7 @@ static struct tevent_req *smbd_smb2_oplock_break_send(TALLOC_CTX *mem_ctx,
                  fsp_str_dbg(fsp), fsp_fnum_dbg(fsp),
                  oplocklevel));
 
-       smbreq = smbd_smb2_fake_smb_request(smb2req);
+       smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
        if (tevent_req_nomem(smbreq, req)) {
                return tevent_req_post(req, ev);
        }
index ed2b21dc5bcbee04607fad6d33d3d4fd6565f622..236d5b79f91e98c732ce924bbb91e89d457f21c1 100644 (file)
@@ -211,7 +211,7 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
        DEBUG(10,("smbd_smb2_close: %s - %s\n",
                  fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
 
-       smbreq = smbd_smb2_fake_smb_request(req);
+       smbreq = smbd_smb2_fake_smb_request(req, fsp);
        if (smbreq == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
index c17562e93e180c97a1a2cf15b866578edd2ef0c2..aba0857087095ba955fcd1cd25a9bd70ac354b70 100644 (file)
@@ -784,7 +784,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                .in_create_disposition = in_create_disposition,
        };
 
-       smb1req = smbd_smb2_fake_smb_request(smb2req);
+       smb1req = smbd_smb2_fake_smb_request(smb2req, NULL);
        if (tevent_req_nomem(smb1req, req)) {
                return tevent_req_post(req, state->ev);
        }
index 5c8c171e418e94f1f5f0b7c6059678d0658db92c..2d3e6319697616a2d7fd3a0631ee3ce7f31653cc 100644 (file)
@@ -140,7 +140,7 @@ static struct tevent_req *smbd_smb2_flush_send(TALLOC_CTX *mem_ctx,
        DEBUG(10,("smbd_smb2_flush: %s - %s\n",
                  fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
 
-       smbreq = smbd_smb2_fake_smb_request(smb2req);
+       smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
        if (tevent_req_nomem(smbreq, req)) {
                return tevent_req_post(req, ev);
        }
index 468010696fec8d99debc5960169a33fddda57f8a..51283eb174e79f31ff86f7de256c881ad5ba4d73 100644 (file)
@@ -277,7 +277,7 @@ static struct tevent_req *smbd_smb2_getinfo_send(TALLOC_CTX *mem_ctx,
        DEBUG(10,("smbd_smb2_getinfo_send: %s - %s\n",
                  fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
 
-       smbreq = smbd_smb2_fake_smb_request(smb2req);
+       smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
        if (tevent_req_nomem(smbreq, req)) {
                return tevent_req_post(req, ev);
        }
index 543c0a0b9e6b1d444548da9a4e826eb1c9dc95b9..563aaf88873c7dfa60512d6e5ccc162dc9af760f 100644 (file)
@@ -26,7 +26,8 @@
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_SMB2
 
-struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req)
+struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req,
+                                              struct files_struct *fsp)
 {
        struct smb_request *smbreq;
        const uint8_t *inhdr = SMBD_SMB2_IN_HDR_PTR(req);
@@ -67,6 +68,10 @@ struct smb_request *smbd_smb2_fake_smb_request(struct smbd_smb2_request *req)
        }
        smbreq->mid = BVAL(inhdr, SMB2_HDR_MESSAGE_ID);
        smbreq->chain_fsp = req->compat_chain_fsp;
+       if (fsp != NULL) {
+               smbreq->posix_pathnames =
+                       (fsp->fsp_name->flags & SMB_FILENAME_POSIX_PATH);
+       }
        smbreq->smb2req = req;
        req->smb1req = smbreq;
 
index e4f8c10e3afeaf3f4fb08c755ebc2805c620b2f2..2ca53e337883d358890c001884f1c4c375786d98 100644 (file)
@@ -445,7 +445,7 @@ static struct tevent_req *smbd_smb2_ioctl_send(TALLOC_CTX *mem_ctx,
                   fsp ? fsp_str_dbg(fsp) : "<no handle>",
                   fsp_fnum_dbg(fsp)));
 
-       smbreq = smbd_smb2_fake_smb_request(smb2req);
+       smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
        if (tevent_req_nomem(smbreq, req)) {
                return tevent_req_post(req, ev);
        }
index 48593af47905e2110b9618cc5cadcf3a0bbbe2f0..642e9c741510934563d7174705a03654c2b2063b 100644 (file)
@@ -237,7 +237,7 @@ static struct tevent_req *smbd_smb2_lock_send(TALLOC_CTX *mem_ctx,
 
        tevent_req_set_cleanup_fn(req, smbd_smb2_lock_cleanup);
 
-       state->smb1req = smbd_smb2_fake_smb_request(smb2req);
+       state->smb1req = smbd_smb2_fake_smb_request(smb2req, fsp);
        if (tevent_req_nomem(state->smb1req, req)) {
                return tevent_req_post(req, ev);
        }
index 133c990f0df910e41041ec27493e53779dd2350e..8cccd90b3fb03c257948cb479bc753c0bdfdf296 100644 (file)
@@ -232,7 +232,7 @@ static struct tevent_req *smbd_smb2_notify_send(TALLOC_CTX *mem_ctx,
        DEBUG(10,("smbd_smb2_notify_send: %s - %s\n",
                  fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
 
-       smbreq = smbd_smb2_fake_smb_request(smb2req);
+       smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
        if (tevent_req_nomem(smbreq, req)) {
                return tevent_req_post(req, ev);
        }
index 250b56633bbf7adf979dd7e91115650ab950dbbf..0cecd720602e62ef0e6a0b0bdbb9a4da4e2fbe87 100644 (file)
@@ -290,7 +290,7 @@ static struct tevent_req *smbd_smb2_query_directory_send(TALLOC_CTX *mem_ctx,
        DEBUG(10,("smbd_smb2_query_directory_send: %s - %s\n",
                  fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
 
-       state->smbreq = smbd_smb2_fake_smb_request(smb2req);
+       state->smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
        if (tevent_req_nomem(state->smbreq, req)) {
                return tevent_req_post(req, ev);
        }
index 4c6822f2c74ef741314d8b0ce30bd7ccd78bf47d..eb12dbd72693c184787688437dcfa865e7fe05d0 100644 (file)
@@ -480,7 +480,7 @@ static struct tevent_req *smbd_smb2_read_send(TALLOC_CTX *mem_ctx,
        DEBUG(10,("smbd_smb2_read: %s - %s\n",
                  fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
 
-       smbreq = smbd_smb2_fake_smb_request(smb2req);
+       smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
        if (tevent_req_nomem(smbreq, req)) {
                return tevent_req_post(req, ev);
        }
index 04fd9490fe9019d9201800ffb81e9d758a785b0a..f26fce77a2397bf557cd677a294d4593f1f28b8d 100644 (file)
@@ -392,7 +392,7 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx,
        DEBUG(10,("smbd_smb2_setinfo_send: %s - %s\n",
                  fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
 
-       smbreq = smbd_smb2_fake_smb_request(smb2req);
+       smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
        if (tevent_req_nomem(smbreq, req)) {
                return tevent_req_post(req, ev);
        }
index ff99127b067cb07fad6f26ebc1fd2f49a2aaa3ee..269c489642ec87ee3e2ee2a3933f77559daf937c 100644 (file)
@@ -297,7 +297,7 @@ static struct tevent_req *smbd_smb2_write_send(TALLOC_CTX *mem_ctx,
        DEBUG(10,("smbd_smb2_write: %s - %s\n",
                  fsp_str_dbg(fsp), fsp_fnum_dbg(fsp)));
 
-       smbreq = smbd_smb2_fake_smb_request(smb2req);
+       smbreq = smbd_smb2_fake_smb_request(smb2req, fsp);
        if (tevent_req_nomem(smbreq, req)) {
                return tevent_req_post(req, ev);
        }