src/server/daemon/vfs.c

branch
webdav
changeset 286
864e2d701dd4
parent 277
7608af69739f
child 289
285d483db2fb
--- 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;
     }
 }
 

mercurial