Hurd: Fix ulinks in fd table reallocation
* hurd/hurd/userlink.h (_hurd_userlink_move): New function. * hurd/hurd/port.h (_hurd_port_move): New function. * sysdeps/mach/hurd/spawni.c (NEW_ULINK_TABLE): New macro. (EXPAND_DTABLE): Use NEW_ULINK_TABLE macro for ulink_dtable.
This commit is contained in:
parent
434c34bd8e
commit
7fa495cdf7
|
@ -5,6 +5,10 @@
|
||||||
(reauthenticate): Test and use ccwdir.
|
(reauthenticate): Test and use ccwdir.
|
||||||
(child_init_port): In non-resetids case, test and use ccwdir.
|
(child_init_port): In non-resetids case, test and use ccwdir.
|
||||||
(child_chdir): New nested function to set ccwdir.
|
(child_chdir): New nested function to set ccwdir.
|
||||||
|
* hurd/hurd/userlink.h (_hurd_userlink_move): New function.
|
||||||
|
* hurd/hurd/port.h (_hurd_port_move): New function.
|
||||||
|
* sysdeps/mach/hurd/spawni.c (NEW_ULINK_TABLE): New macro.
|
||||||
|
(EXPAND_DTABLE): Use NEW_ULINK_TABLE macro for ulink_dtable.
|
||||||
|
|
||||||
2018-11-09 Martin Sebor <msebor@redhat.com>
|
2018-11-09 Martin Sebor <msebor@redhat.com>
|
||||||
|
|
||||||
|
|
|
@ -127,6 +127,31 @@ _hurd_port_get (struct hurd_port *port,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Relocate LINK to NEW_LINK.
|
||||||
|
To be used when e.g. reallocating a link array. */
|
||||||
|
|
||||||
|
extern void
|
||||||
|
_hurd_port_move (struct hurd_port *port,
|
||||||
|
struct hurd_userlink *new_link,
|
||||||
|
struct hurd_userlink *link);
|
||||||
|
|
||||||
|
#if defined __USE_EXTERN_INLINES && defined _LIBC
|
||||||
|
# if IS_IN (libc)
|
||||||
|
_HURD_PORT_H_EXTERN_INLINE void
|
||||||
|
_hurd_port_move (struct hurd_port *port,
|
||||||
|
struct hurd_userlink *new_link,
|
||||||
|
struct hurd_userlink *link)
|
||||||
|
{
|
||||||
|
HURD_CRITICAL_BEGIN;
|
||||||
|
__spin_lock (&port->lock);
|
||||||
|
_hurd_userlink_move (new_link, link);
|
||||||
|
__spin_unlock (&port->lock);
|
||||||
|
HURD_CRITICAL_END;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Free a reference gotten with `USED_PORT = _hurd_port_get (PORT, LINK);' */
|
/* Free a reference gotten with `USED_PORT = _hurd_port_get (PORT, LINK);' */
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
|
|
|
@ -142,6 +142,30 @@ _hurd_userlink_unlink (struct hurd_userlink *link)
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Relocate LINK to NEW_LINK.
|
||||||
|
To be used when e.g. reallocating a link array. */
|
||||||
|
|
||||||
|
extern void _hurd_userlink_move (struct hurd_userlink *new_link,
|
||||||
|
struct hurd_userlink *link);
|
||||||
|
|
||||||
|
#if defined __USE_EXTERN_INLINES && defined _LIBC
|
||||||
|
# if IS_IN (libc)
|
||||||
|
_HURD_USERLINK_H_EXTERN_INLINE void
|
||||||
|
_hurd_userlink_move (struct hurd_userlink *new_link,
|
||||||
|
struct hurd_userlink *link)
|
||||||
|
{
|
||||||
|
*new_link = *link;
|
||||||
|
|
||||||
|
if (new_link->resource.next != NULL)
|
||||||
|
new_link->resource.next->resource.prevp = &new_link->resource.next;
|
||||||
|
*new_link->resource.prevp = link;
|
||||||
|
|
||||||
|
if (new_link->thread.next != NULL)
|
||||||
|
new_link->thread.next->thread.prevp = &new_link->thread.next;
|
||||||
|
*new_link->thread.prevp = link;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Clear all users from *CHAINP. Call this when the resource *CHAINP
|
/* Clear all users from *CHAINP. Call this when the resource *CHAINP
|
||||||
protects is changing. If the return value is nonzero, no users are on
|
protects is changing. If the return value is nonzero, no users are on
|
||||||
|
|
|
@ -457,7 +457,7 @@ __spawni (pid_t *pid, const char *file,
|
||||||
{ \
|
{ \
|
||||||
/* We need to expand the dtable for the child. */ \
|
/* We need to expand the dtable for the child. */ \
|
||||||
NEW_TABLE (dtable, newfd); \
|
NEW_TABLE (dtable, newfd); \
|
||||||
NEW_TABLE (ulink_dtable, newfd); \
|
NEW_ULINK_TABLE (ulink_dtable, newfd); \
|
||||||
NEW_TABLE (dtable_cells, newfd); \
|
NEW_TABLE (dtable_cells, newfd); \
|
||||||
dtablesize = newfd + 1; \
|
dtablesize = newfd + 1; \
|
||||||
} \
|
} \
|
||||||
|
@ -467,6 +467,16 @@ __spawni (pid_t *pid, const char *file,
|
||||||
do { __typeof (x) new_##x = __alloca ((newfd + 1) * sizeof (x[0])); \
|
do { __typeof (x) new_##x = __alloca ((newfd + 1) * sizeof (x[0])); \
|
||||||
memcpy (new_##x, x, dtablesize * sizeof (x[0])); \
|
memcpy (new_##x, x, dtablesize * sizeof (x[0])); \
|
||||||
memset (&new_##x[dtablesize], 0, (newfd + 1 - dtablesize) * sizeof (x[0])); \
|
memset (&new_##x[dtablesize], 0, (newfd + 1 - dtablesize) * sizeof (x[0])); \
|
||||||
|
x = new_##x; } while (0)
|
||||||
|
#define NEW_ULINK_TABLE(x, newfd) \
|
||||||
|
do { __typeof (x) new_##x = __alloca ((newfd + 1) * sizeof (x[0])); \
|
||||||
|
unsigned i; \
|
||||||
|
for (i = 0; i < dtablesize; i++) \
|
||||||
|
if (dtable_cells[i] != NULL) \
|
||||||
|
_hurd_port_move (dtable_cells[i], &new_##x[i], &x[i]); \
|
||||||
|
else \
|
||||||
|
memset(&new_##x[i], 0, sizeof(new_##x[i])); \
|
||||||
|
memset (&new_##x[dtablesize], 0, (newfd + 1 - dtablesize) * sizeof (x[0])); \
|
||||||
x = new_##x; } while (0)
|
x = new_##x; } while (0)
|
||||||
|
|
||||||
struct __spawn_action *action = &file_actions->__actions[i];
|
struct __spawn_action *action = &file_actions->__actions[i];
|
||||||
|
|
Loading…
Reference in New Issue