lkml.org 
[lkml]   [2013]   [Jul]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 63/98] hpfs: better test for errors
    Date
    3.5.7.17 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz>

    commit 3ebacb05044f82c5f0bb456a894eb9dc57d0ed90 upstream.

    The test if bitmap access is out of bound could errorneously pass if the
    device size is divisible by 16384 sectors and we are asking for one bitmap
    after the end.

    Check for invalid size in the superblock. Invalid size could cause integer
    overflows in the rest of the code.

    Signed-off-by: Mikulas Patocka <mpatocka@artax.karlin.mff.cuni.cz>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
    ---
    fs/hpfs/map.c | 3 ++-
    fs/hpfs/super.c | 8 +++++++-
    2 files changed, 9 insertions(+), 2 deletions(-)

    diff --git a/fs/hpfs/map.c b/fs/hpfs/map.c
    index 4acb19d..803d3da 100644
    --- a/fs/hpfs/map.c
    +++ b/fs/hpfs/map.c
    @@ -17,7 +17,8 @@ __le32 *hpfs_map_bitmap(struct super_block *s, unsigned bmp_block,
    struct quad_buffer_head *qbh, char *id)
    {
    secno sec;
    - if (hpfs_sb(s)->sb_chk) if (bmp_block * 16384 > hpfs_sb(s)->sb_fs_size) {
    + unsigned n_bands = (hpfs_sb(s)->sb_fs_size + 0x3fff) >> 14;
    + if (hpfs_sb(s)->sb_chk) if (bmp_block >= n_bands) {
    hpfs_error(s, "hpfs_map_bitmap called with bad parameter: %08x at %s", bmp_block, id);
    return NULL;
    }
    diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c
    index 706a12c..8d250192 100644
    --- a/fs/hpfs/super.c
    +++ b/fs/hpfs/super.c
    @@ -552,7 +552,13 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent)
    sbi->sb_cp_table = NULL;
    sbi->sb_c_bitmap = -1;
    sbi->sb_max_fwd_alloc = 0xffffff;
    -
    +
    + if (sbi->sb_fs_size >= 0x80000000) {
    + hpfs_error(s, "invalid size in superblock: %08x",
    + (unsigned)sbi->sb_fs_size);
    + goto bail4;
    + }
    +
    /* Load bitmap directory */
    if (!(sbi->sb_bmp_dir = hpfs_load_bitmap_directory(s, le32_to_cpu(superblock->bitmaps))))
    goto bail4;
    --
    1.8.1.2


    \
     
     \ /
      Last update: 2013-07-11 17:21    [W:2.256 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site