minixfs: misplaced checks lead to dentry leak
PATCH 1/1 minixfs: misplaced checks lead to dentry leak
bitmap size sanity checks should be done *before* allocating ->s_root; there their cleanup on failure would be correct. As it is, we do iput() on root inode, but leak the root dentry...
Signed-off-by Al Viro <[email protected]>
I realize that we are *very* late in this cycle, but this is (a) obvious and obviously affecting only minixfs and (b) introduced in this cycle.
fs/minix/inode.c +17 -17
@@ -262,23 +262,6 @@ static int minix_fill_super(struct super_block *s, void *data, int silent) goto out_no_root; } - ret = -ENOMEM ; - s->s_root =d_alloc_root (root_inode); -if (!s->s_root) - goto out_iput; - -if (!(s->s_flags &MS_RDONLY )) { -if (sbi->s_version !=MINIX_V3 )/* s_state is now out from V3 sb */ - ms->s_state &= ~MINIX_VALID_FS ; -mark_buffer_dirty (bh); - } -if (!(sbi->s_mount_state &MINIX_VALID_FS )) -printk ("MINIX-fs: mounting unchecked file system, " -"running fsck is recommended\n" ); -else if (sbi->s_mount_state &MINIX_ERROR_FS ) -printk ("MINIX-fs: mounting file system with errors, " -"running fsck is recommended\n" ); -/* Apparently minix can create filesystems that allocate more blocks for * the bitmaps than needed. We simply ignore that, but verify it didn't * create one with not enough blocks and bail out if so.
@@ -299,6 +282,23 @@ static int minix_fill_super(struct super_block *s, void *data, int silent) goto out_iput; } + ret = -ENOMEM ; + s->s_root =d_alloc_root (root_inode); +if (!s->s_root) + goto out_iput; + +if (!(s->s_flags &MS_RDONLY )) { +if (sbi->s_version !=MINIX_V3 )/* s_state is now out from V3 sb */ + ms->s_state &= ~MINIX_VALID_FS ; +mark_buffer_dirty (bh); + } +if (!(sbi->s_mount_state &MINIX_VALID_FS )) +printk ("MINIX-fs: mounting unchecked file system, " +"running fsck is recommended\n" ); +else if (sbi->s_mount_state &MINIX_ERROR_FS ) +printk ("MINIX-fs: mounting file system with errors, " +"running fsck is recommended\n" ); +return 0 ; out_iput:
Quoted 8 lines · Al Viro
bitmap size sanity checks should be done *before* allocating ->s_root; there their cleanup on failure would be correct. As it is, we do
iput()on root inode, but leak the root dentry...Signed-off-by Al Viro <[email protected]>I realize that we are *very* late in this cycle, but this is (a) obvious and obviously affecting only minixfs and (b) introduced in this cycle.
Ugh. Yes. Good catch.
Acked-by Josh Boyer <[email protected]>
josh
Quoted 53 lines
fs/minix/inode.c +17
-17@@ -262,23 +262,6 @@ static int minix_fill_super(struct super_block *s, void *data, int silent) goto out_no_root; } - ret = -ENOMEM ; - s->s_root =d_alloc_root (root_inode); -if (!s->s_root) - goto out_iput; - -if (!(s->s_flags &MS_RDONLY )) { -if (sbi->s_version !=MINIX_V3 )/* s_state is now out from V3 sb */ - ms->s_state &= ~MINIX_VALID_FS ; -mark_buffer_dirty (bh); - } -if (!(sbi->s_mount_state &MINIX_VALID_FS )) -printk ("MINIX-fs: mounting unchecked file system, " -"running fsck is recommended\n" ); -else if (sbi->s_mount_state &MINIX_ERROR_FS ) -printk ("MINIX-fs: mounting file system with errors, " -"running fsck is recommended\n" ); -/* Apparently minix can create filesystems that allocate more blocks for * the bitmaps than needed. We simply ignore that, but verify it didn't * create one with not enough blocks and bail out if so. @@ -299,6 +282,23 @@ static int minix_fill_super(struct super_block *s, void *data, int silent) goto out_iput; } + ret = -ENOMEM ; + s->s_root =d_alloc_root (root_inode); +if (!s->s_root) + goto out_iput; + +if (!(s->s_flags &MS_RDONLY )) { +if (sbi->s_version !=MINIX_V3 )/* s_state is now out from V3 sb */ + ms->s_state &= ~MINIX_VALID_FS ; +mark_buffer_dirty (bh); + } +if (!(sbi->s_mount_state &MINIX_VALID_FS )) +printk ("MINIX-fs: mounting unchecked file system, " +"running fsck is recommended\n" ); +else if (sbi->s_mount_state &MINIX_ERROR_FS ) +printk ("MINIX-fs: mounting file system with errors, " +"running fsck is recommended\n" ); +return 0 ; out_iput: