mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +00:00
(bind): Don't use file_invoke_translator, as it doesn't work. Instead just lookup the translated node again, and hope we're not hit by any race conditions.
This commit is contained in:
parent
b8dc6a10ee
commit
221c50840f
@ -62,16 +62,42 @@ DEFUN(bind, (fd, addr, len),
|
||||
_HURD_IFSOCK, sizeof _HURD_IFSOCK,
|
||||
MACH_PORT_NULL,
|
||||
MACH_MSG_TYPE_COPY_SEND);
|
||||
if (! err)
|
||||
/* Link the node, now a socket, into the target directory. */
|
||||
err = __dir_link (node, dir, n);
|
||||
if (! err)
|
||||
/* Get a port to the ifsock translator. */
|
||||
err = __hurd_invoke_translator (node, 0, &ifsock);
|
||||
{
|
||||
retry_type retry;
|
||||
string_t retry_name;
|
||||
|
||||
err = __dir_lookup (dir, n, 0, 0, &retry, retry_name, &ifsock);
|
||||
|
||||
if (! err && (retry != FS_RETRY_NORMAL || retry_name[0]))
|
||||
/* Either someone has fucked with our new node, or the ifsock
|
||||
translator is acting very oddly. */
|
||||
{
|
||||
struct hurd_userlink crdir_ulink;
|
||||
file_t crdir =
|
||||
_hurd_port_get (&_hurd_ports[INIT_PORT_CRDIR],
|
||||
&crdir_ulink);
|
||||
|
||||
err = __hurd_file_name_lookup_retry (crdir,
|
||||
retry, retry_name, 0, 0,
|
||||
&ifsock);
|
||||
|
||||
_hurd_port_free (&_hurd_ports[INIT_PORT_CRDIR],
|
||||
&crdir_ulink, crdir);
|
||||
}
|
||||
|
||||
if (err)
|
||||
/* If we failed, get rid of the node we created. */
|
||||
__dir_unlink (dir, n);
|
||||
}
|
||||
if (! err)
|
||||
/* Get the address port. */
|
||||
err = __ifsock_getsockaddr (ifsock, &aport);
|
||||
__mach_port_deallocate (__mach_task_self (), ifsock);
|
||||
if (! err)
|
||||
/* Link the node, now a socket, into the target directory. */
|
||||
err = __dir_link (node, dir, name);
|
||||
__mach_port_deallocate (__mach_task_self (), node);
|
||||
}
|
||||
__mach_port_deallocate (__mach_task_self (), dir);
|
||||
|
Loading…
Reference in New Issue
Block a user