[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: