diff options
author | Eric Sesterhenn <snakebyte@gmx.de> | 2008-10-18 23:28:02 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-20 11:52:38 -0400 |
commit | 248736c2a57206388c86f8cdd3392ee986e84f9f (patch) | |
tree | 1097d53f082e6773d7ecaac2eea5f7825c62cb01 /fs/hfsplus | |
parent | 6e7152944426be786c6c232990914e4565290d35 (diff) |
hfsplus: fix possible deadlock when handling corrupted extents
A corrupted extent for the extent file itself may try to get an impossible
extent, causing a deadlock if I see it correctly.
Check the inode number after the first_blocks checks and fail if it's the
extent file, as according to the spec the extent file should have no
extent for itself.
Signed-off-by: Eric Sesterhenn <snakebyte@gmx.de>
Cc: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/hfsplus')
-rw-r--r-- | fs/hfsplus/extents.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/hfsplus/extents.c b/fs/hfsplus/extents.c index fec8f61227ff..0022eec63cda 100644 --- a/fs/hfsplus/extents.c +++ b/fs/hfsplus/extents.c | |||
@@ -199,6 +199,9 @@ int hfsplus_get_block(struct inode *inode, sector_t iblock, | |||
199 | goto done; | 199 | goto done; |
200 | } | 200 | } |
201 | 201 | ||
202 | if (inode->i_ino == HFSPLUS_EXT_CNID) | ||
203 | return -EIO; | ||
204 | |||
202 | mutex_lock(&HFSPLUS_I(inode).extents_lock); | 205 | mutex_lock(&HFSPLUS_I(inode).extents_lock); |
203 | res = hfsplus_ext_read_extent(inode, ablock); | 206 | res = hfsplus_ext_read_extent(inode, ablock); |
204 | if (!res) { | 207 | if (!res) { |