mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
CacheFiles: Fix memory leak in cachefiles_check_auxdata error paths
In cachefiles_check_auxdata(), we allocate auxbuf but fail to free it if we determine there's an error or that the data is stale. Further, assigning the output of vfs_getxattr() to auxbuf->len gives problems with checking for errors as auxbuf->len is a u16. We don't actually need to set auxbuf->len, so keep the length in a variable for now. We shouldn't need to check the upper limit of the buffer as an overflow there should be indicated by -ERANGE. While we're at it, fscache_check_aux() returns an enum value, not an int, so assign it to an appropriately typed variable rather than to ret. Signed-off-by: Josh Boyer <jwboyer@fedoraproject.org> Signed-off-by: David Howells <dhowells@redhat.com> cc: Hongyi Jia <jiayisuse@gmail.com> cc: Milosz Tanski <milosz@adfin.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
8f4c344696
commit
607566aecc
@ -162,8 +162,9 @@ int cachefiles_update_object_xattr(struct cachefiles_object *object,
|
||||
int cachefiles_check_auxdata(struct cachefiles_object *object)
|
||||
{
|
||||
struct cachefiles_xattr *auxbuf;
|
||||
enum fscache_checkaux validity;
|
||||
struct dentry *dentry = object->dentry;
|
||||
unsigned int dlen;
|
||||
ssize_t xlen;
|
||||
int ret;
|
||||
|
||||
ASSERT(dentry);
|
||||
@ -174,22 +175,22 @@ int cachefiles_check_auxdata(struct cachefiles_object *object)
|
||||
if (!auxbuf)
|
||||
return -ENOMEM;
|
||||
|
||||
auxbuf->len = vfs_getxattr(dentry, cachefiles_xattr_cache,
|
||||
&auxbuf->type, 512 + 1);
|
||||
if (auxbuf->len < 1)
|
||||
return -ESTALE;
|
||||
xlen = vfs_getxattr(dentry, cachefiles_xattr_cache,
|
||||
&auxbuf->type, 512 + 1);
|
||||
ret = -ESTALE;
|
||||
if (xlen < 1 ||
|
||||
auxbuf->type != object->fscache.cookie->def->type)
|
||||
goto error;
|
||||
|
||||
if (auxbuf->type != object->fscache.cookie->def->type)
|
||||
return -ESTALE;
|
||||
|
||||
dlen = auxbuf->len - 1;
|
||||
ret = fscache_check_aux(&object->fscache, &auxbuf->data, dlen);
|
||||
xlen--;
|
||||
validity = fscache_check_aux(&object->fscache, &auxbuf->data, xlen);
|
||||
if (validity != FSCACHE_CHECKAUX_OKAY)
|
||||
goto error;
|
||||
|
||||
ret = 0;
|
||||
error:
|
||||
kfree(auxbuf);
|
||||
if (ret != FSCACHE_CHECKAUX_OKAY)
|
||||
return -ESTALE;
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user