The branch, master has been updated
       via  fbd97ee8223 smbd: Fix a leases.tdb record leak
       via  7535359602e torture: Run durable_v2_reconnect_delay_msec with leases
       via  79b2ee8dc23 torture4: Use generate_random_u64() instead of random()
      from  20b9cae63d5 lib:crypto: Build intel aes-ni only if GnuTLS doesn't 
provide AES CMAC

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


- Log -----------------------------------------------------------------
commit fbd97ee822337534006ffcd14e08c8068e178266
Author: Volker Lendecke <[email protected]>
Date:   Tue Dec 10 10:56:44 2019 +0100

    smbd: Fix a leases.tdb record leak
    
    If we set e->stale=true in the share_mode_forall_entries() callback,
    the share entry will be removed directly. Thus further down
    share_mode_forall_leases() won't find anything anymore. Only find
    possibly still connected entries in the first walk, and then remove
    the share_entries.tdb record straight away after the leases and
    brlocks have been removed.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    
    Autobuild-User(master): Jeremy Allison <[email protected]>
    Autobuild-Date(master): Tue Dec 10 21:57:05 UTC 2019 on sn-devel-184

commit 7535359602e8b33e38ef1e0e38dc070773a39ea8
Author: Volker Lendecke <[email protected]>
Date:   Tue Dec 10 11:48:07 2019 +0100

    torture: Run durable_v2_reconnect_delay_msec with leases
    
    This will show a leases.tdb record leak. If you SIGSTOP the smbtorture
    process while it's in the 10-second wait, you will find locking.tdb
    and share_entries.tdb empty after the scavenger has cleaned up. But
    there will be an entry in leases.tdb left.
    
    I have no clue how to test this properly, or how to have a reasonably
    cheap assert in smbd during normal operations. The problem is that
    this leak can't really be distinguished from a "normal" leak that a
    crashed smbd would leave behind. Possibly we need a background job
    walking leases.tdb to clean this up properly.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 79b2ee8dc2382354750601ee3d57912442c09817
Author: Volker Lendecke <[email protected]>
Date:   Tue Dec 10 11:31:22 2019 +0100

    torture4: Use generate_random_u64() instead of random()
    
    random() returns an int, which is not necessarily a uint64
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

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

Summary of changes:
 selftest/knownfail.d/durable-v2-delay  |  2 ++
 source3/locking/share_mode_lock.c      | 17 +++++++++++++----
 source4/torture/smb2/durable_v2_open.c | 15 ++++++++++-----
 3 files changed, 25 insertions(+), 9 deletions(-)
 create mode 100644 selftest/knownfail.d/durable-v2-delay


Changeset truncated at 500 lines:

diff --git a/selftest/knownfail.d/durable-v2-delay 
b/selftest/knownfail.d/durable-v2-delay
new file mode 100644
index 00000000000..2a84749b0eb
--- /dev/null
+++ b/selftest/knownfail.d/durable-v2-delay
@@ -0,0 +1,2 @@
+# In the ad_dc env leases are disabled
+^samba3.smb2.durable-v2-delay.durable_v2_reconnect_delay_msec\(ad_dc\)
diff --git a/source3/locking/share_mode_lock.c 
b/source3/locking/share_mode_lock.c
index dacb5efab85..cf972fc4b61 100644
--- a/source3/locking/share_mode_lock.c
+++ b/source3/locking/share_mode_lock.c
@@ -1217,7 +1217,7 @@ static bool cleanup_disconnected_lease(struct 
share_mode_entry *e,
        return false;
 }
 
-static bool share_mode_cleanup_disconnected_fn(
+static bool share_mode_find_connected_fn(
        struct share_mode_entry *e,
        bool *modified,
        void *private_data)
@@ -1265,8 +1265,6 @@ static bool share_mode_cleanup_disconnected_fn(
                return true;
        }
 
-       e->stale = true;
-
        return false;
 }
 
@@ -1280,6 +1278,7 @@ bool share_mode_cleanup_disconnected(struct file_id fid,
        bool ret = false;
        TALLOC_CTX *frame = talloc_stackframe();
        struct file_id_buf idbuf;
+       NTSTATUS status;
        bool ok;
 
        state.lck = get_existing_share_mode_lock(frame, fid);
@@ -1291,7 +1290,7 @@ bool share_mode_cleanup_disconnected(struct file_id fid,
        data = state.lck->data;
 
        ok = share_mode_forall_entries(
-               state.lck, share_mode_cleanup_disconnected_fn, &state);
+               state.lck, share_mode_find_connected_fn, &state);
        if (!ok) {
                DBG_DEBUG("share_mode_forall_entries failed\n");
                goto done;
@@ -1349,6 +1348,16 @@ bool share_mode_cleanup_disconnected(struct file_id fid,
                  ? "" : data->stream_name,
                  open_persistent_id);
 
+       /*
+        * No connected share entries left, wipe them all
+        */
+       status = dbwrap_delete(share_entries_db, locking_key(&fid));
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_DEBUG("dbwrap_delete failed: %s\n",
+                         nt_errstr(status));
+               goto done;
+       }
+
        data->num_share_modes = 0;
        data->modified = true;
 
diff --git a/source4/torture/smb2/durable_v2_open.c 
b/source4/torture/smb2/durable_v2_open.c
index 4e70b9bfe17..b2c519db3f6 100644
--- a/source4/torture/smb2/durable_v2_open.c
+++ b/source4/torture/smb2/durable_v2_open.c
@@ -1277,7 +1277,7 @@ bool test_durable_v2_open_reopen2_lease(struct 
torture_context *tctx,
 
        smb2_util_unlink(tree, fname);
 
-       lease_key = random();
+       lease_key = generate_random_u64();
        smb2_lease_create(&io, &ls, false /* dir */, fname,
                          lease_key, smb2_util_lease_state("RWH"));
        io.in.durable_open = false;
@@ -2135,6 +2135,7 @@ static bool test_durable_v2_reconnect_delay_msec(
        struct smb2_handle _h;
        struct smb2_handle *h = NULL;
        struct smb2_create io;
+       struct smb2_lease ls;
        struct GUID create_guid = GUID_random();
        struct smbcli_options options;
        uint64_t previous_session_id;
@@ -2152,9 +2153,13 @@ static bool test_durable_v2_reconnect_delay_msec(
 
        smb2_util_unlink(tree, fname);
 
-       smb2_oplock_create_share(&io, fname,
-                                smb2_util_share_access(""),
-                                smb2_util_oplock_level("b"));
+       smb2_lease_create(
+               &io,
+               &ls,
+               false /* dir */,
+               fname,
+               generate_random_u64(),
+               smb2_util_lease_state("RWH"));
        io.in.durable_open = false;
        io.in.durable_open_v2 = true;
        io.in.persistent_open = false;
@@ -2166,7 +2171,7 @@ static bool test_durable_v2_reconnect_delay_msec(
 
        _h = io.out.file.handle;
        h = &_h;
-       CHECK_VAL(io.out.oplock_level, smb2_util_oplock_level("b"));
+       CHECK_VAL(io.out.oplock_level, SMB2_OPLOCK_LEVEL_LEASE);
        CHECK_VAL(io.out.durable_open_v2, true);
 
        status = smb2_util_write(tree, *h, &b, 0, 1);


-- 
Samba Shared Repository

Reply via email to