r6247 - in glibc-package/trunk/debian: . patches patches/hurd-i386
Author: sthibault
Date: 2014-08-25 12:29:29 +0000 (Mon, 25 Aug 2014)
New Revision: 6247
Added:
glibc-package/trunk/debian/patches/hurd-i386/submitted-bind_umask.diff
Modified:
glibc-package/trunk/debian/changelog
glibc-package/trunk/debian/patches/series
Log:
* patches/hurd-i386/submitted-bind_umask.diff: New patch to fix bind() when
umask is 0000, fixes clamav testsuite. Closes: #759218.
Modified: glibc-package/trunk/debian/changelog
===================================================================
--- glibc-package/trunk/debian/changelog 2014-08-24 20:28:35 UTC (rev 6246)
+++ glibc-package/trunk/debian/changelog 2014-08-25 12:29:29 UTC (rev 6247)
@@ -16,6 +16,8 @@
std::thread using __pthread_key_create to detect presence of libpthread.
Fixes build of webkitgtk and most probably other libstdc++-related
failures.
+ * patches/hurd-i386/submitted-bind_umask.diff: New patch to fix bind() when
+ umask is 0000, fixes clamav testsuite. Closes: #759218.
[ Adam Conrad ]
* debian/patches/series: Actually apply the submitted arm64 alignment and
Added: glibc-package/trunk/debian/patches/hurd-i386/submitted-bind_umask.diff
===================================================================
--- glibc-package/trunk/debian/patches/hurd-i386/submitted-bind_umask.diff (rev 0)
+++ glibc-package/trunk/debian/patches/hurd-i386/submitted-bind_umask.diff 2014-08-25 12:29:29 UTC (rev 6247)
@@ -0,0 +1,100 @@
+2014-08-25 Samuel Thibault <samuel.thibault@ens-lyon.org>
+
+ Fix bind when umask is e.g. 0000.
+
+ * 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.
+
+---
+ bind.c | 57 ++++++++++++++++++++++++++++++++-------------------------
+ 1 file changed, 32 insertions(+), 25 deletions(-)
+
+--- a/sysdeps/mach/hurd/bind.c.orig 2014-08-25 14:11:11.245229537 +0200
++++ b/sysdeps/mach/hurd/bind.c 2014-08-25 14:11:35.892517639 +0200
+@@ -40,7 +40,7 @@
+ char *name = _hurd_sun_path_dupa (addr, len);
+ /* For the local domain, we must create a node in the filesystem
+ using the ifsock translator and then fetch the address from it. */
+- file_t dir, node;
++ file_t dir, node, ifsock;
+ char *n;
+
+ dir = __file_name_split (name, &n);
+@@ -48,7 +48,7 @@
+ 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)
+ {
+@@ -61,36 +61,43 @@
+ MACH_MSG_TYPE_COPY_SEND);
+ if (! err)
+ {
+- /* Link the node, now a socket, into the target directory. */
+- err = __dir_link (dir, node, n, 1);
+- if (err == EEXIST)
+- err = EADDRINUSE;
++ enum retry_type doretry;
++ char retryname[1024];
++ /* Get a port to the ifsock translator. */
++ err = __dir_lookup(node, "", 0, 0, &doretry, retryname, &ifsock);
++ if (! err)
++ if (doretry != FS_RETRY_NORMAL || retryname[0] != '\0')
++ err = EADDRINUSE;
+ }
+- __mach_port_deallocate (__mach_task_self (), node);
+ if (! err)
+ {
+- /* Get a port to the ifsock translator. */
+- file_t ifsock = __file_name_lookup_under (dir, n, 0, 0);
+- if (ifsock == MACH_PORT_NULL)
+- {
+- err = errno;
+- /* If we failed, get rid of the node we created. */
+- __dir_unlink (dir, n);
+- }
+- else
++ /* Get the address port. */
++ err = __ifsock_getsockaddr (ifsock, &aport);
++ if (err == MIG_BAD_ID || err == EOPNOTSUPP)
++ /* We are not talking to /hurd/ifsock. Probably
++ someone came in after we linked our node, unlinked
++ it, and replaced it with a different node, before we
++ did our lookup. Treat it as if our link had failed
++ with EEXIST. */
++ err = EADDRINUSE;
++ if (! err)
+ {
+- /* Get the address port. */
+- err = __ifsock_getsockaddr (ifsock, &aport);
+- if (err == MIG_BAD_ID || err == EOPNOTSUPP)
+- /* We are not talking to /hurd/ifsock. Probably
+- someone came in after we linked our node, unlinked
+- it, and replaced it with a different node, before we
+- did our lookup. Treat it as if our link had failed
+- with 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);
+ }
+ __mach_port_deallocate (__mach_task_self (), ifsock);
+ }
++ __mach_port_deallocate (__mach_task_self (), node);
+ }
+ __mach_port_deallocate (__mach_task_self (), dir);
+
Modified: glibc-package/trunk/debian/patches/series
===================================================================
--- glibc-package/trunk/debian/patches/series 2014-08-24 20:28:35 UTC (rev 6246)
+++ glibc-package/trunk/debian/patches/series 2014-08-25 12:29:29 UTC (rev 6247)
@@ -149,6 +149,7 @@
hurd-i386/cvs-munmap-0.diff
hurd-i386/cvs-libpthread_guardsize.diff
hurd-i386/cvs-libpthread_std_thread.diff
+hurd-i386/submitted-bind_umask.diff
i386/local-biarch.diff
i386/local-cmov.diff
Reply to: