All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] fs/nilfs2: Fix potential underflow in call to crc32_le
@ 2016-06-17  8:06 Torsten Hilbrich
       [not found] ` <5763AF95.7050302-opNxpl+3fjRBDgjK7y7TUQ@public.gmane.org>
  0 siblings, 1 reply; 8+ messages in thread
From: Torsten Hilbrich @ 2016-06-17  8:06 UTC (permalink / raw)
  To: Ryusuke Konishi; +Cc: linux-nilfs-u79uwXL29TY76Z2rM5mHXA

The value bytes comes from the filesystem which is about to be
mounted. We cannot trust that the value is always in the range
we expect it to be.

Check its value before using it to calculate the length for the
crc32_le call. It value must be larger (or equal) sumoff + 4 and
smaller than the remaining space in the block where the superblock
is stored (BLOCK_SIZE - sumoff - 4).

This fixes a problem where the accidential mounting of an encrypted
volume caused a kernel panic. It had the correct magic value 0x3434
at offset 0x406 by chance and the following 2 bytes were 0x01, 0x00
(interpreted as s_bytes value with value 1).

Signed-off-by: Torsten Hilbrich <torsten.hilbrich-opNxpl+3fjRBDgjK7y7TUQ@public.gmane.org>
Tested-by: Torsten Hilbrich <torsten.hilbrich-opNxpl+3fjRBDgjK7y7TUQ@public.gmane.org>
---
 fs/nilfs2/the_nilfs.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c
index 69bd801..21f6b23 100644
--- a/fs/nilfs2/the_nilfs.c
+++ b/fs/nilfs2/the_nilfs.c
@@ -438,18 +438,19 @@ static int nilfs_valid_sb(struct nilfs_super_block *sbp)
 	static unsigned char sum[4];
 	const int sumoff = offsetof(struct nilfs_super_block, s_sum);
 	size_t bytes;
+	size_t crc_offset = sumoff + 4;
 	u32 crc;
 
 	if (!sbp || le16_to_cpu(sbp->s_magic) != NILFS_SUPER_MAGIC)
 		return 0;
 	bytes = le16_to_cpu(sbp->s_bytes);
-	if (bytes > BLOCK_SIZE)
+	if (bytes < crc_offset || bytes > BLOCK_SIZE - crc_offset)
 		return 0;
 	crc = crc32_le(le32_to_cpu(sbp->s_crc_seed), (unsigned char *)sbp,
 		       sumoff);
 	crc = crc32_le(crc, sum, 4);
-	crc = crc32_le(crc, (unsigned char *)sbp + sumoff + 4,
-		       bytes - sumoff - 4);
+	crc = crc32_le(crc, (unsigned char *)sbp + crc_offset,
+		       bytes - crc_offset);
 	return crc == le32_to_cpu(sbp->s_sum);
 }
 
-- 
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2016-06-20 12:41 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-17  8:06 [PATCH] fs/nilfs2: Fix potential underflow in call to crc32_le Torsten Hilbrich
     [not found] ` <5763AF95.7050302-opNxpl+3fjRBDgjK7y7TUQ@public.gmane.org>
2016-06-17 16:51   ` Viacheslav Dubeyko
2016-06-17 18:25   ` Ryusuke Konishi
     [not found]     ` <20160618.032507.1597365191396955107.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2016-06-20  4:41       ` Torsten Hilbrich
     [not found]         ` <57677408.1-opNxpl+3fjRBDgjK7y7TUQ@public.gmane.org>
2016-06-20  4:58           ` [PATCHv2] " Torsten Hilbrich
2016-06-20  6:53           ` [PATCH] " Ryusuke Konishi
     [not found]             ` <CAKFNMo=6A9Ns3EDe8PFL+LMX769WdGT39yo-p+Oi7gzPLG3-9w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-06-20  7:01               ` [PATCHv3] " Torsten Hilbrich
     [not found]                 ` <576794B2.3090000-opNxpl+3fjRBDgjK7y7TUQ@public.gmane.org>
2016-06-20 12:41                   ` Ryusuke Konishi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.