[PATCH] Funny Durable Handle v2 reconnect failure with lease
Jeremy Allison
jra at samba.org
Tue Jul 17 21:46:07 UTC 2018
On Tue, Jul 17, 2018 at 04:20:53PM +0200, Ralph Böhme via samba-technical wrote:
> Hi!
>
> Attached is a patch for a funny bug in smbd_smb2_create_durable_lease_check()
> that causes DH2C with an associated lease to fail because of a path mismatch:
>
> [10 2018/07/17 12:46:04.907479 ../source3/smbd/smb2_create.c:423 smbd_smb2_create_durable_lease_check]
> Lease requested for file dir\bigfile, reopened file is named dir/bigfile
>
> Look closely: '\' vs '/'. :)
>
> Looks like our testsuite didn't cover the case of a DHv2 with lease on a file
> in a subdirectory. :)
>
> Patch attached, fixes smbd_smb2_create_durable_lease_check() and tweaks a test
> to use a file in a directory for the test.
>
> Please review & push if happy. Thanks!
Nice catch Ralph, I was hoping this might fix a customer
bug I'm looking at (but no, unfortunately :-).
RB+ and pushed.
Jeremy.
> --
> Ralph Boehme, Samba Team https://samba.org/
> Samba Developer, SerNet GmbH https://sernet.de/en/samba/
> GPG Key Fingerprint: FAE2 C608 8A24 2520 51C5
> 59E4 AA1E 9B71 2639 9E46
> From 6b1946563ba477cbd5e93708d830f96cc801d73d Mon Sep 17 00:00:00 2001
> From: Ralph Boehme <slow at samba.org>
> Date: Tue, 17 Jul 2018 15:56:05 +0200
> Subject: [PATCH 1/2] s4: torture: run test_durable_v2_open_reopen2_lease() in
> a subdirectory
>
> Bug: https://bugzilla.samba.org/show_bug.cgi?id=13535
>
> Signed-off-by: Ralph Boehme <slow at samba.org>
> ---
> selftest/knownfail.d/samba3.smb2.durable-v2-open | 1 +
> source4/torture/smb2/durable_v2_open.c | 11 +++++++++--
> 2 files changed, 10 insertions(+), 2 deletions(-)
> create mode 100644 selftest/knownfail.d/samba3.smb2.durable-v2-open
>
> diff --git a/selftest/knownfail.d/samba3.smb2.durable-v2-open b/selftest/knownfail.d/samba3.smb2.durable-v2-open
> new file mode 100644
> index 00000000000..facf1d0b543
> --- /dev/null
> +++ b/selftest/knownfail.d/samba3.smb2.durable-v2-open
> @@ -0,0 +1 @@
> +^samba3.smb2.durable-v2-open.reopen2-lease-v2\(nt4_dc\)$
> diff --git a/source4/torture/smb2/durable_v2_open.c b/source4/torture/smb2/durable_v2_open.c
> index 3a0e0707d2c..0a928ec8c26 100644
> --- a/source4/torture/smb2/durable_v2_open.c
> +++ b/source4/torture/smb2/durable_v2_open.c
> @@ -1518,9 +1518,15 @@ bool test_durable_v2_open_reopen2_lease_v2(struct torture_context *tctx,
>
> options = tree->session->transport->options;
>
> + smb2_deltree(tree, __func__);
> + status = torture_smb2_testdir(tree, __func__, &_h);
> + torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
> + "torture_smb2_testdir failed\n");
> + smb2_util_close(tree, _h);
> +
> /* Choose a random name in case the state is left a little funky. */
> - snprintf(fname, 256, "durable_v2_open_reopen2_%s.dat",
> - generate_random_str(tctx, 8));
> + snprintf(fname, 256, "%s\\durable_v2_open_reopen2_%s.dat",
> + __func__, generate_random_str(tctx, 8));
>
> smb2_util_unlink(tree, fname);
>
> @@ -1726,6 +1732,7 @@ bool test_durable_v2_open_reopen2_lease_v2(struct torture_context *tctx,
> }
>
> smb2_util_unlink(tree, fname);
> + smb2_deltree(tree, __func__);
>
> talloc_free(tree);
>
> --
> 2.13.6
>
>
> From fadac7433573e9cfc7656b725a018795d7de9fad Mon Sep 17 00:00:00 2001
> From: Ralph Boehme <slow at samba.org>
> Date: Tue, 17 Jul 2018 15:40:04 +0200
> Subject: [PATCH 2/2] s3: smbd: fix path check in
> smbd_smb2_create_durable_lease_check()
>
> Bug: https://bugzilla.samba.org/show_bug.cgi?id=13535
>
> Signed-off-by: Ralph Boehme <slow at samba.org>
> ---
> selftest/knownfail.d/samba3.smb2.durable-v2-open | 1 -
> source3/smbd/smb2_create.c | 16 +++++++++++++++-
> 2 files changed, 15 insertions(+), 2 deletions(-)
> delete mode 100644 selftest/knownfail.d/samba3.smb2.durable-v2-open
>
> diff --git a/selftest/knownfail.d/samba3.smb2.durable-v2-open b/selftest/knownfail.d/samba3.smb2.durable-v2-open
> deleted file mode 100644
> index facf1d0b543..00000000000
> --- a/selftest/knownfail.d/samba3.smb2.durable-v2-open
> +++ /dev/null
> @@ -1 +0,0 @@
> -^samba3.smb2.durable-v2-open.reopen2-lease-v2\(nt4_dc\)$
> diff --git a/source3/smbd/smb2_create.c b/source3/smbd/smb2_create.c
> index 8fbea238698..7f80f6f8138 100644
> --- a/source3/smbd/smb2_create.c
> +++ b/source3/smbd/smb2_create.c
> @@ -381,6 +381,7 @@ static NTSTATUS smbd_smb2_create_durable_lease_check(struct smb_request *smb1req
> const char *requested_filename, const struct files_struct *fsp,
> const struct smb2_lease *lease_ptr)
> {
> + char *filename = NULL;
> struct smb_filename *smb_fname = NULL;
> uint32_t ucf_flags;
> NTSTATUS status;
> @@ -407,10 +408,23 @@ static NTSTATUS smbd_smb2_create_durable_lease_check(struct smb_request *smb1req
> return NT_STATUS_OBJECT_NAME_NOT_FOUND;
> }
>
> + filename = talloc_strdup(talloc_tos(), requested_filename);
> + if (filename == NULL) {
> + return NT_STATUS_NO_MEMORY;
> + }
> +
> + /* This also converts '\' to '/' */
> + status = check_path_syntax(filename);
> + if (!NT_STATUS_IS_OK(status)) {
> + TALLOC_FREE(filename);
> + return status;
> + }
> +
> ucf_flags = filename_create_ucf_flags(smb1req, FILE_OPEN);
> status = filename_convert(talloc_tos(), fsp->conn,
> - requested_filename, ucf_flags,
> + filename, ucf_flags,
> NULL, &smb_fname);
> + TALLOC_FREE(filename);
> if (!NT_STATUS_IS_OK(status)) {
> DEBUG(10, ("filename_convert returned %s\n",
> nt_errstr(status)));
> --
> 2.13.6
>
More information about the samba-technical
mailing list