# HG changeset patch # User Olaf Wintermann # Date 1643996500 -3600 # Node ID 864e2d701dd4eed28b93e89e634dd76d0e1b13f0 # Parent 96e53bd9495892238c17831514c52d0e4e03375a set error status code directly in vfs_* calls diff -r 96e53bd94958 -r 864e2d701dd4 src/server/daemon/vfs.c --- a/src/server/daemon/vfs.c Fri Feb 04 18:12:23 2022 +0100 +++ b/src/server/daemon/vfs.c Fri Feb 04 18:41:40 2022 +0100 @@ -124,6 +124,7 @@ ctx->aclreqaccess = rq->aclreqaccess; ctx->pool = sn->pool; ctx->vfs_errno = 0; + ctx->error_response_set = 0; return ctx; } @@ -144,7 +145,10 @@ } } SYS_FILE file = ctx->vfs->open(ctx, path, oflags); - ctx->aclreqaccess = m; // restore original access mask + ctx->aclreqaccess = m; // restore original access mask + if(!file && ctx) { + sys_set_error_status(ctx); + } return file; } @@ -178,6 +182,9 @@ } int ret = ctx->vfs->stat(ctx, path, buf); ctx->aclreqaccess = m; // restore original access mask + if(ret && ctx) { + sys_set_error_status(ctx); + } return ret; } @@ -186,7 +193,11 @@ WS_ASSERT(fd); WS_ASSERT(buf); - return ctx->vfs->fstat(ctx, fd, buf); + int ret = ctx->vfs->fstat(ctx, fd, buf); + if(ret && ctx) { + sys_set_error_status(ctx); + } + return ret; } void vfs_close(SYS_FILE fd) { @@ -218,6 +229,9 @@ } VFS_DIR dir = ctx->vfs->opendir(ctx, path); ctx->aclreqaccess = m; // restore original access mask + if(!dir && ctx) { + sys_set_error_status(ctx); + } return dir; } @@ -239,6 +253,9 @@ } VFS_DIR dir = ctx->vfs->fdopendir(ctx, fd); ctx->aclreqaccess = m; // restore original access mask + if(!dir && ctx) { + sys_set_error_status(ctx); + } return dir; } @@ -305,6 +322,9 @@ } int ret = op(ctx, path); ctx->aclreqaccess = m; // restore original access mask + if(ret && ctx) { + sys_set_error_status(ctx); + } return ret; } @@ -593,9 +613,10 @@ } void sys_set_error_status(VFSContext *ctx) { - if(ctx->sn && ctx->rq) { + if(ctx->sn && ctx->rq && !ctx->error_response_set) { int status = util_errno2status(ctx->vfs_errno); protocol_status(ctx->sn, ctx->rq, status, NULL); + ctx->error_response_set = TRUE; } } diff -r 96e53bd94958 -r 864e2d701dd4 src/server/public/vfs.h --- a/src/server/public/vfs.h Fri Feb 04 18:12:23 2022 +0100 +++ b/src/server/public/vfs.h Fri Feb 04 18:41:40 2022 +0100 @@ -69,6 +69,7 @@ ACLListHandle *acllist; uint32_t aclreqaccess; int vfs_errno; + WSBool error_response_set; }; struct VFSFile {