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.thiba...@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 via email to