summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/autofs/common.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/usr.sbin/autofs/common.c b/usr.sbin/autofs/common.c
index 7dccdee..d725eab 100644
--- a/usr.sbin/autofs/common.c
+++ b/usr.sbin/autofs/common.c
@@ -661,23 +661,25 @@ node_find_x(struct node *node, const char *path)
char *tmp;
size_t tmplen;
- //log_debugx("looking up %s in %s", path, node->n_key);
-
- tmp = node_path(node);
- tmplen = strlen(tmp);
- if (strncmp(tmp, path, tmplen) != 0) {
- free(tmp);
- return (NULL);
- }
- if (path[tmplen] != '/' && path[tmplen] != '\0') {
- /*
- * If we have two map entries like 'foo' and 'foobar', make
- * sure the search for 'foobar' won't match 'foo' instead.
- */
+ //log_debugx("looking up %s in %s", path, node_path(node));
+
+ if (!node_is_direct_key(node)) {
+ tmp = node_path(node);
+ tmplen = strlen(tmp);
+ if (strncmp(tmp, path, tmplen) != 0) {
+ free(tmp);
+ return (NULL);
+ }
+ if (path[tmplen] != '/' && path[tmplen] != '\0') {
+ /*
+ * If we have two map entries like 'foo' and 'foobar', make
+ * sure the search for 'foobar' won't match 'foo' instead.
+ */
+ free(tmp);
+ return (NULL);
+ }
free(tmp);
- return (NULL);
}
- free(tmp);
TAILQ_FOREACH(child, &node->n_children, n_next) {
found = node_find_x(child, path);
@@ -685,6 +687,9 @@ node_find_x(struct node *node, const char *path)
return (found);
}
+ if (node->n_parent == NULL || node_is_direct_key(node))
+ return (NULL);
+
return (node);
}
@@ -693,9 +698,12 @@ node_find(struct node *root, const char *path)
{
struct node *node;
+ assert(root->n_parent == NULL);
+
node = node_find_x(root, path);
- if (node == root)
- return (NULL);
+ if (node != NULL)
+ assert(node != root);
+
return (node);
}
OpenPOWER on IntegriCloud