The branch, master has been updated
       via  abcd095 s3:smbd/close: call del_share_mode() directly before 
TALLOC_FREE(lck)
       via  f66d88d s3:smbd/close: remove unused goto out from close_directory()
       via  8751c3f s3:smbd/close: do an early return in close_directory()
       via  d792f59 s3: Fix an assert to trigger in close_remove_share_mode
       via  b9e11bd s3: Do an early return in close_remove_share_mode
       via  2e95b77 s3: Make close_remove_share_mode a bit more readable
       via  dec08b8 s3: Simplify get_delete_on_close_token more
       via  103b89f s3: Simplify get_delete_on_close_token slightly
       via  8541829 s3: Slightly simplify close_remove_share_mode
       via  8486d51 s3:smbd/close: avoid procid_is_me()
       via  85e6dcf s3:smbd/open: avoid procid_is_me()
       via  9dba59d s3:smbd/oplock: avoid procid_is_me()
      from  ad26c2a build: Match autoconf build and disable ACLs on MacOS 
(darwin)

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


- Log -----------------------------------------------------------------
commit abcd095847c7438c3be39f6c9200a04c90394ed6
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Jun 2 14:06:29 2012 +0200

    s3:smbd/close: call del_share_mode() directly before TALLOC_FREE(lck)
    
    metze
    
    Autobuild-User: Stefan Metzmacher <[email protected]>
    Autobuild-Date: Sun Jun  3 21:08:19 CEST 2012 on sn-devel-104

commit f66d88d10afff65d743663b2e27a94271225b229
Author: Stefan Metzmacher <[email protected]>
Date:   Sun Jun 3 15:17:29 2012 +0200

    s3:smbd/close: remove unused goto out from close_directory()
    
    metze

commit 8751c3f2ef5700c4b317bfecf0e68facf09c6c1e
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Jun 2 14:04:52 2012 +0200

    s3:smbd/close: do an early return in close_directory()
    
    metze

commit d792f59aeb4e74ea14d3c5979addd31b78b1a2d9
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Jun 1 16:29:51 2012 +0200

    s3: Fix an assert to trigger in close_remove_share_mode
    
    In case we have a left-over entry in the share mode entry array,
    the SMB_ASSERT(got_tokens) is likely to kick in. It happens when
    we are about to delete a file with initial delete on close. We don't
    have a delete on close token set in the locking.tdb record. We see
    the fsp->initial_delete_on_close set, add the delete_on_close token
    to lck. Then "delete_file" is being set to true. Then later on we
    do the notify_deferred_opens. This walks the list, also checking
    for share_mode_stale_pid. We have already deleted our own share
    mode entry, share_mode_stale_pid() sees the left-over entry. It not
    also deletes that one but also the delete on close token. This leads
    to a different view of "delete_file" a.k.a. "got_tokens" further
    down in close_remove_share_mode, leading the SMB_ASSERT to fire.
    
    This patch attempts to fix the issue by keeping around our own share
    mode entry for almost the whole routine, preventing share_mode_stale_pid()
    from removing the delete tokens.
    
    Pair-Programmed-With: Volker Lendecke <[email protected]>

commit b9e11bd63ee6e1f1aac8d3b8a61ef0a4734cdd98
Author: Volker Lendecke <[email protected]>
Date:   Fri Jun 1 16:42:29 2012 +0200

    s3: Do an early return in close_remove_share_mode
    
    Without "lck" we don't have much to clean up
    
    Signed-off-by: Stefan Metzmacher <[email protected]>

commit 2e95b77c993045cb448d36240ea38b44b5418c7e
Author: Volker Lendecke <[email protected]>
Date:   Fri Jun 1 16:13:22 2012 +0200

    s3: Make close_remove_share_mode a bit more readable
    
    by introducing a variable simplifying a boolean expression
    
    Signed-off-by: Stefan Metzmacher <[email protected]>

commit dec08b8041c88211efa9efd190c3bb6b6946f599
Author: Volker Lendecke <[email protected]>
Date:   Fri Jun 1 15:52:14 2012 +0200

    s3: Simplify get_delete_on_close_token more
    
    All remaining callers actually want the token
    
    Signed-off-by: Stefan Metzmacher <[email protected]>

