summaryrefslogtreecommitdiff
path: root/trans
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2013-11-14 15:47:00 +0100
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-01-12 15:59:14 +0100
commitdda3d358224c334c8fa4902b3e20c75caf8bddbc (patch)
treed3a45673b0e55a4cc9540115e620d594daba4bd1 /trans
parent8070f62fb5240ee5b924d0dae501a50f4662ffe9 (diff)
trans/mtab: remove the loop detection logic
Previously the mtab detector tried to detect whether it talks to itself by comparing the control port of the translator it currently visits with its own. This was done to prevent deadlocks. However, this did not detect non-trivial loops, i.e. two mtab translators would still dead-lock each other. Now that it is safe to actually file_name_lookup the root node of a mtab translator without triggering the generation of content, this logic can just be omitted. * trans/mtab.c (mtab_populate): Remove the loop detection logic.
Diffstat (limited to 'trans')
-rw-r--r--trans/mtab.c43
1 files changed, 11 insertions, 32 deletions
diff --git a/trans/mtab.c b/trans/mtab.c
index 9b867b7b..0bcd52b4 100644
--- a/trans/mtab.c
+++ b/trans/mtab.c
@@ -282,7 +282,6 @@ mtab_populate (struct mtab *mtab, const char *path, int insecure)
/* These resources are freed in the epilogue. */
file_t node = MACH_PORT_NULL;
- fsys_t fsys = MACH_PORT_NULL;
char *argz = NULL;
size_t argz_len = 0;
char **argv = NULL;
@@ -295,16 +294,16 @@ mtab_populate (struct mtab *mtab, const char *path, int insecure)
char *children = NULL;
size_t children_len = 0;
- /* Get the underlying node. */
- node = file_name_lookup (path, O_NOTRANS, 0666);
- if (node == MACH_PORT_NULL)
- {
- err = errno;
- goto errout;
- }
-
if (! insecure)
{
+ /* Get the underlying node. */
+ node = file_name_lookup (path, O_NOTRANS, 0666);
+ if (node == MACH_PORT_NULL)
+ {
+ err = errno;
+ goto errout;
+ }
+
/* Check who owns the node the translator is bound to. */
io_statbuf_t st;
err = io_stat (node, &st);
@@ -316,28 +315,11 @@ mtab_populate (struct mtab *mtab, const char *path, int insecure)
err = EPERM;
goto errout;
}
- }
- err = file_get_translator_cntl (node, &fsys);
- if (err == EPERM)
- /* If we do not have permission to do that, it cannot be a node
- bound to our control port, so ignore this error. */
- err = 0;
-
- if (err == ENXIO && strcmp (path, "/") == 0)
- /* The root translator fails differently, but this can't be bound
- to our control port either, so ignore this error. */
- err = 0;
-
- if (err)
- return err;
-
- if (control && control->pi.port_right == fsys)
- /* This node is bound to our control port, ignore it. */
- goto errout;
+ mach_port_deallocate (mach_task_self (), node);
+ }
- /* Re-do the lookup without O_NOTRANS to get the root node. */
- mach_port_deallocate (mach_task_self (), node);
+ /* (Re-)do the lookup without O_NOTRANS to get the root node. */
node = file_name_lookup (path, 0, 0666);
if (node == MACH_PORT_NULL)
{
@@ -461,9 +443,6 @@ mtab_populate (struct mtab *mtab, const char *path, int insecure)
if (node != MACH_PORT_NULL)
mach_port_deallocate (mach_task_self (), node);
- if (fsys != MACH_PORT_NULL)
- mach_port_deallocate (mach_task_self (), fsys);
-
if (argz)
vm_deallocate (mach_task_self (), (vm_address_t) argz, argz_len);