Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 542ce7a9 authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Al Viro
Browse files

cachefiles: use path_get instead of lone dget



Dentry references should not be acquired without a corresponding
vfsmount ref.

Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
Acked-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 6d0b5456
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
@@ -553,7 +553,7 @@ static int cachefiles_daemon_tag(struct cachefiles_cache *cache, char *args)
static int cachefiles_daemon_cull(struct cachefiles_cache *cache, char *args)
{
	struct fs_struct *fs;
	struct dentry *dir;
	struct path path;
	const struct cred *saved_cred;
	int ret;

@@ -575,22 +575,23 @@ static int cachefiles_daemon_cull(struct cachefiles_cache *cache, char *args)
	/* extract the directory dentry from the cwd */
	fs = current->fs;
	read_lock(&fs->lock);
	dir = dget(fs->pwd.dentry);
	path = fs->pwd;
	path_get(&path);
	read_unlock(&fs->lock);

	if (!S_ISDIR(dir->d_inode->i_mode))
	if (!S_ISDIR(path.dentry->d_inode->i_mode))
		goto notdir;

	cachefiles_begin_secure(cache, &saved_cred);
	ret = cachefiles_cull(cache, dir, args);
	ret = cachefiles_cull(cache, path.dentry, args);
	cachefiles_end_secure(cache, saved_cred);

	dput(dir);
	path_put(&path);
	_leave(" = %d", ret);
	return ret;

notdir:
	dput(dir);
	path_put(&path);
	kerror("cull command requires dirfd to be a directory");
	return -ENOTDIR;

@@ -629,7 +630,7 @@ inval:
static int cachefiles_daemon_inuse(struct cachefiles_cache *cache, char *args)
{
	struct fs_struct *fs;
	struct dentry *dir;
	struct path path;
	const struct cred *saved_cred;
	int ret;

@@ -651,22 +652,23 @@ static int cachefiles_daemon_inuse(struct cachefiles_cache *cache, char *args)
	/* extract the directory dentry from the cwd */
	fs = current->fs;
	read_lock(&fs->lock);
	dir = dget(fs->pwd.dentry);
	path = fs->pwd;
	path_get(&path);
	read_unlock(&fs->lock);

	if (!S_ISDIR(dir->d_inode->i_mode))
	if (!S_ISDIR(path.dentry->d_inode->i_mode))
		goto notdir;

	cachefiles_begin_secure(cache, &saved_cred);
	ret = cachefiles_check_in_use(cache, dir, args);
	ret = cachefiles_check_in_use(cache, path.dentry, args);
	cachefiles_end_secure(cache, saved_cred);

	dput(dir);
	path_put(&path);
	//_leave(" = %d", ret);
	return ret;

notdir:
	dput(dir);
	path_put(&path);
	kerror("inuse command requires dirfd to be a directory");
	return -ENOTDIR;