Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

userns: Convert ext2 to use kuid/kgid where appropriate.

Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>

+42 -23
+3 -2
fs/ext2/balloc.c
··· 1193 1193 free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); 1194 1194 root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count); 1195 1195 if (free_blocks < root_blocks + 1 && !capable(CAP_SYS_RESOURCE) && 1196 - sbi->s_resuid != current_fsuid() && 1197 - (sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) { 1196 + !uid_eq(sbi->s_resuid, current_fsuid()) && 1197 + (gid_eq(sbi->s_resgid, GLOBAL_ROOT_GID) || 1198 + !in_group_p (sbi->s_resgid))) { 1198 1199 return 0; 1199 1200 } 1200 1201 return 1;
+4 -4
fs/ext2/ext2.h
··· 82 82 struct buffer_head ** s_group_desc; 83 83 unsigned long s_mount_opt; 84 84 unsigned long s_sb_block; 85 - uid_t s_resuid; 86 - gid_t s_resgid; 85 + kuid_t s_resuid; 86 + kgid_t s_resgid; 87 87 unsigned short s_mount_state; 88 88 unsigned short s_pad; 89 89 int s_addr_per_block_bits; ··· 637 637 */ 638 638 struct ext2_mount_options { 639 639 unsigned long s_mount_opt; 640 - uid_t s_resuid; 641 - gid_t s_resgid; 640 + kuid_t s_resuid; 641 + kgid_t s_resgid; 642 642 }; 643 643 644 644 /*
+12 -8
fs/ext2/inode.c
··· 1293 1293 struct inode *inode; 1294 1294 long ret = -EIO; 1295 1295 int n; 1296 + uid_t i_uid; 1297 + gid_t i_gid; 1296 1298 1297 1299 inode = iget_locked(sb, ino); 1298 1300 if (!inode) ··· 1312 1310 } 1313 1311 1314 1312 inode->i_mode = le16_to_cpu(raw_inode->i_mode); 1315 - inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); 1316 - inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); 1313 + i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); 1314 + i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); 1317 1315 if (!(test_opt (inode->i_sb, NO_UID32))) { 1318 - inode->i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; 1319 - inode->i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; 1316 + i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16; 1317 + i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16; 1320 1318 } 1319 + i_uid_write(inode, i_uid); 1320 + i_gid_write(inode, i_gid); 1321 1321 set_nlink(inode, le16_to_cpu(raw_inode->i_links_count)); 1322 1322 inode->i_size = le32_to_cpu(raw_inode->i_size); 1323 1323 inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime); ··· 1417 1413 struct ext2_inode_info *ei = EXT2_I(inode); 1418 1414 struct super_block *sb = inode->i_sb; 1419 1415 ino_t ino = inode->i_ino; 1420 - uid_t uid = inode->i_uid; 1421 - gid_t gid = inode->i_gid; 1416 + uid_t uid = i_uid_read(inode); 1417 + gid_t gid = i_gid_read(inode); 1422 1418 struct buffer_head * bh; 1423 1419 struct ext2_inode * raw_inode = ext2_get_inode(sb, ino, &bh); 1424 1420 int n; ··· 1533 1529 1534 1530 if (is_quota_modification(inode, iattr)) 1535 1531 dquot_initialize(inode); 1536 - if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || 1537 - (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { 1532 + if ((iattr->ia_valid & ATTR_UID && !uid_eq(iattr->ia_uid, inode->i_uid)) || 1533 + (iattr->ia_valid & ATTR_GID && !gid_eq(iattr->ia_gid, inode->i_gid))) { 1538 1534 error = dquot_transfer(inode, iattr); 1539 1535 if (error) 1540 1536 return error;
+23 -8
fs/ext2/super.c
··· 228 228 seq_puts(seq, ",grpid"); 229 229 if (!test_opt(sb, GRPID) && (def_mount_opts & EXT2_DEFM_BSDGROUPS)) 230 230 seq_puts(seq, ",nogrpid"); 231 - if (sbi->s_resuid != EXT2_DEF_RESUID || 231 + if (!uid_eq(sbi->s_resuid, make_kuid(&init_user_ns, EXT2_DEF_RESUID)) || 232 232 le16_to_cpu(es->s_def_resuid) != EXT2_DEF_RESUID) { 233 - seq_printf(seq, ",resuid=%u", sbi->s_resuid); 233 + seq_printf(seq, ",resuid=%u", 234 + from_kuid_munged(&init_user_ns, sbi->s_resuid)); 234 235 } 235 - if (sbi->s_resgid != EXT2_DEF_RESGID || 236 + if (!gid_eq(sbi->s_resgid, make_kgid(&init_user_ns, EXT2_DEF_RESGID)) || 236 237 le16_to_cpu(es->s_def_resgid) != EXT2_DEF_RESGID) { 237 - seq_printf(seq, ",resgid=%u", sbi->s_resgid); 238 + seq_printf(seq, ",resgid=%u", 239 + from_kgid_munged(&init_user_ns, sbi->s_resgid)); 238 240 } 239 241 if (test_opt(sb, ERRORS_RO)) { 240 242 int def_errors = le16_to_cpu(es->s_errors); ··· 438 436 struct ext2_sb_info *sbi = EXT2_SB(sb); 439 437 substring_t args[MAX_OPT_ARGS]; 440 438 int option; 439 + kuid_t uid; 440 + kgid_t gid; 441 441 442 442 if (!options) 443 443 return 1; ··· 466 462 case Opt_resuid: 467 463 if (match_int(&args[0], &option)) 468 464 return 0; 469 - sbi->s_resuid = option; 465 + uid = make_kuid(current_user_ns(), option); 466 + if (!uid_valid(uid)) { 467 + ext2_msg(sb, KERN_ERR, "Invalid uid value %d", option); 468 + return -1; 469 + 470 + } 471 + sbi->s_resuid = uid; 470 472 break; 471 473 case Opt_resgid: 472 474 if (match_int(&args[0], &option)) 473 475 return 0; 474 - sbi->s_resgid = option; 476 + gid = make_kgid(current_user_ns(), option); 477 + if (!gid_valid(gid)) { 478 + ext2_msg(sb, KERN_ERR, "Invalid gid value %d", option); 479 + return -1; 480 + } 481 + sbi->s_resgid = gid; 475 482 break; 476 483 case Opt_sb: 477 484 /* handled by get_sb_block() instead of here */ ··· 856 841 else 857 842 set_opt(sbi->s_mount_opt, ERRORS_RO); 858 843 859 - sbi->s_resuid = le16_to_cpu(es->s_def_resuid); 860 - sbi->s_resgid = le16_to_cpu(es->s_def_resgid); 844 + sbi->s_resuid = make_kuid(&init_user_ns, le16_to_cpu(es->s_def_resuid)); 845 + sbi->s_resgid = make_kgid(&init_user_ns, le16_to_cpu(es->s_def_resgid)); 861 846 862 847 set_opt(sbi->s_mount_opt, RESERVATION); 863 848
-1
init/Kconfig
··· 929 929 depends on ECRYPT_FS = n 930 930 depends on EFS_FS = n 931 931 depends on EXOFS_FS = n 932 - depends on EXT2_FS = n 933 932 depends on EXT3_FS = n 934 933 depends on EXT4_FS = n 935 934 depends on FAT_FS = n