commit 103b89fb071966eb5ca135039249e5def5eb0250
Author: Volker Lendecke <[email protected]>
Date:   Fri Jun 1 15:50:39 2012 +0200

    s3: Simplify get_delete_on_close_token slightly
    
    Introduce find_delete_on_close_token. Thus is_delete_on_close_set
    does not have to call get_delete_on_close_token anymore.
    
    Signed-off-by: Stefan Metzmacher <[email protected]>

commit 8541829a9ab20c7fa8c892490284c31593eb2fb8
Author: Volker Lendecke <[email protected]>
Date:   Fri Jun 1 15:21:12 2012 +0200

    s3: Slightly simplify close_remove_share_mode
    
    Remove a level of indentation by more use of "continue;"
    
    Signed-off-by: Stefan Metzmacher <[email protected]>

commit 8486d514f5c964b6c20c36f2e7938ad9cd943c70
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Jun 2 13:42:09 2012 +0200

    s3:smbd/close: avoid procid_is_me()
    
    metze

commit 85e6dcf49c24510ac9c31d56e8d7d1873d9cc638
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Jun 2 13:40:26 2012 +0200

    s3:smbd/open: avoid procid_is_me()
    
    metze

commit 9dba59d0269f617af02bdc681261436a96ec34d1
Author: Stefan Metzmacher <[email protected]>
Date:   Sat Jun 2 13:39:33 2012 +0200

    s3:smbd/oplock: avoid procid_is_me()
    
    metze

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

Summary of changes:
 source3/locking/locking.c |   47 ++++++++++++++----------
 source3/smbd/close.c      |   87 +++++++++++++++++++++++++++++----------------
 source3/smbd/open.c       |    9 +++--
 source3/smbd/oplock.c     |    6 ++-
 4 files changed, 93 insertions(+), 56 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/locking/locking.c b/source3/locking/locking.c
index 76c2bc7..5da7595 100644
--- a/source3/locking/locking.c
+++ b/source3/locking/locking.c
@@ -1045,6 +1045,26 @@ bool set_delete_on_close(files_struct *fsp, bool 
delete_on_close,
        return True;
 }
 
