submitted-bind_umask2
authorGNU Libc Maintainers <debian-glibc@lists.debian.org>
Thu, 6 Mar 2025 22:46:53 +0000 (23:46 +0100)
committerAurelien Jarno <aurel32@debian.org>
Thu, 6 Mar 2025 22:46:53 +0000 (23:46 +0100)
2014-08-27  Samuel Thibault  <samuel.thibault@ens-lyon.org>

Fix bind when umask is e.g. 0777.

        * sysdeps/mach/hurd/bind.c (__bind): Pass mode 0666 to __dir_mkfile
        instead of final mode, so that call __ifsock_getsockaddr can always
        succeed, before calling __file_chmod to fix the mode according to umask,
        before calling __dir_link to show the file.

Part of the original fix was committed, the other hasn't been yet, see Roland's
"Harumph" reply to
https://sourceware.org/ml/libc-alpha/2014-08/msg00408.html

Gbp-Pq: Topic hurd-i386
Gbp-Pq: Name submitted-bind_umask2.diff

sysdeps/mach/hurd/bind.c

index cdab4dbc435a40062c3228ee13167fd4bb482de5..bb116741fdcbb9bffaf8cab0a2585b45b3f3a587 100644 (file)
@@ -48,7 +48,7 @@ __bind  (int fd, __CONST_SOCKADDR_ARG addrarg, socklen_t len)
        return -1;
 
       /* Create a new, unlinked node in the target directory.  */
-      err = __dir_mkfile (dir, O_CREAT, 0666 & ~_hurd_umask, &node);
+      err = __dir_mkfile (dir, O_CREAT, 0666, &node);
 
       if (! err)
        {
@@ -76,11 +76,16 @@ __bind  (int fd, __CONST_SOCKADDR_ARG addrarg, socklen_t len)
                err = EGRATUITOUS;
              if (! err)
                {
-                 /* Link the node, now a socket with proper mode, into the
-                    target directory.  */
-                 err = __dir_link (dir, node, n, 1);
-                 if (err == EEXIST)
-                   err = EADDRINUSE;
+                 /* Fix the access mode before showing the file.  */
+                 err = __file_chmod (node, 0666 & ~_hurd_umask);
+                 if (! err)
+                   {
+                     /* Link the node, now a socket with proper mode, into the
+                        target directory.  */
+                     err = __dir_link (dir, node, n, 1);
+                     if (err == EEXIST)
+                       err = EADDRINUSE;
+                   }
                  if (err)
                    __mach_port_deallocate (__mach_task_self (), aport);
                }