[PATCH] vfs_streams_xattr: Do not attempt to write empty attributetwice

Jim Brown jim.brown at rsmas.miami.edu
Wed Jun 12 23:11:07 MDT 2013


You are missing a set of parentheses here:

-	if (!NT_STATUS_IS_OK(status)) {
+	if (!NT_STATUS_IS_OK(status) && (flags & O_CREAT) ||
+	    (flags & O_TRUNC)) {

It should be:

-	if (!NT_STATUS_IS_OK(status)) {
+	if (!NT_STATUS_IS_OK(status) && ((flags & O_CREAT) ||
+	    (flags & O_TRUNC))) {

-----Original Message-----
From: samba-technical-bounces at lists.samba.org
[mailto:samba-technical-bounces at lists.samba.org] On Behalf Of Christof
Schmitt
Sent: Wednesday, June 12, 2013 11:23 PM
To: samba-technical at lists.samba.org
Cc: Christof Schmitt
Subject: [PATCH] vfs_streams_xattr: Do not attempt to write empty
attributetwice

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 at us.ibm.com>
---
 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 82e2dd8..64c7c51 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,
-- 
1.7.1




More information about the samba-technical mailing list