aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Cline <jcline@redhat.com>2018-08-02 00:03:40 -0400
committerTheodore Ts'o <tytso@mit.edu>2018-08-02 00:03:40 -0400
commit1a5d5e5d51e75a5bca67dadbcea8c841934b7b85 (patch)
tree5e6473b8361d5d4e9bd9caae0c282dc0eeed35fc
parent7d95178c77014dbd8dce36ee40bbbc5e6c121ff5 (diff)
ext4: fix spectre gadget in ext4_mb_regular_allocator()
'ac->ac_g_ex.fe_len' is a user-controlled value which is used in the derivation of 'ac->ac_2order'. 'ac->ac_2order', in turn, is used to index arrays which makes it a potential spectre gadget. Fix this by sanitizing the value assigned to 'ac->ac2_order'. This covers the following accesses found with the help of smatch: * fs/ext4/mballoc.c:1896 ext4_mb_simple_scan_group() warn: potential spectre issue 'grp->bb_counters' [w] (local cap) * fs/ext4/mballoc.c:445 mb_find_buddy() warn: potential spectre issue 'EXT4_SB(e4b->bd_sb)->s_mb_offsets' [r] (local cap) * fs/ext4/mballoc.c:446 mb_find_buddy() warn: potential spectre issue 'EXT4_SB(e4b->bd_sb)->s_mb_maxs' [r] (local cap) Suggested-by: Josh Poimboeuf <jpoimboe@redhat.com> Signed-off-by: Jeremy Cline <jcline@redhat.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Cc: stable@vger.kernel.org
-rw-r--r--fs/ext4/mballoc.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index f7ab34088162..8b24d3d42cb3 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -14,6 +14,7 @@
14#include <linux/log2.h> 14#include <linux/log2.h>
15#include <linux/module.h> 15#include <linux/module.h>
16#include <linux/slab.h> 16#include <linux/slab.h>
17#include <linux/nospec.h>
17#include <linux/backing-dev.h> 18#include <linux/backing-dev.h>
18#include <trace/events/ext4.h> 19#include <trace/events/ext4.h>
19 20
@@ -2140,7 +2141,8 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac)
2140 * This should tell if fe_len is exactly power of 2 2141 * This should tell if fe_len is exactly power of 2
2141 */ 2142 */
2142 if ((ac->ac_g_ex.fe_len & (~(1 << (i - 1)))) == 0) 2143 if ((ac->ac_g_ex.fe_len & (~(1 << (i - 1)))) == 0)
2143 ac->ac_2order = i - 1; 2144 ac->ac_2order = array_index_nospec(i - 1,
2145 sb->s_blocksize_bits + 2);
2144 } 2146 }
2145 2147
2146 /* if stream allocation is enabled, use global goal */ 2148 /* if stream allocation is enabled, use global goal */