diff options
Diffstat (limited to 'fs/debugfs/file.c')
| -rw-r--r-- | fs/debugfs/file.c | 38 | 
1 files changed, 20 insertions, 18 deletions
| diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index dede25247b81..634b09d18b77 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c @@ -142,18 +142,21 @@ EXPORT_SYMBOL_GPL(debugfs_file_put);   * We also need to exclude any file that has ways to write or alter it as root   * can bypass the permissions check.   */ -static bool debugfs_is_locked_down(struct inode *inode, -				   struct file *filp, -				   const struct file_operations *real_fops) +static int debugfs_locked_down(struct inode *inode, +			       struct file *filp, +			       const struct file_operations *real_fops)  {  	if ((inode->i_mode & 07777) == 0444 &&  	    !(filp->f_mode & FMODE_WRITE) &&  	    !real_fops->unlocked_ioctl &&  	    !real_fops->compat_ioctl &&  	    !real_fops->mmap) -		return false; +		return 0; -	return security_locked_down(LOCKDOWN_DEBUGFS); +	if (security_locked_down(LOCKDOWN_DEBUGFS)) +		return -EPERM; + +	return 0;  }  static int open_proxy_open(struct inode *inode, struct file *filp) @@ -168,7 +171,7 @@ static int open_proxy_open(struct inode *inode, struct file *filp)  	real_fops = debugfs_real_fops(filp); -	r = debugfs_is_locked_down(inode, filp, real_fops); +	r = debugfs_locked_down(inode, filp, real_fops);  	if (r)  		goto out; @@ -298,7 +301,7 @@ static int full_proxy_open(struct inode *inode, struct file *filp)  	real_fops = debugfs_real_fops(filp); -	r = debugfs_is_locked_down(inode, filp, real_fops); +	r = debugfs_locked_down(inode, filp, real_fops);  	if (r)  		goto out; @@ -496,10 +499,10 @@ DEFINE_DEBUGFS_ATTRIBUTE(fops_u32_wo, NULL, debugfs_u32_set, "%llu\n");   * This function will return a pointer to a dentry if it succeeds.  This   * pointer must be passed to the debugfs_remove() function when the file is   * to be removed (no automatic cleanup happens if your module is unloaded, - * you are responsible here.)  If an error occurs, %ERR_PTR(-ERROR) will be + * you are responsible here.)  If an error occurs, ERR_PTR(-ERROR) will be   * returned.   * - * If debugfs is not enabled in the kernel, the value %ERR_PTR(-ENODEV) will + * If debugfs is not enabled in the kernel, the value ERR_PTR(-ENODEV) will   * be returned.   */  struct dentry *debugfs_create_u32(const char *name, umode_t mode, @@ -581,10 +584,10 @@ DEFINE_DEBUGFS_ATTRIBUTE(fops_ulong_wo, NULL, debugfs_ulong_set, "%llu\n");   * This function will return a pointer to a dentry if it succeeds.  This   * pointer must be passed to the debugfs_remove() function when the file is   * to be removed (no automatic cleanup happens if your module is unloaded, - * you are responsible here.)  If an error occurs, %ERR_PTR(-ERROR) will be + * you are responsible here.)  If an error occurs, ERR_PTR(-ERROR) will be   * returned.   * - * If debugfs is not enabled in the kernel, the value %ERR_PTR(-ENODEV) will + * If debugfs is not enabled in the kernel, the value ERR_PTR(-ENODEV) will   * be returned.   */  struct dentry *debugfs_create_ulong(const char *name, umode_t mode, @@ -846,10 +849,10 @@ static const struct file_operations fops_bool_wo = {   * This function will return a pointer to a dentry if it succeeds.  This   * pointer must be passed to the debugfs_remove() function when the file is   * to be removed (no automatic cleanup happens if your module is unloaded, - * you are responsible here.)  If an error occurs, %ERR_PTR(-ERROR) will be + * you are responsible here.)  If an error occurs, ERR_PTR(-ERROR) will be   * returned.   * - * If debugfs is not enabled in the kernel, the value %ERR_PTR(-ENODEV) will + * If debugfs is not enabled in the kernel, the value ERR_PTR(-ENODEV) will   * be returned.   */  struct dentry *debugfs_create_bool(const char *name, umode_t mode, @@ -899,10 +902,10 @@ static const struct file_operations fops_blob = {   * This function will return a pointer to a dentry if it succeeds.  This   * pointer must be passed to the debugfs_remove() function when the file is   * to be removed (no automatic cleanup happens if your module is unloaded, - * you are responsible here.)  If an error occurs, %ERR_PTR(-ERROR) will be + * you are responsible here.)  If an error occurs, ERR_PTR(-ERROR) will be   * returned.   * - * If debugfs is not enabled in the kernel, the value %ERR_PTR(-ENODEV) will + * If debugfs is not enabled in the kernel, the value ERR_PTR(-ENODEV) will   * be returned.   */  struct dentry *debugfs_create_blob(const char *name, umode_t mode, @@ -1091,10 +1094,10 @@ static const struct file_operations fops_regset32 = {   * This function will return a pointer to a dentry if it succeeds.  This   * pointer must be passed to the debugfs_remove() function when the file is   * to be removed (no automatic cleanup happens if your module is unloaded, - * you are responsible here.)  If an error occurs, %ERR_PTR(-ERROR) will be + * you are responsible here.)  If an error occurs, ERR_PTR(-ERROR) will be   * returned.   * - * If debugfs is not enabled in the kernel, the value %ERR_PTR(-ENODEV) will + * If debugfs is not enabled in the kernel, the value ERR_PTR(-ENODEV) will   * be returned.   */  struct dentry *debugfs_create_regset32(const char *name, umode_t mode, @@ -1158,4 +1161,3 @@ struct dentry *debugfs_create_devm_seqfile(struct device *dev, const char *name,  				   &debugfs_devm_entry_ops);  }  EXPORT_SYMBOL_GPL(debugfs_create_devm_seqfile); - | 
