From: Jeremy Allison Date: Mon, 17 Jul 2017 17:37:15 +0000 (-0700) Subject: s3: libsmb: Reverse sense of 'clear all attributes', ignore attribute change in SMB2... X-Git-Tag: samba-4.5.13~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9792ec26373869f7613a12b09a911366442746d4;p=thirdparty%2Fsamba.git s3: libsmb: Reverse sense of 'clear all attributes', ignore attribute change in SMB2 to match SMB1. 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 Reviewed-by: Richard Sharpe (cherry picked from commit f1cc79a46d56bda99c392d491d88479cd6427a32) --- diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c index f51a39ceb84..52c6960dd6f 100644 --- a/source3/libsmb/cli_smb2_fnum.c +++ b/source3/libsmb/cli_smb2_fnum.c @@ -1554,6 +1554,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);