diff options
Diffstat (limited to 'fs/open.c')
| -rw-r--r-- | fs/open.c | 20 | 
1 files changed, 16 insertions, 4 deletions
diff --git a/fs/open.c b/fs/open.c index 54198538b67..3fa4e4ffce4 100644 --- a/fs/open.c +++ b/fs/open.c @@ -335,7 +335,7 @@ asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length)  {  	long ret = do_sys_ftruncate(fd, length, 1);  	/* avoid REGPARM breakage on x86: */ -	prevent_tail_call(ret); +	asmlinkage_protect(2, ret, fd, length);  	return ret;  } @@ -350,7 +350,7 @@ asmlinkage long sys_ftruncate64(unsigned int fd, loff_t length)  {  	long ret = do_sys_ftruncate(fd, length, 0);  	/* avoid REGPARM breakage on x86: */ -	prevent_tail_call(ret); +	asmlinkage_protect(2, ret, fd, length);  	return ret;  }  #endif @@ -903,6 +903,18 @@ struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)  	int error;  	struct file *f; +	/* +	 * We must always pass in a valid mount pointer.   Historically +	 * callers got away with not passing it, but we must enforce this at +	 * the earliest possible point now to avoid strange problems deep in the +	 * filesystem stack. +	 */ +	if (!mnt) { +		printk(KERN_WARNING "%s called with NULL vfsmount\n", __func__); +		dump_stack(); +		return ERR_PTR(-EINVAL); +	} +  	error = -ENFILE;  	f = get_empty_filp();  	if (f == NULL) { @@ -1055,7 +1067,7 @@ asmlinkage long sys_open(const char __user *filename, int flags, int mode)  	ret = do_sys_open(AT_FDCWD, filename, flags, mode);  	/* avoid REGPARM breakage on x86: */ -	prevent_tail_call(ret); +	asmlinkage_protect(3, ret, filename, flags, mode);  	return ret;  } @@ -1069,7 +1081,7 @@ asmlinkage long sys_openat(int dfd, const char __user *filename, int flags,  	ret = do_sys_open(dfd, filename, flags, mode);  	/* avoid REGPARM breakage on x86: */ -	prevent_tail_call(ret); +	asmlinkage_protect(4, ret, dfd, filename, flags, mode);  	return ret;  }  |