The branch, master has been updated
       via  ab648a4c635 smbd: Do oplock break messages in ndr
       via  3d9a720f092 smbd: Use send_break_message() in send_break_to_none()
       via  c67694ee0ff smbd: Remove a pointless "continue" statement
       via  8c6fd8bb07d smbd: Remove an obsolete comment from share_conflict()
       via  1078b273f84 s3: smbd: Don't log at WARNING level when exiting the 
server on error.
      from  749f1290ce6 lib:util: Fix tfork return value if sigprocmask fails

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit ab648a4c63524038c9626a77be243c79c51975ac
Author: Volker Lendecke <[email protected]>
Date:   Thu May 16 15:38:26 2019 +0200

    smbd: Do oplock break messages in ndr
    
    The previous scheme was overloaded, a idl definition is easier to
    print, and it clarifies what data is actually needed
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    
    Autobuild-User(master): Jeremy Allison <[email protected]>
    Autobuild-Date(master): Thu May 16 23:48:18 UTC 2019 on sn-devel-184

commit 3d9a720f092b8c45184a0d53540fb490a3fdef9d
Author: Volker Lendecke <[email protected]>
Date:   Thu May 16 15:34:37 2019 +0200

    smbd: Use send_break_message() in send_break_to_none()
    
    Centralize the marshalling code
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit c67694ee0fff6f444813a9a9f39a156ddff5019e
Author: Volker Lendecke <[email protected]>
Date:   Thu May 16 12:53:13 2019 +0200

    smbd: Remove a pointless "continue" statement
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 8c6fd8bb07d6a2f6ded43f584627faa8432eab67
Author: Volker Lendecke <[email protected]>
Date:   Thu May 16 12:23:26 2019 +0200

    smbd: Remove an obsolete comment from share_conflict()
    
    delay_for_batch_oplocks() is no more. Also, open_mode_check (which
    calls into this routine) is called before delay_for_oplock.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 1078b273f84cf216b50ddec18ee6a2b3c8c17bc6
Author: Richard Sharpe <[email protected]>
Date:   Thu May 16 13:51:06 2019 -0700

    s3: smbd: Don't log at WARNING level when exiting the server on error.
    
    Signed-off-by: Richard Sharpe <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 source3/librpc/idl/open_files.idl |  6 +++++
 source3/smbd/open.c               | 49 ++++++++++++++++++----------------
 source3/smbd/oplock.c             | 55 +++++++++++++++++++++------------------
 source3/smbd/server.c             |  2 +-
 4 files changed, 64 insertions(+), 48 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/librpc/idl/open_files.idl 
b/source3/librpc/idl/open_files.idl
index 2f6f861b5e6..a823e3f9134 100644
--- a/source3/librpc/idl/open_files.idl
+++ b/source3/librpc/idl/open_files.idl
@@ -98,4 +98,10 @@ interface open_files
                timespec close_write_time;
                vfs_default_durable_stat stat_info;
        } vfs_default_durable_cookie;
+
+       typedef [public] struct {
+               file_id id;
+               udlong share_file_id;
+               uint8 break_to;
+       } oplock_break_message;
 }
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index e9112dcfcf2..2d5815069f2 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -29,7 +29,7 @@
 #include "fake_file.h"
 #include "../libcli/security/security.h"
 #include "../librpc/gen_ndr/ndr_security.h"
-#include "../librpc/gen_ndr/open_files.h"
+#include "../librpc/gen_ndr/ndr_open_files.h"
 #include "../librpc/gen_ndr/idmap.h"
 #include "../librpc/gen_ndr/ioctl.h"
 #include "passdb/lookup_sid.h"
@@ -1472,10 +1472,6 @@ static bool share_conflict(struct share_mode_entry 
*entry,
                  (unsigned int)entry->private_options));
 
        if (server_id_is_disconnected(&entry->pid)) {
-               /*
-                * note: cleanup should have been done by
-                * delay_for_batch_oplocks()
-                */
                return false;
        }
 
@@ -1699,26 +1695,36 @@ NTSTATUS send_break_message(struct messaging_context 
*msg_ctx,
                            const struct share_mode_entry *exclusive,
                            uint16_t break_to)
 {
+       struct oplock_break_message msg = {
+               .id = *id,
+               .share_file_id = exclusive->share_file_id,
+               .break_to = break_to,
+       };
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
        NTSTATUS status;
-       char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
-       struct server_id_buf tmp;
-
-       DEBUG(10, ("Sending break request to PID %s\n",
-                  server_id_str_buf(exclusive->pid, &tmp)));
 
-       /* Create the message. */
-       share_mode_entry_to_message(msg, id, exclusive);
+       if (DEBUGLVL(10)) {
+               struct server_id_buf buf;
+               DBG_DEBUG("Sending break message to %s\n",
+                         server_id_str_buf(exclusive->pid, &buf));
+               NDR_PRINT_DEBUG(oplock_break_message, &msg);
+       }
 
-       /* Overload entry->op_type */
-       /*
-        * This is a cut from uint32_t to uint16_t, but so far only the lower 3
-        * bits (LEASE_WRITE/HANDLE/READ) are used anyway.
-        */
-       SSVAL(msg,OP_BREAK_MSG_OP_TYPE_OFFSET, break_to);
+       ndr_err = ndr_push_struct_blob(
+               &blob,
+               talloc_tos(),
+               &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));
+               return ndr_map_error2ntstatus(ndr_err);
+       }
 
