From 3ed7d41735a407c115acd6ebc4ae7dbbc02bb1ea Mon Sep 17 00:00:00 2001 From: Christof Schmitt Date: Wed, 23 Aug 2017 14:37:28 -0700 Subject: [PATCH] vfs_default: Fix passing of errno from async calls Current code assigns errno from async pthreadpool calls to the vfs_default internal vfswrap_*_state. The callers of the vfs_*_recv functions expect the value from errno in vfs_aio_state.error. Correctly assign errno to vfs_aio_state.error and remove the unused internal err variable. BUG: https://bugzilla.samba.org/show_bug.cgi?id=12983 Signed-off-by: Christof Schmitt Reviewed-by: Jeremy Allison (cherry picked from commit a6f391b8dd1fbfd1a370667dec1374284984c341) --- source3/modules/vfs_default.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index fbfe654..0a56e45 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -738,7 +738,6 @@ static int vfswrap_init_pool(struct smbd_server_connection *conn) struct vfswrap_pread_state { ssize_t ret; - int err; int fd; void *buf; size_t count; @@ -812,7 +811,9 @@ static void vfs_pread_do(void *private_data) state->offset); } while ((state->ret == -1) && (errno == EINTR)); - state->err = errno; + if (state->ret == -1) { + state->vfs_aio_state.error = errno; + } PROFILE_TIMESTAMP(&end_time); @@ -861,7 +862,6 @@ static ssize_t vfswrap_pread_recv(struct tevent_req *req, struct vfswrap_pwrite_state { ssize_t ret; - int err; int fd; const void *buf; size_t count; @@ -935,7 +935,9 @@ static void vfs_pwrite_do(void *private_data) state->offset); } while ((state->ret == -1) && (errno == EINTR)); - state->err = errno; + if (state->ret == -1) { + state->vfs_aio_state.error = errno; + } PROFILE_TIMESTAMP(&end_time); @@ -984,7 +986,6 @@ static ssize_t vfswrap_pwrite_recv(struct tevent_req *req, struct vfswrap_fsync_state { ssize_t ret; - int err; int fd; struct vfs_aio_state vfs_aio_state; @@ -1045,7 +1046,9 @@ static void vfs_fsync_do(void *private_data) state->ret = fsync(state->fd); } while ((state->ret == -1) && (errno == EINTR)); - state->err = errno; + if (state->ret == -1) { + state->vfs_aio_state.error = errno; + } PROFILE_TIMESTAMP(&end_time); -- 1.8.3.1