diff options
author | Christof Schmitt <christof.schmitt@us.ibm.com> | 2013-06-12 14:55:15 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2013-06-17 10:41:46 -0700 |
commit | 4cd7e1d283f060e794023d5b0a48a7ec97d33820 (patch) | |
tree | a5ac00fe4e1cc14f4ae8f53442482e9ead80e4cd /source3/modules | |
parent | 9f25ad44a93da09b3a7c14a4a1a0e78c5a1b529c (diff) | |
download | samba-4cd7e1d283f060e794023d5b0a48a7ec97d33820.tar.gz samba-4cd7e1d283f060e794023d5b0a48a7ec97d33820.tar.bz2 samba-4cd7e1d283f060e794023d5b0a48a7ec97d33820.zip |
vfs_streams_xattr: Do not attempt to write empty attribute twice
The create disposition FILE_OVERWRITE_IF is mapped to the flags
O_CREAT|O_TRUNC. In vfs_streams_xattr, this triggers two calls to
SMB_VFS_SETXATTR. The second can fail if O_EXCL is also set, resulting
in an unnecessary error.
Merge the identical code to handle O_CREAT and O_TRUNC to avoid setting
an empty attribute twice. Also add the flags parameter to the debug
message.
Signed-off-by: Christof Schmitt <christof.schmitt@us.ibm.com>
Reviewed-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
Diffstat (limited to 'source3/modules')
-rw-r--r-- | source3/modules/vfs_streams_xattr.c | 42 |
1 files changed, 11 insertions, 31 deletions
diff --git a/source3/modules/vfs_streams_xattr.c b/source3/modules/vfs_streams_xattr.c index 82e2dd8d1e..11a3cc63e8 100644 --- a/source3/modules/vfs_streams_xattr.c +++ b/source3/modules/vfs_streams_xattr.c @@ -364,8 +364,8 @@ static int streams_xattr_open(vfs_handle_struct *handle, int baseflags; int hostfd = -1; - DEBUG(10, ("streams_xattr_open called for %s\n", - smb_fname_str_dbg(smb_fname))); + DEBUG(10, ("streams_xattr_open called for %s with flags 0x%x\n", + smb_fname_str_dbg(smb_fname), flags)); if (!is_ntfs_stream_smb_fname(smb_fname)) { return SMB_VFS_NEXT_OPEN(handle, smb_fname, fsp, flags, mode); @@ -447,40 +447,20 @@ static int streams_xattr_open(vfs_handle_struct *handle, goto fail; } - if (!NT_STATUS_IS_OK(status)) { + if ((!NT_STATUS_IS_OK(status) && (flags & O_CREAT)) || + (flags & O_TRUNC)) { /* - * The attribute does not exist + * The attribute does not exist or needs to be truncated */ - if (flags & O_CREAT) { - /* - * Darn, xattrs need at least 1 byte - */ - char null = '\0'; + /* + * Darn, xattrs need at least 1 byte + */ + char null = '\0'; - DEBUG(10, ("creating attribute %s on file %s\n", - xattr_name, smb_fname->base_name)); + DEBUG(10, ("creating or truncating attribute %s on file %s\n", + xattr_name, smb_fname->base_name)); - if (fsp->base_fsp->fh->fd != -1) { - if (SMB_VFS_FSETXATTR( - fsp->base_fsp, xattr_name, - &null, sizeof(null), - flags & O_EXCL ? XATTR_CREATE : 0) == -1) { - goto fail; - } - } else { - if (SMB_VFS_SETXATTR( - handle->conn, smb_fname->base_name, - xattr_name, &null, sizeof(null), - flags & O_EXCL ? XATTR_CREATE : 0) == -1) { - goto fail; - } - } - } - } - - if (flags & O_TRUNC) { - char null = '\0'; if (fsp->base_fsp->fh->fd != -1) { if (SMB_VFS_FSETXATTR( fsp->base_fsp, xattr_name, |