-       status = messaging_send_buf(msg_ctx, exclusive->pid,
-                                   MSG_SMB_BREAK_REQUEST,
-                                   (uint8_t *)msg, sizeof(msg));
+       status = messaging_send(
+               msg_ctx, exclusive->pid, MSG_SMB_BREAK_REQUEST, &blob);
+       TALLOC_FREE(blob.data);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(3, ("Could not send oplock break message: %s\n",
                          nt_errstr(status)));
@@ -1954,7 +1960,6 @@ static bool delay_for_oplock(files_struct *fsp,
                if (lease_is_breaking && !first_open_attempt) {
                        delay = true;
                }
-               continue;
        }
 
        return delay;
diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c
index 22277abab07..b99b9cb4f08 100644
--- a/source3/smbd/oplock.c
+++ b/source3/smbd/oplock.c
@@ -945,8 +945,8 @@ static void process_oplock_break_message(struct 
messaging_context *msg_ctx,
                                         struct server_id src,
                                         DATA_BLOB *data)
 {
-       struct file_id id;
-       struct share_mode_entry msg;
+       struct oplock_break_message *msg = NULL;
+       enum ndr_err_code ndr_err;
        files_struct *fsp;
        bool use_kernel;
        struct smbd_server_connection *sconn =
@@ -957,28 +957,35 @@ static void process_oplock_break_message(struct 
messaging_context *msg_ctx,
        uint16_t break_from;
        uint16_t break_to;
        bool break_needed = true;
-       struct server_id_buf tmp;
 
-       if (data->data == NULL) {
-               DEBUG(0, ("Got NULL buffer\n"));
+       msg = talloc(talloc_tos(), struct oplock_break_message);
+       if (msg == NULL) {
+               DBG_WARNING("talloc failed\n");
                return;
        }
 
-       if (data->length != MSG_SMB_SHARE_MODE_ENTRY_SIZE) {
-               DEBUG(0, ("Got invalid msg len %d\n", (int)data->length));
+       ndr_err = ndr_pull_struct_blob_all(
+               data,
+               msg,
+               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));
+               TALLOC_FREE(msg);
                return;
        }
+       if (DEBUGLEVEL >= 10) {
+               struct server_id_buf buf;
+               DBG_DEBUG("Got break message from %s\n",
+                         server_id_str_buf(src, &buf));
+               NDR_PRINT_DEBUG(oplock_break_message, msg);
+       }
 
-       /* De-linearize incoming message. */
-       message_to_share_mode_entry(&id, &msg, (char *)data->data);
-       break_to = msg.op_type;
-
-       DEBUG(10, ("Got oplock break to %u message from pid %s: %s/%llu\n",
-                  (unsigned)break_to, server_id_str_buf(src, &tmp),
-                  file_id_string_tos(&id),
-                  (unsigned long long)msg.share_file_id));
+       break_to = msg->break_to;
+       fsp = initial_break_processing(sconn, msg->id, msg->share_file_id);
 
-       fsp = initial_break_processing(sconn, id, msg.share_file_id);
+       TALLOC_FREE(msg);
 
        if (fsp == NULL) {
                /* We hit a race here. Break messages are sent, and before we
@@ -1040,7 +1047,7 @@ static void process_oplock_break_message(struct 
messaging_context *msg_ctx,
 
                status = leases_db_get(client_guid,
                                       &fsp->lease->lease.lease_key,
-                                      &id,
+                                      &fsp->file_id,
                                       &current_state,
                                       &breaking,
                                       &breaking_to_requested,
@@ -1327,14 +1334,12 @@ static void send_break_to_none(struct messaging_context 
*msg_ctx,
                               const struct file_id *id,
                               const struct share_mode_entry *e)
 {
-       char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
-
-       share_mode_entry_to_message(msg, id, e);
-       /* Overload entry->op_type */
-       SSVAL(msg, OP_BREAK_MSG_OP_TYPE_OFFSET, NO_OPLOCK);
-
-       messaging_send_buf(msg_ctx, e->pid, MSG_SMB_BREAK_REQUEST,
-                          (uint8_t *)msg, sizeof(msg));
+       NTSTATUS status;
+       status = send_break_message(msg_ctx, id, e, OPLOCK_NONE);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_DEBUG("send_break_message failed: %s\n",
+                         nt_errstr(status));
+       }
 }
 
 static bool do_break_lease_to_none(struct share_mode_lock *lck,
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 3ef7befef3f..3ac9be90f7d 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -2101,7 +2101,7 @@ extern void build_options(bool screen);
        if (lp_clustering() && !lp_allow_unsafe_cluster_upgrade()) {
                status = smbd_claim_version(msg_ctx, samba_version_string());
                if (!NT_STATUS_IS_OK(status)) {
-                       DBG_WARNING("Could not claim version: %s\n",
+                       DBG_ERR("Could not claim version: %s\n",
                                    nt_errstr(status));
                        return -1;
                }


-- 
Samba Shared Repository

Reply via email to