Commit bdf6cbf1 authored by Al Viro's avatar Al Viro
Browse files

link_path_walk: final preparations to killing recursion



reduce the number of returns in there - turn all places
where it returns zero into goto OK and places where it
returns non-zero into goto Err.  The only non-trivial
detail is that all breaks in the loop are guaranteed
to be with non-zero err.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent bb8603f8
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -1716,7 +1716,7 @@ static int link_path_walk(const char *name, struct nameidata *nd)
	while (*name=='/')
		name++;
	if (!*name)
		return 0;
		goto OK;

	/* At this point we know we have a real path component. */
	for(;;) {
@@ -1759,7 +1759,7 @@ static int link_path_walk(const char *name, struct nameidata *nd)

		name += hashlen_len(hash_len);
		if (!*name)
			return 0;
			goto OK;
		/*
		 * If it wasn't NUL, we know it was '/'. Skip that
		 * slash, and continue until no more slashes.
@@ -1768,12 +1768,12 @@ static int link_path_walk(const char *name, struct nameidata *nd)
			name++;
		} while (unlikely(*name == '/'));
		if (!*name)
			return 0;
			goto OK;

		err = walk_component(nd, LOOKUP_FOLLOW);
Walked:
		if (err < 0)
			return err;
			goto Err;

		if (err) {
			struct path link;
@@ -1783,7 +1783,8 @@ Walked:
			if (unlikely(current->link_count >= MAX_NESTED_LINKS)) {
				path_put_conditional(&nd->link, nd);
				path_put(&nd->path);
				return -ELOOP;
				err = -ELOOP;
				goto Err;
			}
			BUG_ON(nd->depth >= MAX_NESTED_LINKS);

@@ -1797,7 +1798,7 @@ Walked:
				err = PTR_ERR(s);
				current->link_count--;
				nd->depth--;
				return err;
				goto Err;
			}
			err = 0;
			if (unlikely(!s)) {
@@ -1820,7 +1821,7 @@ Walked:
					put_link(nd, &link, cookie);
					current->link_count--;
					nd->depth--;
					return err;
					goto Err;
				} else {
					err = walk_component(nd, LOOKUP_FOLLOW);
					put_link(nd, &link, cookie);
@@ -1836,7 +1837,10 @@ Walked:
		}
	}
	terminate_walk(nd);
Err:
	return err;
OK:
	return 0;
}

static int path_init(int dfd, const struct filename *name, unsigned int flags,