aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2014-12-15 14:22:46 +0100
committerAndreas Blaesius <skate4life@gmx.de>2017-03-17 11:02:19 +0100
commitea76dfd7919a21cdc91c0820b18c05af9c5ea30c (patch)
treea0a75934c0e4b846a3ad9e8cef14d166f17d1692
parentcd9fc21484818da2951670ad5befc5aa7f7ee00c (diff)
downloadkernel_samsung_espresso10-ea76dfd7919a21cdc91c0820b18c05af9c5ea30c.tar.gz
kernel_samsung_espresso10-ea76dfd7919a21cdc91c0820b18c05af9c5ea30c.tar.bz2
kernel_samsung_espresso10-ea76dfd7919a21cdc91c0820b18c05af9c5ea30c.zip
isofs: Fix infinite looping over CE entries
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>
-rw-r--r--fs/isofs/rock.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c
index f9cd04db6ea..01d3a1696cd 100644
--- a/fs/isofs/rock.c
+++ b/fs/isofs/rock.c
@@ -30,6 +30,7 @@ struct rock_state {
int cont_size;
int cont_extent;
int cont_offset;
+ int cont_loops;
struct inode *inode;
};
@@ -73,6 +74,9 @@ static void init_rock_state(struct rock_state *rs, struct 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
* and -ve on error.
@@ -105,6 +109,8 @@ static int rock_continue(struct rock_state *rs)
goto out;
}
ret = -EIO;
+ if (++rs->cont_loops >= RR_MAX_CE_ENTRIES)
+ goto out;
bh = sb_bread(rs->inode->i_sb, rs->cont_extent);
if (bh) {
memcpy(rs->buffer, bh->b_data + rs->cont_offset,