]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbtorture: add support for closing a handle when receiving a lease break
authorRalph Boehme <slow@samba.org>
Thu, 22 May 2025 15:50:46 +0000 (17:50 +0200)
committerRalph Boehme <slow@samba.org>
Wed, 28 May 2025 15:06:28 +0000 (15:06 +0000)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15861

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Bjoern Jacke <bjacke@samba.org>
source4/torture/smb2/lease_break_handler.c
source4/torture/smb2/lease_break_handler.h

index b33e0cb31e94ed41de721e73c0b292ca5d24460b..ea0dfc40e26e39f1b77f95ba22e19c1ffb495db6 100644 (file)
@@ -42,6 +42,17 @@ static void torture_lease_break_callback(struct smb2_request *req)
        return;
 }
 
+static void torture_lease_break_close_callback(struct smb2_request *req)
+{
+       NTSTATUS status;
+
+       status = smb2_close_recv(req, &lease_break_info.close);
+       if (!NT_STATUS_IS_OK(status)) {
+               lease_break_info.failures++;
+       }
+       return;
+}
+
 /* a lease break request handler */
 bool torture_lease_handler(struct smb2_transport *transport,
                           const struct smb2_lease_break *lb,
@@ -64,6 +75,25 @@ bool torture_lease_handler(struct smb2_transport *transport,
        lease_break_info.lease_break = *lb;
        lease_break_info.count++;
 
+       if (!smb2_util_handle_empty(lease_break_info.lease_handle) &&
+           (lb->current_lease.lease_state & SMB2_LEASE_HANDLE) &&
+           !(lb->new_lease_state & SMB2_LEASE_HANDLE))
+       {
+               torture_comment(lease_break_info.tctx,
+                       "transport[%p] closing handle\n",
+                       transport);
+
+               ZERO_STRUCT(lease_break_info.close);
+               lease_break_info.close.in.file.handle =
+                       lease_break_info.lease_handle;
+               ZERO_STRUCT(lease_break_info.lease_handle);
+
+               req = smb2_close_send(tree, &lease_break_info.close);
+               req->async.fn = torture_lease_break_close_callback;
+               req->async.private_data = NULL;
+               return true;
+       }
+
        if (lease_break_info.lease_skip_ack) {
                torture_comment(lease_break_info.tctx,
                        "transport[%p] Skip %s to %s in lease handler\n",
index 5dffbb0f3b8321268aaaf4d11faadc13936b6ac1..731ac3a9e12fcf6cbecbe188243ccc1e19f532ba 100644 (file)
@@ -28,6 +28,10 @@ struct lease_break_info {
        struct smb2_transport *lease_transport;
        bool lease_skip_ack;
        struct smb2_lease_break_ack lease_break_ack;
+
+       struct smb2_handle lease_handle;
+       struct smb2_close close;
+
        int count;
        int failures;