s3: libsmb: Reverse sense of 'clear all attributes', ignore attribute change in SMB2...
authorJeremy Allison <jra@samba.org>
Mon, 17 Jul 2017 17:37:15 +0000 (10:37 -0700)
committerJeremy Allison <jra@samba.org>
Tue, 18 Jul 2017 07:49:17 +0000 (09:49 +0200)
SMB1 uses attr == 0 to clear all attributes
on a file (end up with FILE_ATTRIBUTE_NORMAL),
and attr == FILE_ATTRIBUTE_NORMAL to mean ignore
request attribute change.

SMB2 uses exactly the reverse. Unfortunately as the
cli_setatr() ABI is exposed inside libsmbclient,
we must make the SMB2 cli_smb2_setatr() call
export the same ABI as the SMB1 cli_setatr()
which calls it. This means reversing the sense
of the requested attr argument if it's zero
or FILE_ATTRIBUTE_NORMAL.

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

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Richard Sharpe <realrichardsharpe@gmail.com>
source3/libsmb/cli_smb2_fnum.c

index 954f3fe3a7f2e51408ba4dc5eb42d1251836af3c..6967555797aea8b5022a0d97f9294833d87a0160 100644 (file)
@@ -1698,6 +1698,29 @@ NTSTATUS cli_smb2_setatr(struct cli_state *cli,
        inbuf.length = sizeof(inbuf_store);
        data_blob_clear(&inbuf);
 
+       /*
+        * SMB1 uses attr == 0 to clear all attributes
+        * on a file (end up with FILE_ATTRIBUTE_NORMAL),
+        * and attr == FILE_ATTRIBUTE_NORMAL to mean ignore
+        * request attribute change.
+        *
+        * SMB2 uses exactly the reverse. Unfortunately as the
+        * cli_setatr() ABI is exposed inside libsmbclient,
+        * we must make the SMB2 cli_smb2_setatr() call
+        * export the same ABI as the SMB1 cli_setatr()
+        * which calls it. This means reversing the sense
+        * of the requested attr argument if it's zero
+        * or FILE_ATTRIBUTE_NORMAL.
+        *
+        * See BUG: https://bugzilla.samba.org/show_bug.cgi?id=12899
+        */
+
+       if (attr == 0) {
+               attr = FILE_ATTRIBUTE_NORMAL;
+       } else if (attr == FILE_ATTRIBUTE_NORMAL) {
+               attr = 0;
+       }
+
        SSVAL(inbuf.data, 32, attr);
        if (mtime != 0) {
                put_long_date((char *)inbuf.data + 16,mtime);