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

Commit e56b6a5d authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Al Viro
Browse files

Re: [PATCH 3/6] vfs: open_exec cleanup



On Mon, May 19, 2008 at 12:01:49AM +0200, Marcin Slusarz wrote:
> open_exec is needlessly indented, calls ERR_PTR with 0 argument
> (which is not valid errno) and jumps into middle of function
> just to return value.
> So clean it up a bit.

Still looks rather messy.  See below for a better version.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent beb29e05
Loading
Loading
Loading
Loading
+30 −28
Original line number Diff line number Diff line
@@ -656,38 +656,40 @@ EXPORT_SYMBOL(setup_arg_pages);
struct file *open_exec(const char *name)
{
	struct nameidata nd;
	int err;
	struct file *file;
	int err;

	err = path_lookup_open(AT_FDCWD, name, LOOKUP_FOLLOW, &nd,
				FMODE_READ|FMODE_EXEC);
	if (err)
		goto out;

	err = -EACCES;
	if (!S_ISREG(nd.path.dentry->d_inode->i_mode))
		goto out_path_put;

	err = vfs_permission(&nd, MAY_EXEC | MAY_OPEN);
	if (err)
		goto out_path_put;

	file = nameidata_to_filp(&nd, O_RDONLY|O_LARGEFILE);
	if (IS_ERR(file))
		return file;

	err = path_lookup_open(AT_FDCWD, name, LOOKUP_FOLLOW, &nd, FMODE_READ|FMODE_EXEC);
	file = ERR_PTR(err);

	if (!err) {
		struct inode *inode = nd.path.dentry->d_inode;
		file = ERR_PTR(-EACCES);
		if (S_ISREG(inode->i_mode)) {
			int err = vfs_permission(&nd, MAY_EXEC | MAY_OPEN);
			file = ERR_PTR(err);
			if (!err) {
				file = nameidata_to_filp(&nd,
							O_RDONLY|O_LARGEFILE);
				if (!IS_ERR(file)) {
	err = deny_write_access(file);
	if (err) {
		fput(file);
						file = ERR_PTR(err);
					}
		goto out;
	}
out:

	return file;
			}
		}

 out_path_put:
	release_open_intent(&nd);
	path_put(&nd.path);
 out:
	return ERR_PTR(err);
}
	goto out;
}

EXPORT_SYMBOL(open_exec);

int kernel_read(struct file *file, unsigned long offset,