diff options
Diffstat (limited to 'fs/hfs/super.c')
| -rw-r--r-- | fs/hfs/super.c | 16 | 
1 files changed, 13 insertions, 3 deletions
diff --git a/fs/hfs/super.c b/fs/hfs/super.c index 941d7a8c219..e93ddaadfd1 100644 --- a/fs/hfs/super.c +++ b/fs/hfs/super.c @@ -138,7 +138,9 @@ static int hfs_show_options(struct seq_file *seq, struct dentry *root)  		seq_printf(seq, ",creator=%.4s", (char *)&sbi->s_creator);  	if (sbi->s_type != cpu_to_be32(0x3f3f3f3f))  		seq_printf(seq, ",type=%.4s", (char *)&sbi->s_type); -	seq_printf(seq, ",uid=%u,gid=%u", sbi->s_uid, sbi->s_gid); +	seq_printf(seq, ",uid=%u,gid=%u", +			from_kuid_munged(&init_user_ns, sbi->s_uid), +			from_kgid_munged(&init_user_ns, sbi->s_gid));  	if (sbi->s_file_umask != 0133)  		seq_printf(seq, ",file_umask=%o", sbi->s_file_umask);  	if (sbi->s_dir_umask != 0022) @@ -254,14 +256,22 @@ static int parse_options(char *options, struct hfs_sb_info *hsb)  				printk(KERN_ERR "hfs: uid requires an argument\n");  				return 0;  			} -			hsb->s_uid = (uid_t)tmp; +			hsb->s_uid = make_kuid(current_user_ns(), (uid_t)tmp); +			if (!uid_valid(hsb->s_uid)) { +				printk(KERN_ERR "hfs: invalid uid %d\n", tmp); +				return 0; +			}  			break;  		case opt_gid:  			if (match_int(&args[0], &tmp)) {  				printk(KERN_ERR "hfs: gid requires an argument\n");  				return 0;  			} -			hsb->s_gid = (gid_t)tmp; +			hsb->s_gid = make_kgid(current_user_ns(), (gid_t)tmp); +			if (!gid_valid(hsb->s_gid)) { +				printk(KERN_ERR "hfs: invalid gid %d\n", tmp); +				return 0; +			}  			break;  		case opt_umask:  			if (match_octal(&args[0], &tmp)) {  |