Skip to content

Commit

Permalink
isofs: Fix infinite looping over CE entries
Browse files Browse the repository at this point in the history
Rock Ridge extensions define so called Continuation Entries (CE) which
define where is further space with Rock Ridge data. Corrupted isofs
image can contain arbitrarily long chain of these, including a one
containing loop and thus causing kernel to end in an infinite loop when
traversing these entries.

Limit the traversal to 32 entries which should be more than enough space
to store all the Rock Ridge data.

Change-Id: I2c81b49e68144483186ea5fc35d052529ac001cb
Reported-by: P J P <ppandit@redhat.com>
CC: stable@vger.kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
  • Loading branch information
jankara authored and andi34 committed Jul 9, 2017
1 parent 3cd7803 commit b1bdb52
Showing 1 changed file with 6 additions and 0 deletions.
6 changes: 6 additions & 0 deletions fs/isofs/rock.c
Expand Up @@ -30,6 +30,7 @@ struct rock_state {
int cont_size; int cont_size;
int cont_extent; int cont_extent;
int cont_offset; int cont_offset;
int cont_loops;
struct inode *inode; struct inode *inode;
}; };


Expand Down Expand Up @@ -73,6 +74,9 @@ static void init_rock_state(struct rock_state *rs, struct inode *inode)
rs->inode = inode; rs->inode = inode;
} }


/* Maximum number of Rock Ridge continuation entries */
#define RR_MAX_CE_ENTRIES 32

/* /*
* Returns 0 if the caller should continue scanning, 1 if the scan must end * Returns 0 if the caller should continue scanning, 1 if the scan must end
* and -ve on error. * and -ve on error.
Expand Down Expand Up @@ -105,6 +109,8 @@ static int rock_continue(struct rock_state *rs)
goto out; goto out;
} }
ret = -EIO; ret = -EIO;
if (++rs->cont_loops >= RR_MAX_CE_ENTRIES)
goto out;
bh = sb_bread(rs->inode->i_sb, rs->cont_extent); bh = sb_bread(rs->inode->i_sb, rs->cont_extent);
if (bh) { if (bh) {
memcpy(rs->buffer, bh->b_data + rs->cont_offset, memcpy(rs->buffer, bh->b_data + rs->cont_offset,
Expand Down

0 comments on commit b1bdb52

Please sign in to comment.