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: Eric Biggers <ebiggers3@gmail.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2014-10-11 23:05:52 -04:00
Родитель 24dff96a37
Коммит 115cbfdc60
1 изменённых файлов: 3 добавлений и 2 удалений

Просмотреть файл

@ -1950,7 +1950,7 @@ static int path_lookupat(int dfd, const char *name,
err = path_init(dfd, name, flags | LOOKUP_PARENT, nd, &base);
if (unlikely(err))
return err;
goto out;
current->total_link_count = 0;
err = link_path_walk(name, nd);
@ -1982,6 +1982,7 @@ static int path_lookupat(int dfd, const char *name,
}
}
out:
if (base)
fput(base);
@ -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);
if (unlikely(err))
return err;
goto out;
current->total_link_count = 0;
err = link_path_walk(name, &nd);