Skip to content

Commit 44958ca

Browse files
chaseyugregkh
authored andcommitted
f2fs: check validation of fault attrs in f2fs_build_fault_attr()
[ Upstream commit 4ed886b ] - It missed to check validation of fault attrs in parse_options(), let's fix to add check condition in f2fs_build_fault_attr(). - Use f2fs_build_fault_attr() in __sbi_store() to clean up code. Signed-off-by: Chao Yu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 7e5471b commit 44958ca

File tree

3 files changed

+38
-15
lines changed

3 files changed

+38
-15
lines changed

fs/f2fs/f2fs.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ enum {
6969

7070
struct f2fs_fault_info {
7171
atomic_t inject_ops;
72-
unsigned int inject_rate;
72+
int inject_rate;
7373
unsigned int inject_type;
7474
};
7575

@@ -4593,10 +4593,14 @@ static inline bool f2fs_need_verity(const struct inode *inode, pgoff_t idx)
45934593
}
45944594

45954595
#ifdef CONFIG_F2FS_FAULT_INJECTION
4596-
extern void f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned int rate,
4597-
unsigned int type);
4596+
extern int f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned long rate,
4597+
unsigned long type);
45984598
#else
4599-
#define f2fs_build_fault_attr(sbi, rate, type) do { } while (0)
4599+
static int f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned long rate,
4600+
unsigned long type)
4601+
{
4602+
return 0;
4603+
}
46004604
#endif
46014605

46024606
static inline bool is_journalled_quota(struct f2fs_sb_info *sbi)

fs/f2fs/super.c

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,31 @@ const char *f2fs_fault_name[FAULT_MAX] = {
6464
[FAULT_BLKADDR] = "invalid blkaddr",
6565
};
6666

67-
void f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned int rate,
68-
unsigned int type)
67+
int f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned long rate,
68+
unsigned long type)
6969
{
7070
struct f2fs_fault_info *ffi = &F2FS_OPTION(sbi).fault_info;
7171

7272
if (rate) {
73+
if (rate > INT_MAX)
74+
return -EINVAL;
7375
atomic_set(&ffi->inject_ops, 0);
74-
ffi->inject_rate = rate;
76+
ffi->inject_rate = (int)rate;
7577
}
7678

77-
if (type)
78-
ffi->inject_type = type;
79+
if (type) {
80+
if (type >= BIT(FAULT_MAX))
81+
return -EINVAL;
82+
ffi->inject_type = (unsigned int)type;
83+
}
7984

8085
if (!rate && !type)
8186
memset(ffi, 0, sizeof(struct f2fs_fault_info));
87+
else
88+
f2fs_info(sbi,
89+
"build fault injection attr: rate: %lu, type: 0x%lx",
90+
rate, type);
91+
return 0;
8292
}
8393
#endif
8494

@@ -869,14 +879,17 @@ static int parse_options(struct super_block *sb, char *options, bool is_remount)
869879
case Opt_fault_injection:
870880
if (args->from && match_int(args, &arg))
871881
return -EINVAL;
872-
f2fs_build_fault_attr(sbi, arg, F2FS_ALL_FAULT_TYPE);
882+
if (f2fs_build_fault_attr(sbi, arg,
883+
F2FS_ALL_FAULT_TYPE))
884+
return -EINVAL;
873885
set_opt(sbi, FAULT_INJECTION);
874886
break;
875887

876888
case Opt_fault_type:
877889
if (args->from && match_int(args, &arg))
878890
return -EINVAL;
879-
f2fs_build_fault_attr(sbi, 0, arg);
891+
if (f2fs_build_fault_attr(sbi, 0, arg))
892+
return -EINVAL;
880893
set_opt(sbi, FAULT_INJECTION);
881894
break;
882895
#else

fs/f2fs/sysfs.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -457,10 +457,16 @@ static ssize_t __sbi_store(struct f2fs_attr *a,
457457
if (ret < 0)
458458
return ret;
459459
#ifdef CONFIG_F2FS_FAULT_INJECTION
460-
if (a->struct_type == FAULT_INFO_TYPE && t >= BIT(FAULT_MAX))
461-
return -EINVAL;
462-
if (a->struct_type == FAULT_INFO_RATE && t >= UINT_MAX)
463-
return -EINVAL;
460+
if (a->struct_type == FAULT_INFO_TYPE) {
461+
if (f2fs_build_fault_attr(sbi, 0, t))
462+
return -EINVAL;
463+
return count;
464+
}
465+
if (a->struct_type == FAULT_INFO_RATE) {
466+
if (f2fs_build_fault_attr(sbi, t, 0))
467+
return -EINVAL;
468+
return count;
469+
}
464470
#endif
465471
if (a->struct_type == RESERVED_BLOCKS) {
466472
spin_lock(&sbi->stat_lock);

0 commit comments

Comments
 (0)