[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[hurd] 01/01: Enable $ORIGIN expansion, re-enable protected payload in l
From: |
Samuel Thibault |
Subject: |
[hurd] 01/01: Enable $ORIGIN expansion, re-enable protected payload in libdiskfs |
Date: |
Fri, 01 May 2015 10:15:01 +0000 |
This is an automated email from the git hooks/post-receive script.
sthibault pushed a commit to branch master
in repository hurd.
commit 12b4521149398f7a64e50e3a745a4c066bf89586
Author: Samuel Thibault <address@hidden>
Date: Fri May 1 10:14:21 2015 +0000
Enable $ORIGIN expansion, re-enable protected payload in libdiskfs
* patches/dl_origin.patch: New patch to enable $ORIGIN expansion support
in
rpath for absolute paths.
* patches/git-R-libdiskfs-protected-payload.patch: Remove to re-enable
using
protected payload in libdiskfs, now that the support is fixed in
gnumach.
---
debian/changelog | 9 +
debian/patches/dl_origin.patch | 111 ++++
.../git-R-libdiskfs-protected-payload.patch | 669 ---------------------
debian/patches/series | 2 +-
4 files changed, 121 insertions(+), 670 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index 361a782..a86c068 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+hurd (1:0.6-3) UNRELEASED; urgency=medium
+
+ * patches/dl_origin.patch: New patch to enable $ORIGIN expansion support in
+ rpath for absolute paths.
+ * patches/git-R-libdiskfs-protected-payload.patch: Remove to re-enable using
+ protected payload in libdiskfs, now that the support is fixed in gnumach.
+
+ -- Samuel Thibault <address@hidden> Fri, 01 May 2015 10:08:14 +0000
+
hurd (1:0.6-2) unstable; urgency=medium
* patches/git-R-libdiskfs-protected-payload.patch: Revert using protected
diff --git a/debian/patches/dl_origin.patch b/debian/patches/dl_origin.patch
new file mode 100644
index 0000000..7d5cd35
--- /dev/null
+++ b/debian/patches/dl_origin.patch
@@ -0,0 +1,111 @@
+This only supports absolute paths, which is enough for ghc, but won't be enough
+for other uses. Perhaps it would be better to support it in glibc instead?
+
+Index: hurd-debian/exec/exec.c
+===================================================================
+--- hurd-debian.orig/exec/exec.c
++++ hurd-debian/exec/exec.c
+@@ -890,7 +890,7 @@ do_exec (file_t file,
+ secure = (flags & EXEC_SECURE);
+ defaults = (flags & EXEC_DEFAULTS);
+
+- /* Now record the big blocks of data we shuffle around unchanged.
++ /* Now record the big blocks of data we shuffle around.
+ Whatever arrived inline, we must allocate space for so it can
+ survive after this RPC returns. */
+
+@@ -901,11 +901,91 @@ do_exec (file_t file,
+ goto stdout;
+ boot->argv = argv;
+ boot->argvlen = argvlen;
+- envp = servercopy (envp, envplen, envp_copy, &e.error);
+- if (e.error)
+- goto stdout;
++
++ if (filename && filename[0] == '/')
++ {
++ /* Explicit absolute filename, put its dirname in the LD_ORIGIN_PATH
++ environment variable for $ORIGIN rpath expansion.
++ XXX: thus does not work with relative paths. */
++ const char *end = strrchr (filename, '/');
++ size_t pathlen;
++ const char ld_origin_s[] = "\0LD_ORIGIN_PATH=";
++ const char *existing;
++ size_t existing_len = 0;
++ size_t new_envplen;
++ char *new_envp;
++
++ /* Drop trailing slashes. */
++ while (end > filename && end[-1] == '/')
++ end--;
++
++ if (end == filename)
++ /* Root, keep explicit heading/trailing slash. */
++ end++;
++
++ pathlen = end - filename;
++
++ if (memcmp (envp, ld_origin_s + 1, sizeof (ld_origin_s) - 2) == 0)
++ /* Existing variable at the beginning of envp. */
++ existing = envp - 1;
++ else
++ /* Look for the definition. */
++ existing = memmem (envp, envplen, ld_origin_s, sizeof (ld_origin_s) -
1);
++
++ if (existing)
++ {
++ /* Definition already exists, just replace the content. */
++ existing += sizeof (ld_origin_s) - 1;
++ existing_len = strnlen (existing, envplen - (existing - envp));
++
++ /* Allocate room for the new content. */
++ new_envplen = envplen - existing_len + pathlen;
++ new_envp = mmap (0, new_envplen,
++ PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
++ if (new_envp == MAP_FAILED)
++ {
++ e.error = errno;
++ goto stdout;
++ }
++
++ /* And copy. */
++ memcpy (new_envp, envp, existing - envp);
++ memcpy (new_envp + (existing - envp), filename, pathlen);
++ memcpy (new_envp + (existing - envp) + pathlen,
++ existing + existing_len,
++ envplen - ((existing - envp) + existing_len));
++ }
++ else
++ {
++ /* No existing definition, prepend one. */
++ new_envplen = sizeof (ld_origin_s) - 1 + pathlen + envplen;
++ new_envp = mmap (0, new_envplen,
++ PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
++
++ memcpy (new_envp, ld_origin_s + 1, sizeof (ld_origin_s) - 2);
++ memcpy (new_envp + sizeof (ld_origin_s) - 1, filename, pathlen);
++ new_envp [sizeof (ld_origin_s) - 2 + pathlen] = 0;
++ memcpy (new_envp + sizeof (ld_origin_s) - 1 + pathlen, envp,
envplen);
++ }
++
++ if (! envp_copy)
++ /* Deallocate original environment */
++ munmap (envp, envplen);
++
++ envp = new_envp;
++ envplen = new_envplen;
++ }
++ else
++ {
++ /* No explicit filename, just copy the existing environment */
++ envp = servercopy (envp, envplen, envp_copy, &e.error);
++ if (e.error)
++ goto stdout;
++ }
++
+ boot->envp = envp;
+ boot->envplen = envplen;
++
+ dtable = servercopy (dtable, dtablesize * sizeof (mach_port_t),
+ dtable_copy, &e.error);
+ if (e.error)
diff --git a/debian/patches/git-R-libdiskfs-protected-payload.patch
b/debian/patches/git-R-libdiskfs-protected-payload.patch
deleted file mode 100644
index 8566b96..0000000
--- a/debian/patches/git-R-libdiskfs-protected-payload.patch
+++ /dev/null
@@ -1,669 +0,0 @@
-commit 4241dd5673566a61add85bd9eb52d4ae7db2750a
-Author: Justus Winter <address@hidden>
-Date: Sat Nov 23 16:12:55 2013 +0100
-
- libports: use protected payloads to optimize the object lookup
-
- * NEWS: Mention protected payloads.
- * libports/Makefile (SRCS): Add `port-deref-deferred.c'.
- * libports/create-internal.c (_ports_create_port_internal): Set the
- protected payload to the objects address.
- * libports/import-port.c (ports_import_port): Likewise.
- * libports/reallocate-from-external.c (ports_reallocate_from_external):
- Likewise.
- * libports/reallocate-port.c (ports_reallocate_port): Likewise.
- * libports/transfer-right.c (ports_transfer_right): Likewise.
- * libports/manage-multithread.c (ports_manage_port_operations_multithread):
- Use the protected payload for the object lookup if provided. Add
- thread pool management calls.
- * libports/manage-one-thread.c (ports_manage_port_operations_one_thread):
- Likewise.
- * libports/destroy-right.c (ports_destroy_right): Defer the
- dereferencing of outstanding send rights to avoid a port_info
- use-after-free.
- * libports/port-deref-deferred.c: New file.
- * libports/port-deref-deferred.h: Likewise.
- * libports/ports.h (struct port_bucket): New field `threadpool'.
- (ports_lookup_payload): Check `port_right'.
-
-diff --git b/NEWS a/NEWS
-index 18e1489..b047aed 100644
---- b/NEWS
-+++ a/NEWS
-@@ -6,8 +6,6 @@ problems have been identified using static analysis and
exercising
- tools, and have subsequently been fixed.
-
- The message dispatching code in the Hurd servers has been improved.
--Among other things, we now make use of the protected payloads
--introduced in GNU Mach 1.5.
-
- The embedded gz and bz2 decompressor code has been removed, libz and
- libbz2 is used instead.
-diff --git b/libports/Makefile a/libports/Makefile
-index b8b82ee..f49cb9f 100644
---- b/libports/Makefile
-+++ a/libports/Makefile
-@@ -36,7 +36,7 @@ SRCS = create-bucket.c create-class.c \
- interrupt-operation.c interrupt-on-notify.c interrupt-notified-rpcs.c \
- dead-name.c create-port.c import-port.c default-uninhibitable-rpcs.c \
- claim-right.c transfer-right.c create-port-noinstall.c create-internal.c \
-- interrupted.c extern-inline.c port-deref-deferred.c
-+ interrupted.c extern-inline.c
-
- installhdrs = ports.h
-
-diff --git b/libports/complete-deallocate.c a/libports/complete-deallocate.c
-index e3123b2..0d852f5 100644
---- b/libports/complete-deallocate.c
-+++ a/libports/complete-deallocate.c
-@@ -27,7 +27,7 @@ _ports_complete_deallocate (struct port_info *pi)
- {
- assert ((pi->flags & PORT_HAS_SENDRIGHTS) == 0);
-
-- if (MACH_PORT_VALID (pi->port_right))
-+ if (pi->port_right)
- {
- struct references result;
-
-@@ -37,9 +37,7 @@ _ports_complete_deallocate (struct port_info *pi)
- {
- /* A reference was reacquired through a hash table lookup.
- It's fine, we didn't touch anything yet. */
-- /* XXX: This really shouldn't happen. */
-- assert (! "reacquired reference w/o send rights");
-- pthread_rwlock_unlock (&_ports_htable_lock);
-+ pthread_mutex_unlock (&_ports_htable_lock);
- return;
- }
-
-diff --git b/libports/create-bucket.c a/libports/create-bucket.c
-index 82c00a4..2c5f1b6 100644
---- b/libports/create-bucket.c
-+++ a/libports/create-bucket.c
-@@ -48,6 +48,5 @@ ports_create_bucket ()
-
- hurd_ihash_init (&ret->htable, offsetof (struct port_info, hentry));
- ret->rpcs = ret->flags = ret->count = 0;
-- _ports_threadpool_init (&ret->threadpool);
- return ret;
- }
-diff --git b/libports/create-internal.c a/libports/create-internal.c
-index d79dc78..2d85931 100644
---- b/libports/create-internal.c
-+++ a/libports/create-internal.c
-@@ -99,11 +99,7 @@ _ports_create_port_internal (struct port_class *class,
- bucket->count++;
- class->count++;
- pthread_mutex_unlock (&_ports_lock);
--
-- /* This is an optimization. It may fail. */
-- mach_port_set_protected_payload (mach_task_self (), port,
-- (unsigned long) pi);
--
-+
- if (install)
- {
- err = mach_port_move_member (mach_task_self (), pi->port_right,
-diff --git b/libports/destroy-right.c a/libports/destroy-right.c
-index 276255f..448b379 100644
---- b/libports/destroy-right.c
-+++ a/libports/destroy-right.c
-@@ -1,5 +1,5 @@
- /*
-- Copyright (C) 1995, 1996, 1999, 2014 Free Software Foundation, Inc.
-+ Copyright (C) 1995, 1996, 1999 Free Software Foundation, Inc.
- Written by Michael I. Bushnell.
-
- This file is part of the GNU Hurd.
-@@ -22,62 +22,30 @@
- #include <hurd/ihash.h>
- #include <assert.h>
-
--#include <pthread.h>
--#include <error.h>
--#include <time.h>
--#include <unistd.h>
--
- error_t
- ports_destroy_right (void *portstruct)
- {
- struct port_info *pi = portstruct;
-- mach_port_t port_right;
-- int defer = 0;
- error_t err;
-
-- pthread_mutex_lock (&_ports_lock);
-- port_right = pi->port_right;
-- pi->port_right = MACH_PORT_DEAD;
--
-- if (pi->flags & PORT_HAS_SENDRIGHTS)
-- {
-- pi->flags &= ~PORT_HAS_SENDRIGHTS;
--
-- /* There are outstanding send rights, so we might get more
-- messages. Attached to the messages is a reference to the
-- port_info object. Of course we destroyed the receive right
-- these were send to above, but the message could already have
-- been dequeued to userspace.
--
-- Previously, those messages would have carried an stale name,
-- which would have caused a hash table lookup failure.
-- However, stale payloads results in port_info use-after-free.
-- Therefore, we cannot release the reference here, but defer
-- that instead until all currently running threads have gone
-- through a quiescent state. */
-- defer = 1;
-- }
--
-- if (MACH_PORT_VALID (port_right))
-+ if (pi->port_right != MACH_PORT_NULL)
- {
-- mach_port_clear_protected_payload (mach_task_self (), port_right);
--
- pthread_rwlock_wrlock (&_ports_htable_lock);
- hurd_ihash_locp_remove (&_ports_htable, pi->ports_htable_entry);
- hurd_ihash_locp_remove (&pi->bucket->htable, pi->hentry);
- pthread_rwlock_unlock (&_ports_htable_lock);
-- }
-- pthread_mutex_unlock (&_ports_lock);
--
-- if (MACH_PORT_VALID (port_right))
-- {
-- err = mach_port_mod_refs (mach_task_self (), port_right,
-- MACH_PORT_RIGHT_RECEIVE, -1);
-+ err = mach_port_mod_refs (mach_task_self (), pi->port_right,
-+ MACH_PORT_RIGHT_RECEIVE, -1);
- assert_perror (err);
-- }
-
-- if (defer)
-- _ports_port_deref_deferred (pi);
-+ pi->port_right = MACH_PORT_NULL;
-+
-+ if (pi->flags & PORT_HAS_SENDRIGHTS)
-+ {
-+ pi->flags &= ~PORT_HAS_SENDRIGHTS;
-+ ports_port_deref (pi);
-+ }
-+ }
-
- return 0;
- }
-diff --git b/libports/import-port.c a/libports/import-port.c
-index 2c638e1..c337c85 100644
---- b/libports/import-port.c
-+++ a/libports/import-port.c
-@@ -93,11 +93,7 @@ ports_import_port (struct port_class *class, struct
port_bucket *bucket,
- bucket->count++;
- class->count++;
- pthread_mutex_unlock (&_ports_lock);
--
-- /* This is an optimization. It may fail. */
-- mach_port_set_protected_payload (mach_task_self (), port,
-- (unsigned long) pi);
--
-+
- mach_port_move_member (mach_task_self (), port, bucket->portset);
-
- if (stat.mps_srights)
-diff --git b/libports/manage-multithread.c a/libports/manage-multithread.c
-index dcb6905..58814d2 100644
---- b/libports/manage-multithread.c
-+++ a/libports/manage-multithread.c
-@@ -167,21 +167,7 @@ ports_manage_port_operations_multithread (struct
port_bucket *bucket,
- outp->RetCodeType = RetCodeType;
- outp->RetCode = MIG_BAD_ID;
-
-- if (MACH_MSGH_BITS_LOCAL (inp->msgh_bits) ==
-- MACH_MSG_TYPE_PROTECTED_PAYLOAD)
-- pi = ports_lookup_payload (bucket, inp->msgh_protected_payload, NULL);
-- else
-- {
-- pi = ports_lookup_port (bucket, inp->msgh_local_port, 0);
-- if (pi)
-- {
-- inp->msgh_bits = MACH_MSGH_BITS (
-- MACH_MSGH_BITS_REMOTE (inp->msgh_bits),
-- MACH_MSG_TYPE_PROTECTED_PAYLOAD);
-- inp->msgh_protected_payload = (unsigned long) pi;
-- }
-- }
--
-+ pi = ports_lookup_port (bucket, inp->msgh_local_port, 0);
- if (pi)
- {
- error_t err = ports_begin_rpc (pi, inp->msgh_id, &link);
-@@ -217,19 +203,10 @@ ports_manage_port_operations_multithread (struct
port_bucket *bucket,
- void *
- thread_function (void *arg)
- {
-- struct ports_thread thread;
- int master = (int) arg;
- int timeout;
- error_t err;
-
-- int synchronized_demuxer (mach_msg_header_t *inp,
-- mach_msg_header_t *outheadp)
-- {
-- int r = internal_demuxer (inp, outheadp);
-- _ports_thread_quiescent (&bucket->threadpool, &thread);
-- return r;
-- }
--
- adjust_priority (__atomic_load_n (&totalthreads, __ATOMIC_RELAXED));
-
- if (hook)
-@@ -240,13 +217,10 @@ ports_manage_port_operations_multithread (struct
port_bucket *bucket,
- else
- timeout = thread_timeout;
-
-- _ports_thread_online (&bucket->threadpool, &thread);
--
- startover:
-
- do
-- err = mach_msg_server_timeout (synchronized_demuxer,
-- 0, bucket->portset,
-+ err = mach_msg_server_timeout (internal_demuxer, 0, bucket->portset,
- timeout ? MACH_RCV_TIMEOUT : 0,
- timeout);
- while (err != MACH_RCV_TIMED_OUT);
-@@ -266,7 +240,6 @@ ports_manage_port_operations_multithread (struct
port_bucket *bucket,
- }
- __atomic_sub_fetch (&totalthreads, 1, __ATOMIC_RELAXED);
- }
-- _ports_thread_offline (&bucket->threadpool, &thread);
- return NULL;
- }
-
-diff --git b/libports/manage-one-thread.c a/libports/manage-one-thread.c
-index 192907a..cbd2df7 100644
---- b/libports/manage-one-thread.c
-+++ a/libports/manage-one-thread.c
-@@ -25,7 +25,6 @@ ports_manage_port_operations_one_thread (struct port_bucket
*bucket,
- ports_demuxer_type demuxer,
- int timeout)
- {
-- struct ports_thread thread;
- error_t err;
-
- int
-@@ -58,21 +57,7 @@ ports_manage_port_operations_one_thread (struct port_bucket
*bucket,
- outp->RetCodeType = RetCodeType;
- outp->RetCode = MIG_BAD_ID;
-
-- if (MACH_MSGH_BITS_LOCAL (inp->msgh_bits) ==
-- MACH_MSG_TYPE_PROTECTED_PAYLOAD)
-- pi = ports_lookup_payload (bucket, inp->msgh_protected_payload, NULL);
-- else
-- {
-- pi = ports_lookup_port (bucket, inp->msgh_local_port, 0);
-- if (pi)
-- {
-- inp->msgh_bits = MACH_MSGH_BITS (
-- MACH_MSGH_BITS_REMOTE (inp->msgh_bits),
-- MACH_MSG_TYPE_PROTECTED_PAYLOAD);
-- inp->msgh_protected_payload = (unsigned long) pi;
-- }
-- }
--
-+ pi = ports_lookup_port (bucket, inp->msgh_local_port, 0);
- if (pi)
- {
- err = ports_begin_rpc (pi, inp->msgh_id, &link);
-@@ -98,7 +83,6 @@ ports_manage_port_operations_one_thread (struct port_bucket
*bucket,
- status = 1;
- }
-
-- _ports_thread_quiescent (&bucket->threadpool, &thread);
- return status;
- }
-
-@@ -109,10 +93,8 @@ ports_manage_port_operations_one_thread (struct
port_bucket *bucket,
- zero. */
- timeout = 0;
-
-- _ports_thread_online (&bucket->threadpool, &thread);
- do
- err = mach_msg_server_timeout (internal_demuxer, 0, bucket->portset,
- timeout ? MACH_RCV_TIMEOUT : 0, timeout);
- while (err != MACH_RCV_TIMED_OUT);
-- _ports_thread_offline (&bucket->threadpool, &thread);
- }
-diff --git b/libports/port-deref-deferred.c a/libports/port-deref-deferred.c
-deleted file mode 100644
-index 2580e91..0000000
---- b/libports/port-deref-deferred.c
-+++ /dev/null
-@@ -1,161 +0,0 @@
--/* Delayed deallocation of port_info objects.
--
-- Copyright (C) 2015 Free Software Foundation, Inc.
--
-- Written by Justus Winter <address@hidden>
--
-- This file is part of the GNU Hurd.
--
-- The GNU Hurd is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License as
-- published by the Free Software Foundation; either version 2, or (at
-- your option) any later version.
--
-- The GNU Hurd is distributed in the hope that it will be useful, but
-- WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>. */
--
--#include <assert.h>
--#include <pthread.h>
--#include "ports.h"
--
--/*
-- * A threadpool has a color indicating which threads belong to the old
-- * generation.
-- */
--#define COLOR_BLACK 0
--#define COLOR_WHITE 1
--#define COLOR_INVALID ~0U
--
--static inline int
--valid_color (unsigned int c)
--{
-- return c == COLOR_BLACK || c == COLOR_WHITE;
--}
--
--static inline unsigned int
--flip_color (unsigned int c)
--{
-- assert (valid_color (c));
-- return ! c;
--}
--
--/* Initialize the thread pool. */
--void
--_ports_threadpool_init (struct ports_threadpool *pool)
--{
-- pthread_spin_init (&pool->lock, PTHREAD_PROCESS_PRIVATE);
-- pool->color = COLOR_BLACK;
-- pool->old_threads = 0;
-- pool->old_objects = NULL;
-- pool->young_threads = 0;
-- pool->young_objects = NULL;
--}
--
--/* Turn all young objects and threads into old ones. */
--static inline void
--flip_generations (struct ports_threadpool *pool)
--{
-- assert (pool->old_threads == 0);
-- pool->old_threads = pool->young_threads;
-- pool->old_objects = pool->young_objects;
-- pool->young_threads = 0;
-- pool->young_objects = NULL;
-- pool->color = flip_color (pool->color);
--}
--
--/* Called by a thread to join a thread pool. */
--void
--_ports_thread_online (struct ports_threadpool *pool,
-- struct ports_thread *thread)
--{
-- pthread_spin_lock (&pool->lock);
-- thread->color = flip_color (pool->color);
-- pool->young_threads += 1;
-- pthread_spin_unlock (&pool->lock);
--}
--
--struct pi_list
--{
-- struct pi_list *next;
-- struct port_info *pi;
--};
--
--/* Called by a thread that enters its quiescent period. */
--void
--_ports_thread_quiescent (struct ports_threadpool *pool,
-- struct ports_thread *thread)
--{
-- struct pi_list *free_list = NULL, *p;
-- assert (valid_color (thread->color));
--
-- pthread_spin_lock (&pool->lock);
-- if (thread->color == pool->color)
-- {
-- pool->old_threads -= 1;
-- pool->young_threads += 1;
-- thread->color = flip_color (thread->color);
--
-- if (pool->old_threads == 0)
-- {
-- free_list = pool->old_objects;
-- flip_generations (pool);
-- }
-- }
-- pthread_spin_unlock (&pool->lock);
--
-- for (p = free_list; p;)
-- {
-- struct pi_list *old = p;
-- p = p->next;
--
-- ports_port_deref (old->pi);
-- free (old);
-- }
--}
--
--/* Called by a thread to leave a thread pool. */
--void
--_ports_thread_offline (struct ports_threadpool *pool,
-- struct ports_thread *thread)
--{
-- assert (valid_color (thread->color));
--
-- retry:
-- pthread_spin_lock (&pool->lock);
-- if (thread->color == pool->color)
-- {
-- pthread_spin_unlock (&pool->lock);
-- _ports_thread_quiescent (pool, thread);
-- goto retry;
-- }
-- thread->color = COLOR_INVALID;
-- pool->young_threads -= 1;
-- pthread_spin_unlock (&pool->lock);
--}
--
--/* Schedule an object for deallocation. */
--void
--_ports_port_deref_deferred (struct port_info *pi)
--{
-- struct ports_threadpool *pool = &pi->bucket->threadpool;
--
-- struct pi_list *pl = malloc (sizeof *pl);
-- if (pl == NULL)
-- return;
-- pl->pi = pi;
--
-- pthread_spin_lock (&pool->lock);
-- pl->next = pool->young_objects;
-- pool->young_objects = pl;
-- if (pool->old_threads == 0)
-- {
-- assert (pool->old_objects == NULL);
-- flip_generations (pool);
-- }
-- pthread_spin_unlock (&pool->lock);
--}
-diff --git b/libports/port-deref-deferred.h a/libports/port-deref-deferred.h
-deleted file mode 100644
-index 1589cb2..0000000
---- b/libports/port-deref-deferred.h
-+++ /dev/null
-@@ -1,89 +0,0 @@
--/* Delayed deallocation of port_info objects.
--
-- Copyright (C) 2015 Free Software Foundation, Inc.
--
-- Written by Justus Winter <address@hidden>
--
-- This file is part of the GNU Hurd.
--
-- The GNU Hurd is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License as
-- published by the Free Software Foundation; either version 2, or (at
-- your option) any later version.
--
-- The GNU Hurd is distributed in the hope that it will be useful, but
-- WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>. */
--
--#ifndef _HURD_PORTS_DEREF_DEFERRED_
--#define _HURD_PORTS_DEREF_DEFERRED_
--
--#include <pthread.h>
--
--/* A list of port_info objects. */
--struct pi_list;
--
--/* We use protected payloads to look up objects without taking a lock.
-- A complication arises if we destroy an object using
-- ports_destroy_right. To avoid payloads from becoming stale (and
-- resulting in invalid memory accesses when being interpreted as
-- pointer), we delay the deallocation of those object until all
-- threads running at the time of the objects destruction are done
-- with whatever they were doing and entered a quiescent period. */
--struct ports_threadpool
--{
-- /* Access to the threadpool object is serialized by this lock. */
-- pthread_spinlock_t lock;
--
-- /* We maintain two sets of objects and threads. Each thread and the
-- threadpool itself has a color. If a thread has the same color as
-- the thread pool, it belongs to the old generation. */
-- unsigned int color;
--
-- /* The number of old threads. When an old thread enters its
-- quiescent period, it decrements OLD_THREADS and flips its color
-- (hence becoming a young thread). */
-- size_t old_threads;
--
-- /* A list of old objects. Once OLD_THREADS drops to zero, they are
-- deallocated, and all young threads and objects become old threads
-- and objects. */
-- struct pi_list *old_objects;
--
-- /* The number of young threads. Any thread joining or leaving the
-- thread group must be a young thread. */
-- size_t young_threads;
--
-- /* The list of young objects. Any object being marked for delayed
-- deallocation is added to this list. */
-- struct pi_list *young_objects;
--};
--
--/* Per-thread state. */
--struct ports_thread
--{
-- unsigned int color;
--};
--
--/* Initialize the thread pool. */
--void _ports_threadpool_init (struct ports_threadpool *);
--
--/* Called by a thread to join a thread pool. */
--void _ports_thread_online (struct ports_threadpool *, struct ports_thread *);
--
--/* Called by a thread that enters its quiescent period. */
--void _ports_thread_quiescent (struct ports_threadpool *, struct ports_thread
*);
--
--/* Called by a thread to leave a thread pool. */
--void _ports_thread_offline (struct ports_threadpool *, struct ports_thread *);
--
--struct port_info;
--
--/* Schedule an object for deallocation. */
--void _ports_port_deref_deferred (struct port_info *);
--
--#endif /* _HURD_PORTS_DEREF_DEFERRED_ */
-diff --git b/libports/ports.h a/libports/ports.h
-index 9299bc4..f02edb4 100644
---- b/libports/ports.h
-+++ a/libports/ports.h
-@@ -29,8 +29,6 @@
- #include <pthread.h>
- #include <refcount.h>
-
--#include "port-deref-deferred.h"
--
- #ifdef PORTS_DEFINE_EI
- #define PORTS_EI
- #else
-@@ -75,7 +73,6 @@ struct port_bucket
- int rpcs;
- int flags;
- int count;
-- struct ports_threadpool threadpool;
- };
- /* FLAGS above are the following: */
- #define PORT_BUCKET_INHIBITED PORTS_INHIBITED
-@@ -265,9 +262,6 @@ ports_lookup_payload (struct port_bucket *bucket,
- {
- struct port_info *pi = (struct port_info *) payload;
-
-- if (pi && ! MACH_PORT_VALID (pi->port_right))
-- pi = NULL;
--
- if (pi && bucket && pi->bucket != bucket)
- pi = NULL;
-
-diff --git b/libports/reallocate-from-external.c
a/libports/reallocate-from-external.c
-index d0fae1a..7205bd9 100644
---- b/libports/reallocate-from-external.c
-+++ a/libports/reallocate-from-external.c
-@@ -71,10 +71,6 @@ ports_reallocate_from_external (void *portstruct,
mach_port_t receive)
- pthread_mutex_unlock (&_ports_lock);
- assert_perror (err);
-
-- /* This is an optimization. It may fail. */
-- mach_port_set_protected_payload (mach_task_self (), pi->port_right,
-- (unsigned long) pi);
--
- mach_port_move_member (mach_task_self (), receive, pi->bucket->portset);
-
- if (stat.mps_srights)
-diff --git b/libports/reallocate-port.c a/libports/reallocate-port.c
-index 4e859a1..cc534eb 100644
---- b/libports/reallocate-port.c
-+++ a/libports/reallocate-port.c
-@@ -59,10 +59,6 @@ ports_reallocate_port (void *portstruct)
- pthread_mutex_unlock (&_ports_lock);
- assert_perror (err);
-
-- /* This is an optimization. It may fail. */
-- mach_port_set_protected_payload (mach_task_self (), pi->port_right,
-- (unsigned long) pi);
--
- err = mach_port_move_member (mach_task_self (), pi->port_right,
- pi->bucket->portset);
- assert_perror (err);
-diff --git b/libports/transfer-right.c a/libports/transfer-right.c
-index 64de7f7..776a8d2 100644
---- b/libports/transfer-right.c
-+++ a/libports/transfer-right.c
-@@ -91,9 +91,6 @@ ports_transfer_right (void *tostruct,
- err = hurd_ihash_add (&topi->bucket->htable, port, topi);
- pthread_rwlock_unlock (&_ports_htable_lock);
- assert_perror (err);
-- /* This is an optimization. It may fail. */
-- mach_port_set_protected_payload (mach_task_self (), port,
-- (unsigned long) topi);
- if (topi->bucket != frompi->bucket)
- {
- err = mach_port_move_member (mach_task_self (), port,
diff --git a/debian/patches/series b/debian/patches/series
index 7327fb8..3df0cf7 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -40,4 +40,4 @@ MAKEDEV-apm.patch
term-for-tcl.patch
disable_new_task_notification.diff
newRPC.patch
-git-R-libdiskfs-protected-payload.patch
+dl_origin.patch
--
Alioth's /usr/local/bin/git-commit-notice on
/srv/git.debian.org/git/pkg-hurd/hurd.git