The branch, master has been updated
       via  0239315 smbd: Fix an error path in open_directory
       via  0cc2123 smbd: Simplify set_share_mode
       via  b8b7e85 smbd: Simplify find_share_mode_entry callers
       via  e0e5f67 smbd: Convert set_share_mode to return bool for success
       via  ad2ba58 smbd: Make add_share_mode return bool
       via  f9554a9 smbd: Change parameter from unsigned to uint32_t
      from  2ad37cb lib/util: remove unused (and not even compiled) 
lib/util/capability.c.

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


- Log -----------------------------------------------------------------
commit 02393156de280748d4e87f231d477fa70437a8a0
Author: Volker Lendecke <v...@samba.org>
Date:   Mon Oct 7 20:13:28 2013 +0000

    smbd: Fix an error path in open_directory
    
    In open_file_ntcreate we do the del_share_mode on error. We should do
    it here as well.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>
    
    Autobuild-User(master): Jeremy Allison <j...@samba.org>
    Autobuild-Date(master): Wed Oct  9 01:58:55 CEST 2013 on sn-devel-104

commit 0cc212385c4b622bb1fa5055cde87ab43de36e45
Author: Volker Lendecke <v...@samba.org>
Date:   Mon Sep 16 14:02:48 2013 -0700

    smbd: Simplify set_share_mode
    
    With the find_share_mode simplification we don't need fill_share_mode 
anymore.
    So this coalesces add_share_mode as well.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit b8b7e855ce1fd4bfdd06addcb824396418025dc8
Author: Volker Lendecke <v...@samba.org>
Date:   Mon Sep 16 13:58:54 2013 -0700

    smbd: Simplify find_share_mode_entry callers
    
    All callers used fill_share_mode_entry before calling
    find_share_mode_entry. Remove that requirement.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit e0e5f67da522521a37622a5833b8699ae63e8c27
Author: Volker Lendecke <v...@samba.org>
Date:   Sat Sep 14 13:49:14 2013 +0200

    smbd: Convert set_share_mode to return bool for success
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit ad2ba58f53a7fb6b87511288cb450f1327f1ccbf
Author: Volker Lendecke <v...@samba.org>
Date:   Sat Sep 14 13:48:03 2013 +0200

    smbd: Make add_share_mode return bool
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit f9554a993ecb345b8773a911a6e98a7f2329422b
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Sep 25 18:39:27 2013 -0700

    smbd: Change parameter from unsigned to uint32_t
    
    share_mode_stale_pid internally only has to deal with uint32_t. Make
    the parameter match this.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

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

Summary of changes:
 source3/locking/locking.c |  111 +++++++++++++++++----------------------------
 source3/locking/proto.h   |    4 +-
 source3/smbd/open.c       |   20 ++++++--
 3 files changed, 59 insertions(+), 76 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/locking/locking.c b/source3/locking/locking.c
index d0b6eaf..b9db27c 100644
--- a/source3/locking/locking.c
+++ b/source3/locking/locking.c
@@ -636,7 +636,7 @@ bool is_valid_share_mode_entry(const struct 
share_mode_entry *e)
  * being used, we need to make sure the corresponding process still
  * exists.
  */
-bool share_mode_stale_pid(struct share_mode_data *d, unsigned idx)
+bool share_mode_stale_pid(struct share_mode_data *d, uint32_t idx)
 {
        struct share_mode_entry *e;
 
@@ -693,14 +693,22 @@ bool share_mode_stale_pid(struct share_mode_data *d, 
unsigned idx)
        return true;
 }
 
