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

[glibc] 01/01: hurd: tg-magic-pid: fix spurious port deallocation



This is an automated email from the git hooks/post-receive script.

sthibault pushed a commit to branch sid
in repository glibc.

commit a7f30bd811873d459a885682d3d5370c7cd96132
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Mon Dec 19 04:35:27 2016 +0100

    hurd: tg-magic-pid: fix spurious port deallocation
---
 debian/patches/hurd-i386/tg-magic-pid.diff | 125 ++++++++++++++++++++++++++---
 1 file changed, 113 insertions(+), 12 deletions(-)

diff --git a/debian/patches/hurd-i386/tg-magic-pid.diff b/debian/patches/hurd-i386/tg-magic-pid.diff
index 14b41fd..6647c27 100644
--- a/debian/patches/hurd-i386/tg-magic-pid.diff
+++ b/debian/patches/hurd-i386/tg-magic-pid.diff
@@ -5,11 +5,11 @@ Subject: [PATCH] hurd: Handle `pid' magical lookup retry
         retry.
 
 ---
- hurd/lookup-retry.c | 35 +++++++++++++++++++++++++++++++++++
- 1 file changed, 35 insertions(+)
+ hurd/lookup-retry.c | 78 ++++++++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 65 insertions(+), 13 deletions(-)
 
 diff --git a/hurd/lookup-retry.c b/hurd/lookup-retry.c
-index aee2ba8..845bc24 100644
+index aee2ba8..6ed8de1 100644
 --- a/hurd/lookup-retry.c
 +++ b/hurd/lookup-retry.c
 @@ -25,6 +25,7 @@
@@ -28,7 +28,100 @@ index aee2ba8..845bc24 100644
  
    error_t lookup_op (file_t startdir)
      {
-@@ -306,6 +308,26 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
+@@ -107,14 +109,15 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
+ 	{
+ 	case FS_RETRY_REAUTH:
+ 	  if (err = reauthenticate (*result))
+-	    return err;
++	    goto out;
+ 	  /* Fall through.  */
+ 
+ 	case FS_RETRY_NORMAL:
+ 	  if (nloops++ >= __eloop_threshold ())
+ 	    {
+ 	      __mach_port_deallocate (__mach_task_self (), *result);
+-	      return ELOOP;
++	      err = ELOOP;
++	      goto out;
+ 	    }
+ 
+ 	  /* An empty RETRYNAME indicates we have the final port.  */
+@@ -174,7 +177,7 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
+ 
+ 	      if (err)
+ 		__mach_port_deallocate (__mach_task_self (), *result);
+-	      return err;
++	      goto out;
+ 	    }
+ 
+ 	  startdir = *result;
+@@ -189,7 +192,10 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
+ 	      if (*result != MACH_PORT_NULL)
+ 		__mach_port_deallocate (__mach_task_self (), *result);
+ 	      if (nloops++ >= __eloop_threshold ())
+-		return ELOOP;
++		{
++		  err = ELOOP;
++		  goto out;
++		}
+ 	      file_name = &retryname[1];
+ 	      break;
+ 
+@@ -208,7 +214,8 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
+ 		      (*end != '/' && *end != '\0'))
+ 		    {
+ 		      errno = save;
+-		      return ENOENT;
++		      err = ENOENT;
++		      goto out;
+ 		    }
+ 		  if (! get_dtable_port)
+ 		    err = EGRATUITOUS;
+@@ -226,9 +233,12 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
+ 		    }
+ 		  errno = save;
+ 		  if (err)
+-		    return err;
++		    goto out;
+ 		  if (*end == '\0')
+-		    return 0;
++		    {
++		      err = 0;
++		      goto out;
++		    }
+ 		  else
+ 		    {
+ 		      /* Do a normal retry on the remaining components.  */
+@@ -255,9 +265,12 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
+ 		  if (err = __host_info (__mach_host_self (), HOST_BASIC_INFO,
+ 					 (integer_t *) &hostinfo,
+ 					 &hostinfocnt))
+-		    return err;
++		    goto out;
+ 		  if (hostinfocnt != HOST_BASIC_INFO_COUNT)
+-		    return EGRATUITOUS;
++		    {
++		      err = EGRATUITOUS;
++		      goto out;
++		    }
+ 		  p = _itoa (hostinfo.cpu_subtype, &retryname[8], 10, 0);
+ 		  *--p = '/';
+ 		  p = _itoa (hostinfo.cpu_type, &retryname[8], 10, 0);
+@@ -293,10 +306,11 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
+ 		      }
+ 
+ 		  case '\0':
+-		    return opentty (result);
++		    err = opentty (result);
++		    goto out;
+ 		  case '/':
+ 		    if (err = opentty (&startdir))
+-		      return err;
++		      goto out;
+ 		    strcpy (retryname, &retryname[4]);
+ 		    break;
+ 		  default:
+@@ -306,14 +320,48 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
  		goto bad_magic;
  	      break;
  
@@ -45,6 +138,8 @@ index aee2ba8..845bc24 100644
 +		  strcpy (retryname, buf);
 +
 +		  /* Do a normal retry on the remaining components.  */
++		  __mach_port_mod_refs (__mach_task_self (), lastdir,
++					MACH_PORT_RIGHT_SEND, 1);
 +		  startdir = lastdir;
 +		  file_name = retryname;
 +		}
@@ -54,11 +149,18 @@ index aee2ba8..845bc24 100644
 +
  	    default:
  	    bad_magic:
- 	      return EGRATUITOUS;
-@@ -316,6 +338,16 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
- 	  return EGRATUITOUS;
+-	      return EGRATUITOUS;
++	      err = EGRATUITOUS;
++	      goto out;
  	}
+ 	  break;
  
+ 	default:
+-	  return EGRATUITOUS;
++	  err = EGRATUITOUS;
++	  goto out;
++	}
++
 +      if (MACH_PORT_VALID (*result) && *result != lastdir)
 +	{
 +	  if (MACH_PORT_VALID (lastdir))
@@ -67,15 +169,14 @@ index aee2ba8..845bc24 100644
 +	  lastdir = *result;
 +	  __mach_port_mod_refs (__mach_task_self (), lastdir,
 +				MACH_PORT_RIGHT_SEND, 1);
-+	}
-+
+ 	}
+ 
        if (startdir != MACH_PORT_NULL)
- 	{
- 	  err = lookup_op (startdir);
-@@ -326,6 +358,9 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
+@@ -326,6 +374,10 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
  	err = (*use_init_port) (dirport, &lookup_op);
      } while (! err);
  
++out:
 +  if (MACH_PORT_VALID (lastdir))
 +    __mach_port_deallocate (__mach_task_self (), lastdir);
 +

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-glibc/glibc.git


Reply to: