Subject: bug#51773: 28.0.60; Issue writing files over WebDAV on MS-Windows

From: Ioannis Kappas <[email-masked]>
Date: Thu, 11 Nov 2021 19:22:16 +0000

The issue is caused by the ERROR_INVALID_FUNCTION error returned by
w32.c:get_security_info()'s GetSecurityInfo win32 fn when it is called
on a WebDAV file.

The caller w32.c:acl_get_file() doesn't know how to handle the error
and returns it as is, causing the write to fail and the error message to be
displayed.

Looking at the caller, it does have a clause to return ENOSUP for WebDAV files:

  else if (err == ERROR_NOT_SUPPORTED
   /* ERROR_ACCESS_DENIED is what we get for a volume
      mounted by WebDAV, which evidently doesn't
      support ACLs.  */
   || err == ERROR_ACCESS_DENIED)
    errno = ENOTSUP;

Thus a solution, which I have tested it to work, is to add the
ERROR_INVALID_FUNCTION to the predicate

diff --git a/src/w32.c b/src/w32.c
index 9fe698d28d..0e066b12e7 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -6614,10 +6614,11 @@ acl_get_file (const char *fname, acl_type_t type)
     || err == ERROR_INVALID_NAME)
      errno = ENOENT;
    else if (err == ERROR_NOT_SUPPORTED
-    /* ERROR_ACCESS_DENIED is what we get for a volume
-       mounted by WebDAV, which evidently doesn't
-       support ACLs.  */
-    || err == ERROR_ACCESS_DENIED)
+    /* ERROR_ACCESS_DENIED or ERROR_INVALID_FUNCTION is
+       what we get for a volume mounted by WebDAV,
+       which evidently doesn't support ACLs.  */
+    || err == ERROR_ACCESS_DENIED
+    || err == ERROR_INVALID_FUNCTION)
      errno = ENOTSUP;
    else
      errno = EIO;

Please let me know if you require more info.

Thanks