diff options
author | Ralph Boehme <slow@samba.org> | 2014-11-20 16:33:22 +0100 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2014-11-21 22:47:05 +0100 |
commit | 1160fcfe3d97644a6bcfa9ee687fd7dfca58e812 (patch) | |
tree | 5a90a807be281074ccc92dea2fa2acf9a2bfebc4 | |
parent | b7f6b09a13daaa702aef5a0ab9f458521e4902b1 (diff) | |
download | samba-1160fcfe3d97644a6bcfa9ee687fd7dfca58e812.tar.gz samba-1160fcfe3d97644a6bcfa9ee687fd7dfca58e812.tar.xz samba-1160fcfe3d97644a6bcfa9ee687fd7dfca58e812.zip |
vfs_streams_xattr: fix check with samba_private_attr_name()
We want to check with samba_private_attr_name() whether the xattr name
is a private one, unfortunately it flags xattrs that begin with the
default streams prefix as private. By only calling
samba_private_attr_name() in case the xattr does NOT begin with the
default prefix, we know that if it returns 'true' it definitely one of
our internal xattr like "user.DOSATTRIB".
This fixes a bug introduced in 634bcb09a08b927fd79ae0e16aeee2a123605f94
that denied all access to valid stream xattrs.
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
-rw-r--r-- | source3/modules/vfs_streams_xattr.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/source3/modules/vfs_streams_xattr.c b/source3/modules/vfs_streams_xattr.c index 735db2b920..6314442515 100644 --- a/source3/modules/vfs_streams_xattr.c +++ b/source3/modules/vfs_streams_xattr.c @@ -687,13 +687,28 @@ static NTSTATUS walk_xattr_streams(vfs_handle_struct *handle, files_struct *fsp, for (i=0; i<num_names; i++) { struct ea_struct ea; + /* + * We want to check with samba_private_attr_name() + * whether the xattr name is a private one, + * unfortunately it flags xattrs that begin with the + * default streams prefix as private. + * + * By only calling samba_private_attr_name() in case + * the xattr does NOT begin with the default prefix, + * we know that if it returns 'true' it definitely one + * of our internal xattr like "user.DOSATTRIB". + */ + if (strncasecmp_m(names[i], SAMBA_XATTR_DOSSTREAM_PREFIX, + strlen(SAMBA_XATTR_DOSSTREAM_PREFIX)) != 0) { + if (samba_private_attr_name(names[i])) { + continue; + } + } + if (strncmp(names[i], config->prefix, config->prefix_len) != 0) { continue; } - if (samba_private_attr_name(names[i])) { - continue; - } status = get_ea_value(names, handle->conn, fsp, fname, names[i], &ea); |