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

Commit 1ec95bf3 authored by Al Viro's avatar Al Viro
Browse files

9p: close ACL leaks



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent c0d960f0
Loading
Loading
Loading
Loading
+13 −9
Original line number Diff line number Diff line
@@ -185,12 +185,15 @@ int v9fs_acl_chmod(struct dentry *dentry)
}

int v9fs_set_create_acl(struct dentry *dentry,
			struct posix_acl *dpacl, struct posix_acl *pacl)
			struct posix_acl **dpacl, struct posix_acl **pacl)
{
	v9fs_set_acl(dentry, ACL_TYPE_DEFAULT, dpacl);
	v9fs_set_acl(dentry, ACL_TYPE_ACCESS, pacl);
	posix_acl_release(dpacl);
	posix_acl_release(pacl);
	if (dentry) {
		v9fs_set_acl(dentry, ACL_TYPE_DEFAULT, *dpacl);
		v9fs_set_acl(dentry, ACL_TYPE_ACCESS, *pacl);
	}
	posix_acl_release(*dpacl);
	posix_acl_release(*pacl);
	*dpacl = *pacl = NULL;
	return 0;
}

@@ -212,11 +215,11 @@ int v9fs_acl_mode(struct inode *dir, mode_t *modep,
		struct posix_acl *clone;

		if (S_ISDIR(mode))
			*dpacl = acl;
			*dpacl = posix_acl_dup(acl);
		clone = posix_acl_clone(acl, GFP_NOFS);
		retval = -ENOMEM;
		posix_acl_release(acl);
		if (!clone)
			goto cleanup;
			return -ENOMEM;

		retval = posix_acl_create_masq(clone, &mode);
		if (retval < 0) {
@@ -225,11 +228,12 @@ int v9fs_acl_mode(struct inode *dir, mode_t *modep,
		}
		if (retval > 0)
			*pacl = clone;
		else
			posix_acl_release(clone);
	}
	*modep  = mode;
	return 0;
cleanup:
	posix_acl_release(acl);
	return retval;

}
+3 −3
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ extern int v9fs_get_acl(struct inode *, struct p9_fid *);
extern int v9fs_check_acl(struct inode *inode, int mask);
extern int v9fs_acl_chmod(struct dentry *);
extern int v9fs_set_create_acl(struct dentry *,
			       struct posix_acl *, struct posix_acl *);
			       struct posix_acl **, struct posix_acl **);
extern int v9fs_acl_mode(struct inode *dir, mode_t *modep,
			 struct posix_acl **dpacl, struct posix_acl **pacl);
#else
@@ -33,8 +33,8 @@ static inline int v9fs_acl_chmod(struct dentry *dentry)
	return 0;
}
static inline int v9fs_set_create_acl(struct dentry *dentry,
				      struct posix_acl *dpacl,
				      struct posix_acl *pacl)
				      struct posix_acl **dpacl,
				      struct posix_acl **pacl)
{
	return 0;
}
+6 −3
Original line number Diff line number Diff line
@@ -242,7 +242,7 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,
		goto error;

	/* Now set the ACL based on the default value */
	v9fs_set_create_acl(dentry, dacl, pacl);
	v9fs_set_create_acl(dentry, &dacl, &pacl);

	v9inode = V9FS_I(inode);
	mutex_lock(&v9inode->v_mutex);
@@ -283,6 +283,7 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,
err_clunk_old_fid:
	if (ofid)
		p9_client_clunk(ofid);
	v9fs_set_create_acl(NULL, &dacl, &pacl);
	return err;
}

@@ -376,12 +377,13 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
		d_instantiate(dentry, inode);
	}
	/* Now set the ACL based on the default value */
	v9fs_set_create_acl(dentry, dacl, pacl);
	v9fs_set_create_acl(dentry, &dacl, &pacl);
	inc_nlink(dir);
	v9fs_invalidate_inode_attr(dir);
error:
	if (fid)
		p9_client_clunk(fid);
	v9fs_set_create_acl(NULL, &dacl, &pacl);
	return err;
}

@@ -781,10 +783,11 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode,
		d_instantiate(dentry, inode);
	}
	/* Now set the ACL based on the default value */
	v9fs_set_create_acl(dentry, dacl, pacl);
	v9fs_set_create_acl(dentry, &dacl, &pacl);
error:
	if (fid)
		p9_client_clunk(fid);
	v9fs_set_create_acl(NULL, &dacl, &pacl);
	return err;
}