summaryrefslogtreecommitdiff
path: root/source3/modules
diff options
context:
space:
mode:
authorChristof Schmitt <christof.schmitt@us.ibm.com>2013-06-12 14:55:15 -0700
committerJeremy Allison <jra@samba.org>2013-06-17 10:41:46 -0700
commit4cd7e1d283f060e794023d5b0a48a7ec97d33820 (patch)
treea5ac00fe4e1cc14f4ae8f53442482e9ead80e4cd /source3/modules
parent9f25ad44a93da09b3a7c14a4a1a0e78c5a1b529c (diff)
downloadsamba-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.c42
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,