Commit 91a27b2a authored by Jeff Layton's avatar Jeff Layton Committed by Al Viro
Browse files

vfs: define struct filename and have getname() return it



getname() is intended to copy pathname strings from userspace into a
kernel buffer. The result is just a string in kernel space. It would
however be quite helpful to be able to attach some ancillary info to
the string.

For instance, we could attach some audit-related info to reduce the
amount of audit-related processing needed. When auditing is enabled,
we could also call getname() on the string more than once and not
need to recopy it from userspace.

This patchset converts the getname()/putname() interfaces to return
a struct instead of a string. For now, the struct just tracks the
string in kernel space and the original userland pointer for it.

Later, we'll add other information to the struct as it becomes
convenient.

Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 8e377d15
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -449,7 +449,7 @@ osf_ufs_mount(char *dirname, struct ufs_args __user *args, int flags)
{
	int retval;
	struct cdfs_args tmp;
	char *devname;
	struct filename *devname;

	retval = -EFAULT;
	if (copy_from_user(&tmp, args, sizeof(tmp)))
@@ -458,7 +458,7 @@ osf_ufs_mount(char *dirname, struct ufs_args __user *args, int flags)
	retval = PTR_ERR(devname);
	if (IS_ERR(devname))
		goto out;
	retval = do_mount(devname, dirname, "ext2", flags, NULL);
	retval = do_mount(devname->name, dirname, "ext2", flags, NULL);
	putname(devname);
 out:
	return retval;
@@ -469,7 +469,7 @@ osf_cdfs_mount(char *dirname, struct cdfs_args __user *args, int flags)
{
	int retval;
	struct cdfs_args tmp;
	char *devname;
	struct filename *devname;

	retval = -EFAULT;
	if (copy_from_user(&tmp, args, sizeof(tmp)))
@@ -478,7 +478,7 @@ osf_cdfs_mount(char *dirname, struct cdfs_args __user *args, int flags)
	retval = PTR_ERR(devname);
	if (IS_ERR(devname))
		goto out;
	retval = do_mount(devname, dirname, "iso9660", flags, NULL);
	retval = do_mount(devname->name, dirname, "iso9660", flags, NULL);
	putname(devname);
 out:
	return retval;
@@ -499,7 +499,7 @@ SYSCALL_DEFINE4(osf_mount, unsigned long, typenr, const char __user *, path,
		int, flag, void __user *, data)
{
	int retval;
	char *name;
	struct filename *name;

	name = getname(path);
	retval = PTR_ERR(name);
@@ -507,13 +507,13 @@ SYSCALL_DEFINE4(osf_mount, unsigned long, typenr, const char __user *, path,
		goto out;
	switch (typenr) {
	case 1:
		retval = osf_ufs_mount(name, data, flag);
		retval = osf_ufs_mount(name->name, data, flag);
		break;
	case 6:
		retval = osf_cdfs_mount(name, data, flag);
		retval = osf_cdfs_mount(name->name, data, flag);
		break;
	case 9:
		retval = osf_procfs_mount(name, data, flag);
		retval = osf_procfs_mount(name->name, data, flag);
		break;
	default:
		retval = -EINVAL;
+2 −2
Original line number Diff line number Diff line
@@ -50,13 +50,13 @@ asmlinkage long sys_execve(const char __user *filenamei,
			   struct pt_regs *regs)
{
	long error;
	char * filename;
	struct filename *filename;

	filename = getname(filenamei);
	error = PTR_ERR(filename);
	if (IS_ERR(filename))
		goto out;
	error = do_execve(filename, argv, envp, regs);
	error = do_execve(filename->name, argv, envp, regs);
	putname(filename);
out:
	return error;
+3 −3
Original line number Diff line number Diff line
@@ -56,14 +56,14 @@ asmlinkage int compat_sys_execve(const char __user *filenamei,
				 struct pt_regs *regs)
{
	int error;
	char * filename;
	struct filename *filename;

	filename = getname(filenamei);
	error = PTR_ERR(filename);
	if (IS_ERR(filename))
		goto out;
	error = compat_do_execve(filename, compat_ptr(argv), compat_ptr(envp),
				 regs);
	error = compat_do_execve(filename->name, compat_ptr(argv),
					compat_ptr(envp), regs);
	putname(filename);
out:
	return error;
+2 −2
Original line number Diff line number Diff line
@@ -388,14 +388,14 @@ asmlinkage int sys_execve(const char __user *ufilename,
			  struct pt_regs *regs)
{
	int error;
	char *filename;
	struct filename *filename;

	filename = getname(ufilename);
	error = PTR_ERR(filename);
	if (IS_ERR(filename))
		goto out;

	error = do_execve(filename, uargv, uenvp, regs);
	error = do_execve(filename->name, uargv, uenvp, regs);
	putname(filename);

out:
+2 −2
Original line number Diff line number Diff line
@@ -213,14 +213,14 @@ asmlinkage int sys_execve(const char __user *name,
			  const char __user *const __user *envp)
{
	int error;
	char *filename;
	struct filename *filename;
	struct pt_regs *regs = (struct pt_regs *)((&name) + 6);

	filename = getname(name);
	error = PTR_ERR(filename);
	if (IS_ERR(filename))
		return error;
	error = do_execve(filename, argv, envp, regs);
	error = do_execve(filename->name, argv, envp, regs);
	putname(filename);
	return error;
}
Loading