vfs_fruit: lp_case_sensitive() does not return a bool
authorRalph Boehme <slow@samba.org>
Wed, 19 Apr 2017 11:12:55 +0000 (13:12 +0200)
committerJeremy Allison <jra@samba.org>
Sat, 22 Apr 2017 03:20:20 +0000 (05:20 +0200)
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 <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/modules/vfs_fruit.c
source4/torture/vfs/fruit.c

index 1c1b7d76c147635dad0dea0d9474994520f5c942..11d20713e1a95dad50c6d62f83b8efcee8865efc 100644 (file)
@@ -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;
index 5182c00f91472b3ebaef38bd8dcc9fae556caf48..bb8f36ea056d0843ab1249ef511d7c7117a15cc5 100644 (file)
@@ -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);
        }