lkml.org 
[lkml]   [2007]   [Jun]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] HFSPlus: simplify inode mode settting logic
    From:	Wyatt Banks <wyatt@banksresearch.com>

    HFSPlus: Fix broken inode mode setting logic. Fix broken umask mount option.

    Signed-off-by: Wyatt Banks <wyatt@banksresearch.com>
    ---
    Patched against 2.6.21.5

    hfsplus_cat_read_inode() decides if the selected inode is a directory or not.
    It then sets the 3rd parameter of hfsplus_get_perms() accordingly. Inside
    hfsplus_get_perms() it again decides based on its 3rd parameter if the inode
    is a directory or not. Besides this redundancy, mode is the BSD file type and mode
    bits (see Apple TechNote 1150 for details) and is never 0. This makes a large
    portion of the branching logic unused. What actually does happen in the branching
    is that the UGO mode bits are combined with the directory or regular file bit after
    the 2nd decision and this resultant mode is assigned to the inode. This also loses
    suid, sgid, sticky, pipe, fifo, etc.

    This patch also fixes the umask mount option as a result. I figured instead of
    filing a bug report, I'd just go ahead and fix it. :-)

    diff -uprN -X linux-2.6.21.5/Documentation/dontdiff linux-2.6.21.5/fs/hfsplus/inode.c linux-2.6.21.5-devel/fs/hfsplus/inode.c
    --- linux-2.6.21.5/fs/hfsplus/inode.c 2007-06-11 14:37:06.000000000 -0400
    +++ linux-2.6.21.5-devel/fs/hfsplus/inode.c 2007-06-23 18:23:57.000000000 -0400
    @@ -173,7 +173,7 @@ out:
    return NULL;
    }

    -static void hfsplus_get_perms(struct inode *inode, struct hfsplus_perm *perms, int dir)
    +static void hfsplus_get_perms(struct inode *inode, struct hfsplus_perm *perms)
    {
    struct super_block *sb = inode->i_sb;
    u16 mode;
    @@ -188,14 +188,7 @@ static void hfsplus_get_perms(struct ino
    if (!inode->i_gid && !mode)
    inode->i_gid = HFSPLUS_SB(sb).gid;

    - if (dir) {
    - mode = mode ? (mode & S_IALLUGO) :
    - (S_IRWXUGO & ~(HFSPLUS_SB(sb).umask));
    - mode |= S_IFDIR;
    - } else if (!mode)
    - mode = S_IFREG | ((S_IRUGO|S_IWUGO) &
    - ~(HFSPLUS_SB(sb).umask));
    - inode->i_mode = mode;
    + inode->i_mode = mode & ~(HFSPLUS_SB(sb).umask);

    HFSPLUS_I(inode).rootflags = perms->rootflags;
    HFSPLUS_I(inode).userflags = perms->userflags;
    @@ -415,7 +408,7 @@ int hfsplus_cat_read_inode(struct inode
    /* panic? */;
    hfs_bnode_read(fd->bnode, &entry, fd->entryoffset,
    sizeof(struct hfsplus_cat_folder));
    - hfsplus_get_perms(inode, &folder->permissions, 1);
    + hfsplus_get_perms(inode, &folder->permissions);
    inode->i_nlink = 1;
    inode->i_size = 2 + be32_to_cpu(folder->valence);
    inode->i_atime = hfsp_mt2ut(folder->access_date);
    @@ -435,7 +428,7 @@ int hfsplus_cat_read_inode(struct inode

    hfsplus_inode_read_fork(inode, HFSPLUS_IS_DATA(inode) ?
    &file->data_fork : &file->rsrc_fork);
    - hfsplus_get_perms(inode, &file->permissions, 0);
    + hfsplus_get_perms(inode, &file->permissions);
    inode->i_nlink = 1;
    if (S_ISREG(inode->i_mode)) {
    if (file->permissions.dev)
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-06-24 01:33    [W:3.284 / U:0.752 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site