+static struct delete_token *find_delete_on_close_token(
+       struct share_mode_data *d, uint32_t name_hash)
+{
+       uint32_t i;
+
+       DEBUG(10, ("find_delete_on_close_token: name_hash = 0x%x\n",
+                  (unsigned int)name_hash));
+
+       for (i=0; i<d->num_delete_tokens; i++) {
+               struct delete_token *dt = &d->delete_tokens[i];
+
+               DEBUG(10, ("find__delete_on_close_token: dt->name_hash = 
0x%x\n",
+                          (unsigned int)dt->name_hash ));
+               if (dt->name_hash == name_hash) {
+                       return dt;
+               }
+       }
+       return NULL;
+}
+
 /****************************************************************************
  Return the NT token and UNIX token if there's a match. Return true if
  found, false if not.
@@ -1055,31 +1075,20 @@ bool get_delete_on_close_token(struct share_mode_lock 
*lck,
                                        const struct security_token **pp_nt_tok,
                                        const struct security_unix_token 
**pp_tok)
 {
-       int i;
+       struct delete_token *dt;
 
-       DEBUG(10,("get_delete_on_close_token: name_hash = 0x%x\n",
-                       (unsigned int)name_hash ));
-
-       for (i=0; i<lck->data->num_delete_tokens; i++) {
-               struct delete_token *dt = &lck->data->delete_tokens[i];
-               DEBUG(10,("get_delete_on_close_token: dtl->name_hash = 0x%x\n",
-                               (unsigned int)dt->name_hash ));
-               if (dt->name_hash == name_hash) {
-                       if (pp_nt_tok) {
-                               *pp_nt_tok = dt->delete_nt_token;
-                       }
-                       if (pp_tok) {
-                               *pp_tok =  dt->delete_token;
-                       }
-                       return true;
-               }
+       dt = find_delete_on_close_token(lck->data, name_hash);
+       if (dt == NULL) {
+               return false;
        }
-       return false;
+       *pp_nt_tok = dt->delete_nt_token;
+       *pp_tok =  dt->delete_token;
+       return true;
 }
 
 bool is_delete_on_close_set(struct share_mode_lock *lck, uint32_t name_hash)
 {
-       return get_delete_on_close_token(lck, name_hash, NULL, NULL);
+       return find_delete_on_close_token(lck->data, name_hash) != NULL;
 }
 
 bool set_sticky_write_time(struct file_id fileid, struct timespec write_time)
diff --git a/source3/smbd/close.c b/source3/smbd/close.c
index 4b7f694..1fb7bde 100644
--- a/source3/smbd/close.c
+++ b/source3/smbd/close.c
@@ -170,6 +170,7 @@ static int compare_share_mode_times(const void *p1, const 
void *p2)
 static void notify_deferred_opens(struct smbd_server_connection *sconn,
                                  struct share_mode_lock *lck)
 {
+       struct server_id self = messaging_server_id(sconn->msg_ctx);
        uint32_t i, num_deferred;
        struct share_mode_entry *deferred;
 
@@ -231,7 +232,7 @@ static void notify_deferred_opens(struct 
smbd_server_connection *sconn,
        for (i=0; i<num_deferred; i++) {
                struct share_mode_entry *e = &deferred[i];
 
-               if (procid_is_me(&e->pid)) {
+               if (procid_equal(&self, &e->pid)) {
                        /*
                         * We need to notify ourself to retry the open.  Do
                         * this by finding the queued SMB record, moving it to
@@ -331,6 +332,7 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
                                        enum file_close_type close_type)
 {
        connection_struct *conn = fsp->conn;
+       struct server_id self = messaging_server_id(conn->sconn->msg_ctx);
        bool delete_file = false;
        bool changed_user = false;
        struct share_mode_lock *lck = NULL;
@@ -340,6 +342,7 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
        const struct security_unix_token *del_token = NULL;
        const struct security_token *del_nt_token = NULL;
        bool got_tokens = false;
+       bool normal_close;
 
        /* Ensure any pending write time updates are done. */
        if (fsp->update_write_time_event) {
@@ -359,8 +362,7 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
        if (lck == NULL) {
                DEBUG(0, ("close_remove_share_mode: Could not get share mode "
                          "lock for file %s\n", fsp_str_dbg(fsp)));
-               status = NT_STATUS_INVALID_PARAMETER;
-               goto done;
+               return NT_STATUS_INVALID_PARAMETER;
        }
 
        if (fsp->write_time_forced) {
@@ -385,12 +387,6 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
                }
        }
 
