]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: Use struct oplock_break_message for MSG_CLOSE_FILE
authorVolker Lendecke <vl@samba.org>
Tue, 30 Apr 2024 08:35:06 +0000 (10:35 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 30 Apr 2024 22:44:32 +0000 (22:44 +0000)
We only need to transmit the file_id and share_file_id. Next patch
will show why :-)

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/include/smb.h
source3/rpc_server/srvsvc/srv_srvsvc_nt.c
source3/smbd/close.c

index aa91e3afcb96298ea4097b8272743863e13a51e3..76291d93267660a7913d1aa0262cd8e003dc30ec 100644 (file)
@@ -211,7 +211,6 @@ Offset  Data                        length.
 #define OP_BREAK_MSG_NAME_HASH_OFFSET 68
 
 #define OP_BREAK_MSG_VNN_OFFSET 72
-#define MSG_SMB_SHARE_MODE_ENTRY_SIZE 76
 
 #define NT_HASH_LEN 16
 #define LM_HASH_LEN 16
index 29d224c427d6857d58e2adada3ef16b97deac70d..1129576f751ec5d4060401d416ae02ce536d3e30 100644 (file)
@@ -30,6 +30,7 @@
 #include "librpc/rpc/dcesrv_core.h"
 #include "librpc/gen_ndr/ndr_srvsvc.h"
 #include "librpc/gen_ndr/ndr_srvsvc_scompat.h"
+#include "librpc/gen_ndr/ndr_open_files.h"
 #include "../libcli/security/security.h"
 #include "../librpc/gen_ndr/ndr_security.h"
 #include "../librpc/gen_ndr/open_files.h"
@@ -2891,10 +2892,17 @@ static int enum_file_close_fn(struct file_id id,
                              const struct share_mode_entry *e,
                              void *private_data)
 {
-       char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
        struct enum_file_close_state *state =
                (struct enum_file_close_state *)private_data;
        uint32_t fid = (((uint32_t)(procid_to_pid(&e->pid))<<16) | e->share_file_id);
+       struct oplock_break_message msg = {
+               .id = id,
+               .share_file_id = e->share_file_id,
+       };
+       enum ndr_err_code ndr_err;
+       uint8_t msgbuf[33];
+       DATA_BLOB blob = {.data = msgbuf, .length = sizeof(msgbuf)};
+       NTSTATUS status;
 
        if (fid != state->r->in.fid) {
                return 0; /* Not this file. */
@@ -2908,12 +2916,24 @@ static int enum_file_close_fn(struct file_id id,
        DBG_DEBUG("request to close file %s, %s\n", d->servicepath,
                  share_mode_str(talloc_tos(), 0, &id, e));
 
-       share_mode_entry_to_message(msg, &id, e);
+       ndr_err = ndr_push_struct_into_fixed_blob(
+               &blob,
+               &msg,
+               (ndr_push_flags_fn_t)ndr_push_oplock_break_message);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               DBG_WARNING("ndr_push_oplock_break_message failed: %s\n",
+                           ndr_errstr(ndr_err));
+               status = ndr_map_error2ntstatus(ndr_err);
+       } else {
+               status = messaging_send(state->msg_ctx,
+                                       e->pid,
+                                       MSG_SMB_CLOSE_FILE,
+                                       &blob);
+       }
 
-       state->r->out.result = ntstatus_to_werror(
-               messaging_send_buf(state->msg_ctx,
-                               e->pid, MSG_SMB_CLOSE_FILE,
-                               (uint8_t *)msg, sizeof(msg)));
+       if (!NT_STATUS_IS_OK(status)) {
+               state->r->out.result = ntstatus_to_werror(status);
+       }
 
        return 0;
 }
index 987a0ed51835db7c63bf41f309d3eb095cc5493a..7c5c4d68bee20d7db31250814799a46c41e829a1 100644 (file)
@@ -32,7 +32,7 @@
 #include "transfer_file.h"
 #include "auth.h"
 #include "messages.h"
-#include "../librpc/gen_ndr/open_files.h"
+#include "librpc/gen_ndr/ndr_open_files.h"
 #include "lib/util/tevent_ntstatus.h"
 #include "source3/smbd/dir.h"
 
@@ -1714,26 +1714,24 @@ void msg_close_file(struct messaging_context *msg_ctx,
                        struct server_id server_id,
                        DATA_BLOB *data)
 {
+       struct oplock_break_message msg;
+       enum ndr_err_code ndr_err;
        files_struct *fsp = NULL;
-       struct file_id id;
-       struct share_mode_entry e;
        struct smbd_server_connection *sconn =
                talloc_get_type_abort(private_data,
                struct smbd_server_connection);
 
-       message_to_share_mode_entry(&id, &e, (char *)data->data);
-
-       if(DEBUGLVL(10)) {
-               char *sm_str = share_mode_str(NULL, 0, &id, &e);
-               if (!sm_str) {
-                       smb_panic("talloc failed");
-               }
-               DEBUG(10,("msg_close_file: got request to close share mode "
-                       "entry %s\n", sm_str));
-               TALLOC_FREE(sm_str);
+       ndr_err = ndr_pull_struct_blob_all_noalloc(
+               data,
+               &msg,
+               (ndr_pull_flags_fn_t)ndr_pull_oplock_break_message);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               DBG_DEBUG("ndr_pull_oplock_break_message failed: %s\n",
+                         ndr_errstr(ndr_err));
+               return;
        }
 
-       fsp = file_find_dif(sconn, id, e.share_file_id);
+       fsp = file_find_dif(sconn, msg.id, msg.share_file_id);
        if (!fsp) {
                DEBUG(10,("msg_close_file: failed to find file.\n"));
                return;