Commit 115cbfdc authored by Al Viro's avatar Al Viro

let path_init() failures treated the same way as subsequent link_path_walk()

As it is, path_lookupat() and path_mounpoint() might end up leaking struct file
reference in some cases.
Spotted-by: default avatarEric Biggers <ebiggers3@gmail.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 24dff96a
...@@ -1950,7 +1950,7 @@ static int path_lookupat(int dfd, const char *name, ...@@ -1950,7 +1950,7 @@ static int path_lookupat(int dfd, const char *name,
err = path_init(dfd, name, flags | LOOKUP_PARENT, nd, &base); err = path_init(dfd, name, flags | LOOKUP_PARENT, nd, &base);
if (unlikely(err)) if (unlikely(err))
return err; goto out;
current->total_link_count = 0; current->total_link_count = 0;
err = link_path_walk(name, nd); err = link_path_walk(name, nd);
...@@ -1982,6 +1982,7 @@ static int path_lookupat(int dfd, const char *name, ...@@ -1982,6 +1982,7 @@ static int path_lookupat(int dfd, const char *name,
} }
} }
out:
if (base) if (base)
fput(base); fput(base);
...@@ -2301,7 +2302,7 @@ path_mountpoint(int dfd, const char *name, struct path *path, unsigned int flags ...@@ -2301,7 +2302,7 @@ path_mountpoint(int dfd, const char *name, struct path *path, unsigned int flags
err = path_init(dfd, name, flags | LOOKUP_PARENT, &nd, &base); err = path_init(dfd, name, flags | LOOKUP_PARENT, &nd, &base);
if (unlikely(err)) if (unlikely(err))
return err; goto out;
current->total_link_count = 0; current->total_link_count = 0;
err = link_path_walk(name, &nd); err = link_path_walk(name, &nd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment