From 5113a6e32b298671c86ae7da097bcd24540cebc9 Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Tue, 8 May 2007 00:10:54 -0400 Subject: [PATCH] Fix mke2fs and debugfs to support large (> 16 bit) uid's and gid's Mke2fs is supposed to set the uid/gid ownership of the root directory when a non-rooot user creates the filesystem. This wasn't working correctly if the uid/gid was > 16 bits. In additional, debugfs wasn't displaying large uid/gid's correctly. This patch fixes these two programs. Signed-off-by: Eric Sandeen Signed-off-by: "Theodore Ts'o" --- debugfs/ChangeLog | 6 ++++++ debugfs/debugfs.c | 2 +- debugfs/ls.c | 2 +- debugfs/lsdel.c | 4 ++-- e2fsck/ChangeLog | 5 +++++ e2fsck/message.c | 6 ++---- lib/ext2fs/ChangeLog | 6 ++++++ lib/ext2fs/ext2_fs.h | 7 ++++++- misc/ChangeLog | 5 +++++ misc/mke2fs.c | 14 ++++++++++---- 10 files changed, 44 insertions(+), 13 deletions(-) diff --git a/debugfs/ChangeLog b/debugfs/ChangeLog index 630cc28..94524fa 100644 --- a/debugfs/ChangeLog +++ b/debugfs/ChangeLog @@ -1,3 +1,9 @@ +2007-05-08 Theodore Tso + + * debugfs.c (internal_dump_inode), ls.c (list_dir_proc), + lsdel.c (do_lsdel): Use inode_uid() and inode_gid() so + that the high bits of the uid/gid are displayed. + 2007-04-19 Theodore Tso * set_fields.c: Add the i_version field to the set_inode_field diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c index c19f2a9..b84b96e 100644 --- a/debugfs/debugfs.c +++ b/debugfs/debugfs.c @@ -534,7 +534,7 @@ void internal_dump_inode(FILE *out, const char *prefix, prefix, inode->i_mode & 0777, inode->i_flags, inode->i_generation); fprintf(out, "%sUser: %5d Group: %5d Size: ", - prefix, inode->i_uid, inode->i_gid); + prefix, inode_uid(*inode), inode_gid(*inode)); if (LINUX_S_ISREG(inode->i_mode)) { __u64 i_size = (inode->i_size | ((unsigned long long)inode->i_size_high << 32)); diff --git a/debugfs/ls.c b/debugfs/ls.c index ffb2310..6ae175d 100644 --- a/debugfs/ls.c +++ b/debugfs/ls.c @@ -88,7 +88,7 @@ static int list_dir_proc(ext2_ino_t dir EXT2FS_ATTR((unused)), } fprintf(ls->f, "%c%6u%c %6o (%d) %5d %5d ", lbr, ino, rbr, inode.i_mode, dirent->name_len >> 8, - inode.i_uid, inode.i_gid); + inode_uid(inode), inode_gid(inode)); if (LINUX_S_ISDIR(inode.i_mode)) fprintf(ls->f, "%5d", inode.i_size); else diff --git a/debugfs/lsdel.c b/debugfs/lsdel.c index d815eb2..3dc32a7 100644 --- a/debugfs/lsdel.c +++ b/debugfs/lsdel.c @@ -23,7 +23,7 @@ struct deleted_info { ext2_ino_t ino; unsigned short mode; - unsigned short uid; + __u32 uid; __u64 size; time_t dtime; int num_blocks; @@ -160,7 +160,7 @@ void do_lsdel(int argc, char **argv) delarray[num_delarray].ino = ino; delarray[num_delarray].mode = inode.i_mode; - delarray[num_delarray].uid = inode.i_uid; + delarray[num_delarray].uid = inode_uid(inode); delarray[num_delarray].size = inode.i_size; if (!LINUX_S_ISDIR(inode.i_mode)) delarray[num_delarray].size |= diff --git a/e2fsck/ChangeLog b/e2fsck/ChangeLog index 1877109..4c14041 100644 --- a/e2fsck/ChangeLog +++ b/e2fsck/ChangeLog @@ -1,3 +1,8 @@ +2007-05-08 Theodore Tso + + * message.c (expand_inode_expression): Use inode_uid() and + inode_gid() macros when printing the uid/gid. + 2007-04-18 Theodore Tso * e2fsck.conf.5.in (apply): Fix minor typo. diff --git a/e2fsck/message.c b/e2fsck/message.c index 23735d3..5cf126c 100644 --- a/e2fsck/message.c +++ b/e2fsck/message.c @@ -304,12 +304,10 @@ static _INLINE_ void expand_inode_expression(char ch, inode->i_dir_acl : 0)); break; case 'u': - printf("%d", (inode->i_uid | - (inode->osd2.linux2.l_i_uid_high << 16))); + printf("%d", inode_uid(*inode)); break; case 'g': - printf("%d", (inode->i_gid | - (inode->osd2.linux2.l_i_gid_high << 16))); + printf("%d", inode_gid(*inode)); break; case 't': if (LINUX_S_ISREG(inode->i_mode)) diff --git a/lib/ext2fs/ChangeLog b/lib/ext2fs/ChangeLog index 1767236..64bc8de 100644 --- a/lib/ext2fs/ChangeLog +++ b/lib/ext2fs/ChangeLog @@ -1,3 +1,9 @@ +2007-05-08 Eric Sandeen + + * ext2_fs.h (inode_uid, inode_gid): The inode_uid() and + inode_gid() macros will automatically add the high bits + when reading uid/gid, on platforms that support it. + 2007-04-19 Theodore Tso * ext2_fs.h, swapfs.c (ext2fs_swap_inode_full): Rename the diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h index 3b3a099..e13eba4 100644 --- a/lib/ext2fs/ext2_fs.h +++ b/lib/ext2fs/ext2_fs.h @@ -423,7 +423,8 @@ struct ext2_inode_large { #define i_uid_high osd2.linux2.l_i_uid_high #define i_gid_high osd2.linux2.l_i_gid_high #define i_reserved2 osd2.linux2.l_i_reserved2 - +#define inode_uid(inode) ((inode).i_uid | (inode).i_uid_high << 16) +#define inode_gid(inode) ((inode).i_gid | (inode).i_gid_high << 16) #else #if defined(__GNU__) @@ -433,6 +434,8 @@ struct ext2_inode_large { #define i_uid_high osd2.hurd2.h_i_uid_high #define i_gid_high osd2.hurd2.h_i_gid_high #define i_author osd2.hurd2.h_i_author +#define inode_uid(inode) ((inode).i_uid | (inode).i_uid_high << 16) +#define inode_gid(inode) ((inode).i_gid | (inode).i_gid_high << 16) #else #if defined(__masix__) @@ -441,6 +444,8 @@ struct ext2_inode_large { #define i_frag osd2.masix2.m_i_frag #define i_fsize osd2.masix2.m_i_fsize #define i_reserved2 osd2.masix2.m_i_reserved2 +#define inode_uid(inode) ((inode).i_uid) +#define inode_gid(inode) ((inode).i_gid) #endif /* __masix__ */ #endif /* __GNU__ */ diff --git a/misc/ChangeLog b/misc/ChangeLog index 656b7df..b26f6f2 100644 --- a/misc/ChangeLog +++ b/misc/ChangeLog @@ -1,3 +1,8 @@ +2007-05-07 Eric Sandeen + + * mke2fs.c (PRS): Make defaults more sane when /etc/mke2fs.conf + doesn't exist. + 2007-04-07 Theodore Tso * util.c (figure_journal_size): Allow the journal size to be up to diff --git a/misc/mke2fs.c b/misc/mke2fs.c index 47748f8..41b09ab 100644 --- a/misc/mke2fs.c +++ b/misc/mke2fs.c @@ -477,8 +477,9 @@ static void setup_lazy_bg(ext2_filsys fs) static void create_root_dir(ext2_filsys fs) { - errcode_t retval; + errcode_t retval; struct ext2_inode inode; + __u32 uid, gid; retval = ext2fs_mkdir(fs, EXT2_ROOT_INO, EXT2_ROOT_INO, 0); if (retval) { @@ -492,9 +493,14 @@ static void create_root_dir(ext2_filsys fs) _("while reading root inode")); exit(1); } - inode.i_uid = getuid(); - if (inode.i_uid) - inode.i_gid = getgid(); + uid = getuid(); + inode.i_uid = uid; + inode.i_uid_high = uid >> 16; + if (uid) { + gid = getgid(); + inode.i_gid = gid; + inode.i_gid_high = gid >> 16; + } retval = ext2fs_write_new_inode(fs, EXT2_ROOT_INO, &inode); if (retval) { com_err("ext2fs_write_inode", retval, -- 1.8.3.1