-       if (!del_share_mode(lck, fsp)) {
-               DEBUG(0, ("close_remove_share_mode: Could not delete share "
-                         "entry for file %s\n",
-                         fsp_str_dbg(fsp)));
-       }
-
        if (fsp->initial_delete_on_close &&
                        !is_delete_on_close_set(lck, fsp->name_hash)) {
                bool became_user = False;
@@ -420,17 +416,26 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
                   POSIX delete now. */
                for (i=0; i<lck->data->num_share_modes; i++) {
                        struct share_mode_entry *e = &lck->data->share_modes[i];
-                       if (is_valid_share_mode_entry(e) &&
-                                       e->name_hash == fsp->name_hash) {
-                               if (fsp->posix_open && (e->flags & 
SHARE_MODE_FLAG_POSIX_OPEN)) {
-                                       continue;
-                               }
-                               if (share_mode_stale_pid(lck->data, i)) {
-                                       continue;
-                               }
-                               delete_file = False;
-                               break;
+
+                       if (!is_valid_share_mode_entry(e)) {
+                               continue;
+                       }
+                       if (e->name_hash != fsp->name_hash) {
+                               continue;
+                       }
+                       if (fsp->posix_open
+                           && (e->flags & SHARE_MODE_FLAG_POSIX_OPEN)) {
+                               continue;
+                       }
+                       if (procid_equal(&self, &e->pid) &&
+                           (e->share_file_id == fsp->fh->gen_id)) {
+                               continue;
+                       }
+                       if (share_mode_stale_pid(lck->data, i)) {
+                               continue;
                        }
+                       delete_file = False;
+                       break;
                }
        }
 
@@ -443,8 +448,16 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
         * reference to a file.
         */
 
-       if (!(close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE) ||
-                       !delete_file) {
+       normal_close = (close_type == NORMAL_CLOSE || close_type == 
SHUTDOWN_CLOSE);
+
+       if (!normal_close || !delete_file) {
+
+               if (!del_share_mode(lck, fsp)) {
+                       DEBUG(0, ("close_remove_share_mode: Could not delete "
+                                 "share entry for file %s\n",
+                                 fsp_str_dbg(fsp)));
+               }
+
                TALLOC_FREE(lck);
                return NT_STATUS_OK;
        }
@@ -564,6 +577,11 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
                pop_sec_ctx();
        }
 
+       if (!del_share_mode(lck, fsp)) {
+               DEBUG(0, ("close_remove_share_mode: Could not delete share "
+                         "entry for file %s\n", fsp_str_dbg(fsp)));
+       }
+
        TALLOC_FREE(lck);
 
        if (delete_file) {
@@ -1029,6 +1047,7 @@ static NTSTATUS rmdir_internals(TALLOC_CTX *ctx, 
files_struct *fsp)
 static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
                                enum file_close_type close_type)
 {
+       struct server_id self = messaging_server_id(fsp->conn->sconn->msg_ctx);
        struct share_mode_lock *lck = NULL;
        bool delete_dir = False;
        NTSTATUS status = NT_STATUS_OK;
@@ -1045,13 +1064,7 @@ static NTSTATUS close_directory(struct smb_request *req, 
files_struct *fsp,
        if (lck == NULL) {
                DEBUG(0, ("close_directory: Could not get share mode lock for "
                          "%s\n", fsp_str_dbg(fsp)));
-               status = NT_STATUS_INVALID_PARAMETER;
-               goto out;
-       }
-
-       if (!del_share_mode(lck, fsp)) {
-               DEBUG(0, ("close_directory: Could not delete share entry for "
-                         "%s\n", fsp_str_dbg(fsp)));
+               return NT_STATUS_INVALID_PARAMETER;
        }
 
        if (fsp->initial_delete_on_close) {
@@ -1090,6 +1103,10 @@ static NTSTATUS close_directory(struct smb_request *req, 
files_struct *fsp,
                                if (fsp->posix_open && (e->flags & 
SHARE_MODE_FLAG_POSIX_OPEN)) {
                                        continue;
                                }
+                               if (procid_equal(&self, &e->pid) &&
+                                   (e->share_file_id == fsp->fh->gen_id)) {
+                                       continue;
+                               }
                                if (share_mode_stale_pid(lck->data, i)) {
                                        continue;
                                }
@@ -1114,6 +1131,11 @@ static NTSTATUS close_directory(struct smb_request *req, 
files_struct *fsp,
                                del_token->groups,
                                del_nt_token);
 
+               if (!del_share_mode(lck, fsp)) {
+                       DEBUG(0, ("close_directory: Could not delete share 
entry for "
+                                 "%s\n", fsp_str_dbg(fsp)));
+               }
+
                TALLOC_FREE(lck);
 
                if ((fsp->conn->fs_capabilities & FILE_NAMED_STREAMS)
@@ -1123,7 +1145,7 @@ static NTSTATUS close_directory(struct smb_request *req, 
files_struct *fsp,
                        if (!NT_STATUS_IS_OK(status)) {
                                DEBUG(5, ("delete_all_streams failed: %s\n",
                                          nt_errstr(status)));
-                               goto out;
+                               return status;
                        }
                }
 
@@ -1145,6 +1167,11 @@ static NTSTATUS close_directory(struct smb_request *req, 
files_struct *fsp,
                        remove_pending_change_notify_requests_by_fid(fsp, 
NT_STATUS_DELETE_PENDING);
                }
        } else {
+               if (!del_share_mode(lck, fsp)) {
+                       DEBUG(0, ("close_directory: Could not delete share 
entry for "
+                                 "%s\n", fsp_str_dbg(fsp)));
+               }
+
                TALLOC_FREE(lck);
                remove_pending_change_notify_requests_by_fid(
                        fsp, NT_STATUS_OK);
@@ -1164,8 +1191,6 @@ static NTSTATUS close_directory(struct smb_request *req, 
files_struct *fsp,
        close_filestruct(fsp);
        file_free(req, fsp);
 
- out:
-       TALLOC_FREE(lck);
        if (NT_STATUS_IS_OK(status) && !NT_STATUS_IS_OK(status1)) {
                status = status1;
        }
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 9042e90..17721c6 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -894,9 +894,10 @@ static void validate_my_share_entries(struct 
smbd_server_connection *sconn,
                                      int num,
                                      struct share_mode_entry *share_entry)
 {
+       struct server_id self = messaging_server_id(sconn->msg_ctx);
        files_struct *fsp;
 
-       if (!procid_is_me(&share_entry->pid)) {
+       if (!procid_equal(&self, &share_entry->pid)) {
                return;
        }
 
@@ -1335,6 +1336,7 @@ static void defer_open(struct share_mode_lock *lck,
                       struct smb_request *req,
                       struct deferred_open_record *state)
 {
+       struct server_id self = messaging_server_id(req->sconn->msg_ctx);
        int i;
 
        /* Paranoia check */
@@ -1343,7 +1345,7 @@ static void defer_open(struct share_mode_lock *lck,
                struct share_mode_entry *e = &lck->data->share_modes[i];
 
                if (is_deferred_open_entry(e) &&
-                   procid_is_me(&e->pid) &&
+                   procid_equal(&self, &e->pid) &&
                    (e->op_mid == req->mid)) {
                        DEBUG(0, ("Trying to defer an already deferred "
                                "request: mid=%llu, exiting\n",
@@ -1364,8 +1366,7 @@ static void defer_open(struct share_mode_lock *lck,
                                       state->id, (char *)state, 
sizeof(*state))) {
                exit_server("push_deferred_open_message_smb failed");
        }
-       add_deferred_open(lck, req->mid, request_time,
-                         messaging_server_id(req->sconn->msg_ctx), state->id);
+       add_deferred_open(lck, req->mid, request_time, self, state->id);
 }
 
 
diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c
index 190a9d3..19886fc 100644
--- a/source3/smbd/oplock.c
+++ b/source3/smbd/oplock.c
@@ -494,6 +494,7 @@ static void process_oplock_break_message(struct 
messaging_context *msg_ctx,
        struct smbd_server_connection *sconn =
                talloc_get_type_abort(private_data,
                struct smbd_server_connection);
+       struct server_id self = messaging_server_id(sconn->msg_ctx);
        struct kernel_oplocks *koplocks = sconn->oplocks.kernel_ops;
 
        if (data->data == NULL) {
@@ -562,7 +563,7 @@ static void process_oplock_break_message(struct 
messaging_context *msg_ctx,
 
        /* Need to wait before sending a break
           message if we sent ourselves this message. */
-       if (procid_is_me(&src)) {
+       if (procid_equal(&self, &src)) {
                wait_before_sending_break();
        }
 
@@ -802,6 +803,7 @@ static void do_break_to_none(struct tevent_req *req)
 {
        struct break_to_none_state *state = tevent_req_callback_data(
                req, struct break_to_none_state);
+       struct server_id self = messaging_server_id(state->sconn->msg_ctx);
        bool ret;
        int i;
        struct share_mode_lock *lck;
@@ -873,7 +875,7 @@ static void do_break_to_none(struct tevent_req *req)
                 * Bugid #5980.
                 */
 
-               if (procid_is_me(&share_entry->pid)) {
+               if (procid_equal(&self, &share_entry->pid)) {
                        struct files_struct *cur_fsp =
                                initial_break_processing(state->sconn,
                                        share_entry->id,


-- 
Samba Shared Repository

Reply via email to