s3:share_mode_lock: reproduce problem with stale disconnected share mode entries
authorStefan Metzmacher <metze@samba.org>
Fri, 28 Aug 2020 12:37:59 +0000 (14:37 +0200)
committerVolker Lendecke <vl@samba.org>
Mon, 31 Aug 2020 11:57:01 +0000 (11:57 +0000)
This reproduces the origin of "PANIC: assert failed in get_lease_type()"
(https://bugzilla.samba.org/show_bug.cgi?id=14428).

share_mode_cleanup_disconnected() removes disconnected entries from
leases.tdb and brlock.tdb but not from locking.tdb.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14428

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
selftest/knownfail.d/bug-14428 [new file with mode: 0644]
source3/locking/share_mode_lock.c
source3/script/tests/test_durable_handle_reconnect.sh

diff --git a/selftest/knownfail.d/bug-14428 b/selftest/knownfail.d/bug-14428
new file mode 100644 (file)
index 0000000..e198400
--- /dev/null
@@ -0,0 +1 @@
+^samba3.blackbox.durable_v2_delay.bug.14428
index ba0bc2b1e7b6a40ff0cb67edb387faaa761f7d8a..ca8b2f4752900cb2745ee8362e36c9d387c7c8b6 100644 (file)
@@ -1730,6 +1730,20 @@ bool share_mode_cleanup_disconnected(struct file_id fid,
        data->have_share_modes = false;
        data->modified = true;
 
+       /*
+        * This is a temporary reproducer for the origin of
+        * https://bugzilla.samba.org/show_bug.cgi?id=14428
+        * "PANIC: assert failed in get_lease_type()"
+        *
+        * This will be removed again once the bug is demonstrated
+        * and fixed.
+        */
+       TALLOC_FREE(state.lck);
+       state.lck = get_existing_share_mode_lock(frame, fid);
+       if (state.lck != NULL) {
+               DBG_ERR("Reproduced BUG#14428\n");
+       }
+
        ret = true;
 done:
        talloc_free(frame);
index e9af9ca8a8451909accb81b933c81534419c707a..66a35f08f17edf0dd62c2d70c79c9449c3de0429 100755 (executable)
@@ -17,12 +17,26 @@ testit "durable_v2_delay.durable_v2_reconnect_delay" $VALGRIND \
        smb2.durable-v2-delay.durable_v2_reconnect_delay ||
        failed=$(expr $failed + 1)
 
+SMBD_LOG_FILES="$SMBD_TEST_LOG"
+if [ $SMBD_DONT_LOG_STDOUT -eq 1 ]; then
+       _SMBD_LOG_FILE=$(dirname $SMBD_TEST_LOG)/logs/log.smbd
+       SMBD_LOG_FILES="$SMBD_LOG_FILES $_SMBD_LOG_FILE"
+fi
+
+bug_count_0=$(grep 'Reproduced BUG#14428' $SMBD_LOG_FILES | wc -l)
+
 testit "durable_v2_delay.durable_v2_reconnect_delay_msec" $VALGRIND \
        $BINDIR/smbtorture //$SERVER_IP/durable \
        -U$USERNAME%$PASSWORD \
        smb2.durable-v2-delay.durable_v2_reconnect_delay_msec ||
        failed=$(expr $failed + 1)
 
+bug_count_1=$(grep 'Reproduced BUG#14428' $SMBD_LOG_FILES | wc -l)
+
+testit "bug.14428 bug_count_0[$bug_count_0] bug_count_1[$bug_count_1]" \
+       test $bug_count_0 -eq $bug_count_1 ||
+       failed=$(expr $failed + 1)
+
 rm $delay_inject_conf
 
 testok $0 $failed