[SCM] Samba Shared Repository - branch v3-3-test updated - release-3-2-0pre2-5026-g032f052

Jeremy Allison jra at samba.org
Wed Feb 25 22:57:31 GMT 2009


The branch, v3-3-test has been updated
       via  032f052c9ccfb32f822352155e5f3c17a34f896a (commit)
      from  2b5b5bed41320f1890c69c714c7596e1a7a1b964 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-3-test


- Log -----------------------------------------------------------------
commit 032f052c9ccfb32f822352155e5f3c17a34f896a
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Feb 25 14:56:49 2009 -0800

    Fix more POSIX path lstat calls. Fix bug where close can return
    failure if we have a pending modtime and the containing directory
    of the file has been renamed (there is no POSIX "update time by
    fd" call). This can't happen on Windows as the rename will fail
    if there are open files beneath it. Will add a torture test
    for this.
    Jeremy.

-----------------------------------------------------------------------

Summary of changes:
 source/smbd/close.c |   22 +++++++++++++++++-----
 1 files changed, 17 insertions(+), 5 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/smbd/close.c b/source/smbd/close.c
index d586116..0075697 100644
--- a/source/smbd/close.c
+++ b/source/smbd/close.c
@@ -467,6 +467,7 @@ static NTSTATUS update_write_time_on_close(struct files_struct *fsp)
 	SMB_STRUCT_STAT sbuf;
 	struct timespec ts[2];
 	NTSTATUS status;
+	int ret = -1;
 
 	ZERO_STRUCT(sbuf);
 	ZERO_STRUCT(ts);
@@ -481,15 +482,19 @@ static NTSTATUS update_write_time_on_close(struct files_struct *fsp)
 
 	/* Ensure we have a valid stat struct for the source. */
 	if (fsp->fh->fd != -1) {
-		if (SMB_VFS_FSTAT(fsp, &sbuf) == -1) {
-			return map_nt_error_from_unix(errno);
-		}
+		ret = SMB_VFS_FSTAT(fsp, &sbuf);
 	} else {
-		if (SMB_VFS_STAT(fsp->conn,fsp->fsp_name,&sbuf) == -1) {
-			return map_nt_error_from_unix(errno);
+		if (fsp->posix_open) {
+			ret = SMB_VFS_LSTAT(fsp->conn,fsp->fsp_name,&sbuf);
+		} else {
+			ret = SMB_VFS_STAT(fsp->conn,fsp->fsp_name,&sbuf);
 		}
 	}
 
+	if (ret == -1) {
+		return map_nt_error_from_unix(errno);
+	}
+
 	if (!VALID_STAT(sbuf)) {
 		/* if it doesn't seem to be a real file */
 		return NT_STATUS_OK;
@@ -575,6 +580,13 @@ static NTSTATUS close_normal_file(files_struct *fsp, enum file_close_type close_
 	 */
 
 	saved_status4 = update_write_time_on_close(fsp);
+	if (NT_STATUS_EQUAL(saved_status4, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
+		/* Someone renamed the file or a parent directory containing
+		 * this file. We can't do anything about this, we don't have
+		 * an "update timestamp by fd" call in POSIX. Eat the error. */
+
+		saved_status4 = NT_STATUS_OK;
+	}
 
 	if (NT_STATUS_IS_OK(status)) {
 		if (!NT_STATUS_IS_OK(saved_status1)) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list