From: Volker Lendecke Date: Tue, 30 Apr 2024 08:35:06 +0000 (+0200) Subject: smbd: Use struct oplock_break_message for MSG_CLOSE_FILE X-Git-Tag: tdb-1.4.11~880 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=037b9dac21b4aabcc56169b533cbed749e6fee6c;p=thirdparty%2Fsamba.git smbd: Use struct oplock_break_message for MSG_CLOSE_FILE We only need to transmit the file_id and share_file_id. Next patch will show why :-) Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/source3/include/smb.h b/source3/include/smb.h index aa91e3afcb9..76291d93267 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -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 diff --git a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c index 29d224c427d..1129576f751 100644 --- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c +++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c @@ -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; } diff --git a/source3/smbd/close.c b/source3/smbd/close.c index 987a0ed5183..7c5c4d68bee 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -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;