-/*******************************************************************
- Fill a share mode entry.
-********************************************************************/
-
-static void fill_share_mode_entry(struct share_mode_entry *e,
-                                 files_struct *fsp,
-                                 uid_t uid, uint64_t mid, uint16 op_type)
+bool set_share_mode(struct share_mode_lock *lck, files_struct *fsp,
+                   uid_t uid, uint64_t mid, uint16 op_type)
 {
+       struct share_mode_data *d = lck->data;
+       struct share_mode_entry *tmp, *e;
+
+       tmp = talloc_realloc(d, d->share_modes, struct share_mode_entry,
+                            d->num_share_modes+1);
+       if (tmp == NULL) {
+               return false;
+       }
+       d->share_modes = tmp;
+       e = &d->share_modes[d->num_share_modes];
+       d->num_share_modes += 1;
+       d->modified = true;
+
        ZERO_STRUCTP(e);
        e->pid = messaging_server_id(fsp->conn->sconn->msg_ctx);
        e->share_access = fsp->share_access;
@@ -715,58 +723,35 @@ static void fill_share_mode_entry(struct share_mode_entry 
*e,
        e->uid = (uint32)uid;
        e->flags = fsp->posix_open ? SHARE_MODE_FLAG_POSIX_OPEN : 0;
        e->name_hash = fsp->name_hash;
-}
-
-static void add_share_mode_entry(struct share_mode_data *d,
-                                const struct share_mode_entry *entry)
-{
-       ADD_TO_ARRAY(d, struct share_mode_entry, *entry,
-                    &d->share_modes, &d->num_share_modes);
-       d->modified = True;
-}
-
-void set_share_mode(struct share_mode_lock *lck, files_struct *fsp,
-                   uid_t uid, uint64_t mid, uint16 op_type)
-{
-       struct share_mode_entry entry;
-       fill_share_mode_entry(&entry, fsp, uid, mid, op_type);
-       add_share_mode_entry(lck->data, &entry);
-}
-
-/*******************************************************************
- Check if two share mode entries are identical, ignoring oplock 
- and mid info and desired_access. (Removed paranoia test - it's
- not automatically a logic error if they are identical. JRA.)
-********************************************************************/
 
-static bool share_modes_identical(const struct share_mode_entry *e1,
-                                 const struct share_mode_entry *e2)
-{
-       /* We used to check for e1->share_access == e2->share_access here
-          as well as the other fields but 2 different DOS or FCB opens
-          sharing the same share mode entry may validly differ in
-          fsp->share_access field. */
-
-       return (serverid_equal(&e1->pid, &e2->pid) &&
-               file_id_equal(&e1->id, &e2->id) &&
-               e1->share_file_id == e2->share_file_id );
+       return true;
 }
 
 static struct share_mode_entry *find_share_mode_entry(
-       struct share_mode_data *d, const struct share_mode_entry *entry)
+       struct share_mode_lock *lck, files_struct *fsp)
 {
+       struct share_mode_data *d = lck->data;
+       struct server_id pid;
        int i;
 
-       if (!is_valid_share_mode_entry(entry)) {
-               return NULL;
-       }
+       pid = messaging_server_id(fsp->conn->sconn->msg_ctx);
 
        for (i=0; i<d->num_share_modes; i++) {
                struct share_mode_entry *e = &d->share_modes[i];
-               if (is_valid_share_mode_entry(e) &&
-                   share_modes_identical(e, entry)) {
-                       return e;
+
+               if (!is_valid_share_mode_entry(e)) {
+                       continue;
+               }
+               if (!serverid_equal(&pid, &e->pid)) {
+                       continue;
+               }
+               if (!file_id_equal(&fsp->file_id, &e->id)) {
+                       continue;
+               }
+               if (fsp->fh->gen_id != e->share_file_id) {
+                       continue;
                }
+               return e;
        }
        return NULL;
 }
@@ -778,12 +763,9 @@ static struct share_mode_entry *find_share_mode_entry(
 
 bool del_share_mode(struct share_mode_lock *lck, files_struct *fsp)
 {
-       struct share_mode_entry entry, *e;
-
-       /* Don't care about the pid owner being correct here - just a search. */
-       fill_share_mode_entry(&entry, fsp, (uid_t)-1, 0, NO_OPLOCK);
+       struct share_mode_entry *e;
 
-       e = find_share_mode_entry(lck->data, &entry);
+       e = find_share_mode_entry(lck, fsp);
        if (e == NULL) {
                return False;
        }
@@ -796,7 +778,7 @@ bool del_share_mode(struct share_mode_lock *lck, 
files_struct *fsp)
 bool mark_share_mode_disconnected(struct share_mode_lock *lck,
                                  struct files_struct *fsp)
 {
-       struct share_mode_entry entry, *e;
+       struct share_mode_entry *e;
 
        if (lck->data->num_share_modes != 1) {
                return false;
@@ -809,10 +791,7 @@ bool mark_share_mode_disconnected(struct share_mode_lock 
*lck,
                return false;
        }
 
-       /* Don't care about the pid owner being correct here - just a search. */
-       fill_share_mode_entry(&entry, fsp, (uid_t)-1, 0, NO_OPLOCK);
-
-       e = find_share_mode_entry(lck->data, &entry);
+       e = find_share_mode_entry(lck, fsp);
        if (e == NULL) {
                return false;
        }
@@ -837,12 +816,9 @@ bool mark_share_mode_disconnected(struct share_mode_lock 
*lck,
 
 bool remove_share_oplock(struct share_mode_lock *lck, files_struct *fsp)
 {
-       struct share_mode_entry entry, *e;
-
-       /* Don't care about the pid owner being correct here - just a search. */
-       fill_share_mode_entry(&entry, fsp, (uid_t)-1, 0, NO_OPLOCK);
+       struct share_mode_entry *e;
 
-       e = find_share_mode_entry(lck->data, &entry);
+       e = find_share_mode_entry(lck, fsp);
        if (e == NULL) {
                return False;
        }
@@ -870,12 +846,9 @@ bool remove_share_oplock(struct share_mode_lock *lck, 
files_struct *fsp)
 
 bool downgrade_share_oplock(struct share_mode_lock *lck, files_struct *fsp)
 {
-       struct share_mode_entry entry, *e;
-
-       /* Don't care about the pid owner being correct here - just a search. */
-       fill_share_mode_entry(&entry, fsp, (uid_t)-1, 0, NO_OPLOCK);
+       struct share_mode_entry *e;
 
-       e = find_share_mode_entry(lck->data, &entry);
+       e = find_share_mode_entry(lck, fsp);
        if (e == NULL) {
                return False;
        }
diff --git a/source3/locking/proto.h b/source3/locking/proto.h
index 1573f6b..02e2bf5 100644
--- a/source3/locking/proto.h
+++ b/source3/locking/proto.h
@@ -170,8 +170,8 @@ void get_file_infos(struct file_id id,
                    bool *delete_on_close,
                    struct timespec *write_time);
 bool is_valid_share_mode_entry(const struct share_mode_entry *e);
-bool share_mode_stale_pid(struct share_mode_data *d, unsigned idx);
-void set_share_mode(struct share_mode_lock *lck, files_struct *fsp,
+bool share_mode_stale_pid(struct share_mode_data *d, uint32_t idx);
+bool set_share_mode(struct share_mode_lock *lck, files_struct *fsp,
                    uid_t uid, uint64_t mid, uint16 op_type);
 bool del_share_mode(struct share_mode_lock *lck, files_struct *fsp);
 bool mark_share_mode_disconnected(struct share_mode_lock *lck,
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 858d2be..5024c90 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -2681,9 +2681,13 @@ static NTSTATUS open_file_ntcreate(connection_struct 
*conn,
                fsp->oplock_type = NO_OPLOCK;
        }
 
-       set_share_mode(lck, fsp, get_current_uid(conn),
-                       req ? req->mid : 0,
-                      fsp->oplock_type);
+       if (!set_share_mode(lck, fsp, get_current_uid(conn),
+                           req ? req->mid : 0,
+                           fsp->oplock_type)) {
+               TALLOC_FREE(lck);
+               fd_close(fsp);
+               return NT_STATUS_NO_MEMORY;
+       }
 
        /* Handle strange delete on close create semantics. */
        if (create_options & FILE_DELETE_ON_CLOSE) {
@@ -3173,14 +3177,20 @@ static NTSTATUS open_directory(connection_struct *conn,
                return status;
        }
 
-       set_share_mode(lck, fsp, get_current_uid(conn),
-                       req ? req->mid : 0, NO_OPLOCK);
+       if (!set_share_mode(lck, fsp, get_current_uid(conn),
+                           req ? req->mid : 0, NO_OPLOCK)) {
+               TALLOC_FREE(lck);
+               fd_close(fsp);
+               file_free(req, fsp);
+               return NT_STATUS_NO_MEMORY;
+       }
 
        /* For directories the delete on close bit at open time seems
           always to be honored on close... See test 19 in Samba4 BASE-DELETE. 
*/
        if (create_options & FILE_DELETE_ON_CLOSE) {
                status = can_set_delete_on_close(fsp, 0);
                if (!NT_STATUS_IS_OK(status) && !NT_STATUS_EQUAL(status, 
NT_STATUS_DIRECTORY_NOT_EMPTY)) {
+                       del_share_mode(lck, fsp);
                        TALLOC_FREE(lck);
                        fd_close(fsp);
                        file_free(req, fsp);


-- 
Samba Shared Repository

Reply via email to