diff options
-rw-r--r-- | source3/smbd/close.c | 13 | ||||
-rw-r--r-- | source3/smbd/reply.c | 27 |
2 files changed, 24 insertions, 16 deletions
diff --git a/source3/smbd/close.c b/source3/smbd/close.c index fae43fca5d..879c91a81a 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -119,6 +119,7 @@ static int close_normal_file(files_struct *fsp, BOOL normal_close) size_t share_entry_count = 0; BOOL delete_on_close = False; connection_struct *conn = fsp->conn; + time_t pending_modtime = fsp->pending_modtime; int err = 0; int err1 = 0; @@ -196,14 +197,22 @@ with error %s\n", fsp->fsp_name, strerror(errno) )); check_magic(fsp,conn); } + /* + * Ensure pending modtime is set after close. + */ + + if(fsp->pending_modtime) { + int saved_errno = errno; + set_filetime(conn, fsp->fsp_name, fsp->pending_modtime); + errno = saved_errno; + } DEBUG(2,("%s closed file %s (numopen=%d) %s\n", conn->user,fsp->fsp_name, conn->num_files_open, err ? strerror(err) : "")); - if (fsp->fsp_name) { + if (fsp->fsp_name) string_free(&fsp->fsp_name); - } file_free(fsp); diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 675c06f75f..00e0cb8b86 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -2242,21 +2242,10 @@ int reply_close(connection_struct *conn, char *inbuf,char *outbuf, int size, * Close ordinary file. */ int close_err; + pstring file_name; - /* - * If there was a modify time outstanding, - * try and set it here. - */ - if(fsp->pending_modtime) - set_filetime(conn, fsp->fsp_name, fsp->pending_modtime); - - /* - * Now take care of any time sent in the close. - */ - mtime = make_unix_date3(inbuf+smb_vwv1); - - /* try and set the date */ - set_filetime(conn, fsp->fsp_name,mtime); + /* Save the name for time set in close. */ + pstrcpy( file_name, fsp->fsp_name); DEBUG(3,("close fd=%d fnum=%d (numopen=%d)\n", fsp->fd, fsp->fnum, @@ -2273,6 +2262,16 @@ int reply_close(connection_struct *conn, char *inbuf,char *outbuf, int size, END_PROFILE(SMBclose); return (UNIXERROR(ERRHRD,ERRgeneral)); } + + /* + * Now take care of any time sent in the close. + */ + + mtime = make_unix_date3(inbuf+smb_vwv1); + + /* try and set the date */ + set_filetime(conn, file_name, mtime); + } /* We have a cached error */ |