From cb6767efe248b508ce85cc8ad97018f148682f32 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Wed, 19 Apr 2017 13:12:55 +0200 Subject: [PATCH] vfs_fruit: lp_case_sensitive() does not return a bool lp_case_sensitive() returns an int, not a bool, so with the default setting of "Auto" by default we set the AAPL flag SMB2_CRTCTX_AAPL_CASE_SENSITIVE. This caused the client to believe the volume is case sensitive where it wasn't, leading to an error when trying to rename files changing only the case of the name. Also fix the existing torture test that verifies AAPL context negotiation and actually expected the server to return "case sensitive", while the Samba default is really "case insensitive". Bug: https://bugzilla.samba.org/show_bug.cgi?id=12749 Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison (cherry picked from commit 36612723b2b18675116b6197183bdfe5e1d9e06f) --- source3/modules/vfs_fruit.c | 20 +++++++++++++++++--- source4/torture/vfs/fruit.c | 4 ++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c index 89d7bfe..9a55c9e 100644 --- a/source3/modules/vfs_fruit.c +++ b/source3/modules/vfs_fruit.c @@ -2201,9 +2201,23 @@ static NTSTATUS check_aapl(vfs_handle_struct *handle, } if (req_bitmap & SMB2_CRTCTX_AAPL_VOLUME_CAPS) { - SBVAL(p, 0, - lp_case_sensitive(SNUM(handle->conn->tcon->compat)) ? - SMB2_CRTCTX_AAPL_CASE_SENSITIVE : 0); + int val = lp_case_sensitive(SNUM(handle->conn->tcon->compat)); + uint64_t caps = 0; + + switch (val) { + case Auto: + break; + + case True: + caps |= SMB2_CRTCTX_AAPL_CASE_SENSITIVE; + break; + + default: + break; + } + + SBVAL(p, 0, caps); + ok = data_blob_append(req, &blob, p, 8); if (!ok) { return NT_STATUS_UNSUCCESSFUL; diff --git a/source4/torture/vfs/fruit.c b/source4/torture/vfs/fruit.c index 5182c00..bb8f36e 100644 --- a/source4/torture/vfs/fruit.c +++ b/source4/torture/vfs/fruit.c @@ -2068,9 +2068,9 @@ static bool test_aapl(struct torture_context *tctx, } aapl_vol_caps = BVAL(aapl->data.data, 24); - if (aapl_vol_caps != SMB2_CRTCTX_AAPL_CASE_SENSITIVE) { + if (aapl_vol_caps != 0) { /* this will fail on a case insensitive fs ... */ - torture_warning(tctx, + torture_result(tctx, TORTURE_FAIL, "(%s) unexpected vol_caps: %d", __location__, (int)aapl_vol_caps); } -- 2.9.3