diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2021-03-25 21:12:34 +0300 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2021-03-26 01:57:42 +0300 |
commit | 7f6c411c9b50cfab41cc798e003eff27608c7016 (patch) | |
tree | 8a3be5560a83e11bc07774673eb180354c31f86a /fs | |
parent | a38fd8748464831584a19438cbb3082b5a2dab15 (diff) | |
download | linux-7f6c411c9b50cfab41cc798e003eff27608c7016.tar.xz |
hostfs: fix memory handling in follow_link()
1) argument should not be freed in any case - the caller already has
it as ->s_fs_info (and uses it a lot afterwards)
2) allocate readlink buffer with kmalloc() - the caller has no way
to tell if it's got that (on absolute symlink) or a result of
kasprintf(). Sure, for SLAB and SLUB kfree() works on results of
kmem_cache_alloc(), but that's not documented anywhere, might change
in the future *and* is already not true for SLOB.
Fixes: 52b209f7b848 ("get rid of hostfs_read_inode()")
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/hostfs/hostfs_kern.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 29e407762626..743a005a5c64 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c @@ -144,7 +144,7 @@ static char *follow_link(char *link) char *name, *resolved, *end; int n; - name = __getname(); + name = kmalloc(PATH_MAX, GFP_KERNEL); if (!name) { n = -ENOMEM; goto out_free; @@ -173,12 +173,11 @@ static char *follow_link(char *link) goto out_free; } - __putname(name); - kfree(link); + kfree(name); return resolved; out_free: - __putname(name); + kfree(name); return ERR_PTR(n); } |