mirror of
https://github.com/samba-team/samba.git
synced 2025-02-28 01:58:17 +03:00
s3:smbclient: Allow last dos attribute to be cleared
With the upgrade to SMB3.1.1 from cifs for smbclient, setmode no longer works when removing attributes, if the resultant attribute is 0 it is skipped (unlike for the old cifs setpathinfo). When clearing the final attribute, pass in ATTRIBUTE_NORMAL instead of zero. This also removes a redundant cli_setatr call when clearing attributes (cli_setatr was being called twice). BUG: https://bugzilla.samba.org/show_bug.cgi?id=12899 Signed-off-by: Steve French <sfrench@samba.org> Reviewed-by: Anne Marie Merritt <annemarie.merritt@primarydata.com> Reviewed-by: Richard Sharpe <realrichardsharpe@gmail.com> Reviewed-by: Jeremy Allison <jra@samba.org> Autobuild-User(master): Jeremy Allison <jra@samba.org> Autobuild-Date(master): Fri Jul 14 02:43:47 CEST 2017 on sn-devel-144
This commit is contained in:
parent
df0db9d8f8
commit
a4c3ee6767
@ -4961,11 +4961,21 @@ int set_remote_attr(const char *filename, uint16_t new_attr, int mode)
|
||||
}
|
||||
|
||||
if (mode == ATTR_SET) {
|
||||
if (new_attr == old_attr) {
|
||||
d_printf("attributes unchanged, cli_setatr skipped\n");
|
||||
return 0;
|
||||
}
|
||||
new_attr |= old_attr;
|
||||
} else {
|
||||
new_attr = old_attr & ~new_attr;
|
||||
}
|
||||
|
||||
/*
|
||||
* if we are clearing attributes - can't pass 0 in
|
||||
* since that means "skip this field. See MS-FSCC section 2.6
|
||||
*/
|
||||
if (new_attr == 0) {
|
||||
new_attr = FILE_ATTRIBUTE_NORMAL;
|
||||
}
|
||||
status = cli_setatr(cli, filename, new_attr, 0);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
d_printf("cli_setatr failed: %s\n", nt_errstr(status));
|
||||
@ -4990,6 +5000,8 @@ int cmd_setmode(void)
|
||||
int mode = ATTR_SET;
|
||||
int err = 0;
|
||||
bool ok;
|
||||
bool set = false;
|
||||
bool unset = false;
|
||||
TALLOC_CTX *ctx = talloc_new(NULL);
|
||||
if (ctx == NULL) {
|
||||
return 1;
|
||||
@ -5017,9 +5029,11 @@ int cmd_setmode(void)
|
||||
while (*s) {
|
||||
switch (*s++) {
|
||||
case '+':
|
||||
set = true;
|
||||
mode = ATTR_SET;
|
||||
break;
|
||||
case '-':
|
||||
unset = true;
|
||||
mode = ATTR_UNSET;
|
||||
break;
|
||||
case 'r':
|
||||
@ -5051,8 +5065,12 @@ int cmd_setmode(void)
|
||||
DEBUG(2, ("perm set %d %d\n", attr[ATTR_SET], attr[ATTR_UNSET]));
|
||||
|
||||
/* ignore return value: server might not store DOS attributes */
|
||||
if (set) {
|
||||
set_remote_attr(fname, attr[ATTR_SET], ATTR_SET);
|
||||
}
|
||||
if (unset) {
|
||||
set_remote_attr(fname, attr[ATTR_UNSET], ATTR_UNSET);
|
||||
}
|
||||
out:
|
||||
talloc_free(ctx);
|
||||
return err;
|
||||
|
Loading…
x
Reference in New Issue
Block a user