* 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
Github: closes #535


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1926172 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Joe Orton
2025-06-06 10:36:00 +00:00
parent 5c7eac0cf6
commit 39265983d1
2 changed files with 12 additions and 2 deletions

View File

@ -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]

View File

@ -1521,8 +1521,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 */