[PATCH] Fix bug 11104 - SMB2/SMB3 close response does not include attributes when requested.

Jeremy Allison jra at samba.org
Thu Feb 19 19:55:30 MST 2015


In the delete on close case we've deleted
the file so must store return attributes
before the close.

Steve please review.

Thanks,

Jeremy.
-------------- next part --------------
>From e96d092f6fcda7232e96dc12dc61cbc1c277019f Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Thu, 19 Feb 2015 18:46:55 -0800
Subject: [PATCH 1/3] s3: smbd: SMB2 close. Add utility function
 setup_close_full_information()

Not yet used.

Bug 11104 - SMB2/SMB3 close response does not include attributes when requested.

https://bugzilla.samba.org/show_bug.cgi?id=11104

Signed-off-by: Jeremy Allison <jra at samba.org>
---
 source3/smbd/smb2_close.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/source3/smbd/smb2_close.c b/source3/smbd/smb2_close.c
index 996ad5d..1a8c41a 100644
--- a/source3/smbd/smb2_close.c
+++ b/source3/smbd/smb2_close.c
@@ -149,6 +149,48 @@ static void smbd_smb2_request_close_done(struct tevent_req *subreq)
 	}
 }
 
+static void setup_close_full_information(connection_struct *conn,
+				struct smb_filename *smb_fname,
+				bool posix_open,
+				struct timespec *out_creation_ts,
+				struct timespec *out_last_access_ts,
+				struct timespec *out_last_write_ts,
+				struct timespec *out_change_ts,
+				uint16_t *out_flags,
+				uint64_t *out_allocation_size,
+				uint64_t *out_end_of_file,
+				uint32_t *out_file_attributes)
+{
+	int ret;
+	if (posix_open) {
+		ret = SMB_VFS_LSTAT(conn, smb_fname);
+	} else {
+		ret = SMB_VFS_STAT(conn, smb_fname);
+	}
+	if (ret != 0) {
+		return;
+	}
+
+	*out_flags = SMB2_CLOSE_FLAGS_FULL_INFORMATION;
+	*out_file_attributes = dos_mode(conn, smb_fname);
+	*out_last_write_ts = smb_fname->st.st_ex_mtime;
+	*out_last_access_ts = smb_fname->st.st_ex_atime;
+	*out_creation_ts = get_create_timespec(conn, NULL, smb_fname);
+	*out_change_ts = get_change_timespec(conn, NULL, smb_fname);
+
+	if (lp_dos_filetime_resolution(SNUM(conn))) {
+		dos_filetime_timespec(out_creation_ts);
+		dos_filetime_timespec(out_last_write_ts);
+		dos_filetime_timespec(out_last_access_ts);
+		dos_filetime_timespec(out_change_ts);
+	}
+	if (!(*out_file_attributes & FILE_ATTRIBUTE_DIRECTORY)) {
+		*out_end_of_file = get_file_size_stat(&smb_fname->st);
+	}
+
+	*out_allocation_size = SMB_VFS_GET_ALLOC_SIZE(conn, NULL, &smb_fname->st);
+}
+
 static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
 				struct files_struct *fsp,
 				uint16_t in_flags,
-- 
1.9.1


>From 48352b9790fbbe6408b8d9a3da51373769d8a3ea Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Thu, 19 Feb 2015 18:49:03 -0800
Subject: [PATCH 2/3] s3: smbd: SMB2 close. Call utility function
 setup_close_full_information()

Replaces existing inline code.

Bug 11104 - SMB2/SMB3 close response does not include attributes when requested.

https://bugzilla.samba.org/show_bug.cgi?id=11104

Signed-off-by: Jeremy Allison <jra at samba.org>
---
 source3/smbd/smb2_close.c | 37 +++++++++++--------------------------
 1 file changed, 11 insertions(+), 26 deletions(-)

diff --git a/source3/smbd/smb2_close.c b/source3/smbd/smb2_close.c
index 1a8c41a..86ae3dc 100644
--- a/source3/smbd/smb2_close.c
+++ b/source3/smbd/smb2_close.c
@@ -245,32 +245,17 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
 	}
 
 	if (in_flags & SMB2_CLOSE_FLAGS_FULL_INFORMATION) {
-		int ret;
-		if (posix_open) {
-			ret = SMB_VFS_LSTAT(conn, smb_fname);
-		} else {
-			ret = SMB_VFS_STAT(conn, smb_fname);
-		}
-		if (ret == 0) {
-			flags = SMB2_CLOSE_FLAGS_FULL_INFORMATION;
-			dos_attrs = dos_mode(conn, smb_fname);
-			*out_last_write_ts = smb_fname->st.st_ex_mtime;
-			*out_last_access_ts = smb_fname->st.st_ex_atime;
-			*out_creation_ts = get_create_timespec(conn, NULL, smb_fname);
-			*out_change_ts = get_change_timespec(conn, NULL, smb_fname);
-
-			if (lp_dos_filetime_resolution(SNUM(conn))) {
-				dos_filetime_timespec(out_creation_ts);
-				dos_filetime_timespec(out_last_write_ts);
-				dos_filetime_timespec(out_last_access_ts);
-				dos_filetime_timespec(out_change_ts);
-			}
-			if (!(dos_attrs & FILE_ATTRIBUTE_DIRECTORY)) {
-				file_size = get_file_size_stat(&smb_fname->st);
-			}
-
-			allocation_size = SMB_VFS_GET_ALLOC_SIZE(conn, NULL, &smb_fname->st);
-		}
+		setup_close_full_information(conn,
+				smb_fname,
+				posix_open,
+				out_creation_ts,
+				out_last_access_ts,
+				out_last_write_ts,
+				out_change_ts,
+				&flags,
+				&allocation_size,
+				&file_size,
+				&dos_attrs);
 	}
 
 	*out_flags = flags;
-- 
1.9.1


>From b666ecf7137212a35f582613fb08d8b9e5cb48b5 Mon Sep 17 00:00:00 2001
From: Jeremy Allison <jra at samba.org>
Date: Thu, 19 Feb 2015 18:50:45 -0800
Subject: [PATCH 3/3] s3: smbd: SMB2 close. If a file has delete on close,
 store the return info before deleting.

If we delete the file on close, the stat after the close
will fail so we fail to return the attributes requested.

Bug 11104 - SMB2/SMB3 close response does not include attributes when requested.

https://bugzilla.samba.org/show_bug.cgi?id=11104

Signed-off-by: Jeremy Allison <jra at samba.org>
---
 source3/smbd/smb2_close.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/source3/smbd/smb2_close.c b/source3/smbd/smb2_close.c
index 86ae3dc..e922e23 100644
--- a/source3/smbd/smb2_close.c
+++ b/source3/smbd/smb2_close.c
@@ -237,6 +237,26 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
 		return NT_STATUS_NO_MEMORY;
 	}
 
+	if ((in_flags & SMB2_CLOSE_FLAGS_FULL_INFORMATION) &&
+	    (fsp->initial_delete_on_close || fsp->delete_on_close)) {
+		/*
+		 * We might be deleting the file. Ensure we
+		 * return valid data from before the file got
+		 * removed.
+		 */
+		setup_close_full_information(conn,
+				smb_fname,
+				posix_open,
+				out_creation_ts,
+				out_last_access_ts,
+				out_last_write_ts,
+				out_change_ts,
+				&flags,
+				&allocation_size,
+				&file_size,
+				&dos_attrs);
+	}
+
 	status = close_file(smbreq, fsp, NORMAL_CLOSE);
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(5,("smbd_smb2_close: close_file[%s]: %s\n",
-- 
1.9.1



More information about the samba-technical mailing list