]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Merge r1926172 from trunk:
authorJoe Orton <jorton@apache.org>
Mon, 1 Jun 2026 13:03:36 +0000 (13:03 +0000)
committerJoe Orton <jorton@apache.org>
Mon, 1 Jun 2026 13:03:36 +0000 (13:03 +0000)
* modules/dav/fs/repos.c (dav_fs_remove_resource):
  Return a 404 if apr_file_remove() fails with an ENOENT error,
  likely due to a race with another DELETE.

PR: 60746
Submitted by: jorton
Reviewed by: jorton, rpluem, covener
Github: closes #583

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1934836 13f79535-47bb-0310-9956-ffa450edef68

changes-entries/pr60746.txt [new file with mode: 0644]
modules/dav/fs/repos.c

diff --git a/changes-entries/pr60746.txt b/changes-entries/pr60746.txt
new file mode 100644 (file)
index 0000000..d8401fd
--- /dev/null
@@ -0,0 +1,2 @@
+  *) mod_dav_fs: Return a 404 for DELETE if deletion fails because the
+     resource no longer exists.  PR 60746.  [Joe Orton]
index 64bc894cf660142581a250b8a1a8d9459495dc59..cead8b19cc1f9936b097f773ade65c1690293343 100644 (file)
@@ -1486,8 +1486,16 @@ static dav_error * dav_fs_remove_resource(dav_resource *resource,
 
     /* not a collection; remove the file and its properties */
     if ((status = apr_file_remove(info->pathname, info->pool)) != APR_SUCCESS) {
-        /* ### put a description in here */
-        return dav_new_error(info->pool, HTTP_FORBIDDEN, 0, status, NULL);
+        if (APR_STATUS_IS_ENOENT(status)) {
+            /* Return a 404 if there is a race with another DELETE,
+             * per RFC 4918ยง9.6. */
+            return dav_new_error(info->pool, HTTP_NOT_FOUND, 0, status,
+                                 "Cannot remove already-removed resource.");
+        }
+        else {
+            return dav_new_error(info->pool, HTTP_FORBIDDEN, 0, status,
+                                 "Cannot remove resource");
+        }
     }
 
     /* update resource state */