[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: