diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/locking/posix.c | 6 | ||||
-rw-r--r-- | source3/modules/vfs_default.c | 8 | ||||
-rw-r--r-- | source3/smbd/open.c | 10 |
3 files changed, 16 insertions, 8 deletions
diff --git a/source3/locking/posix.c b/source3/locking/posix.c index 1b88c472b0..f42d1ec6f8 100644 --- a/source3/locking/posix.c +++ b/source3/locking/posix.c @@ -620,7 +620,7 @@ NTSTATUS fd_close_posix(struct files_struct *fsp) * which will lose all locks on all fd's open on this dev/inode, * just close. */ - ret = SMB_VFS_CLOSE(fsp,fsp->fh->fd); + ret = close(fsp->fh->fd); fsp->fh->fd = -1; if (ret == -1) { return map_nt_error_from_unix(errno); @@ -651,7 +651,7 @@ NTSTATUS fd_close_posix(struct files_struct *fsp) DEBUG(10,("fd_close_posix: doing close on %u fd's.\n", (unsigned int)count )); for(i = 0; i < count; i++) { - if (SMB_VFS_CLOSE(fsp,fd_array[i]) == -1) { + if (close(fd_array[i]) == -1) { saved_errno = errno; } } @@ -673,7 +673,7 @@ NTSTATUS fd_close_posix(struct files_struct *fsp) * Finally close the fd associated with this fsp. */ - ret = SMB_VFS_CLOSE(fsp,fsp->fh->fd); + ret = close(fsp->fh->fd); if (ret == 0 && saved_errno != 0) { errno = saved_errno; diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 31ebb6352a..9887b309f9 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -210,13 +210,13 @@ static int vfswrap_open(vfs_handle_struct *handle, const char *fname, static int vfswrap_close(vfs_handle_struct *handle, files_struct *fsp, int fd) { - int result; + NTSTATUS result; START_PROFILE(syscall_close); - - result = close(fd); + result = fd_close_posix(fsp); END_PROFILE(syscall_close); - return result; + + return NT_STATUS_IS_OK(result) ? 0 : -1; } static ssize_t vfswrap_read(vfs_handle_struct *handle, files_struct *fsp, void *data, size_t n) diff --git a/source3/smbd/open.c b/source3/smbd/open.c index f3ed234c87..7a13b3ae38 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -72,13 +72,21 @@ static NTSTATUS fd_open(struct connection_struct *conn, NTSTATUS fd_close(files_struct *fsp) { + int ret; + if (fsp->fh->fd == -1) { return NT_STATUS_OK; /* What we used to call a stat open. */ } if (fsp->fh->ref_count > 1) { return NT_STATUS_OK; /* Shared handle. Only close last reference. */ } - return fd_close_posix(fsp); + + ret = SMB_VFS_CLOSE(fsp, fsp->fh->fd); + fsp->fh->fd = -1; + if (ret == -1) { + return map_nt_error_from_unix(errno); + } + return NT_STATUS_OK; } /**************************************************************************** |