From: Jianyun Gao <[email protected]>

When setting gc_percent via message, kstrtoul parses the input into an
unsigned long, which is then implicitly truncated to u8 when passed to
pcache_cache_set_gc_percent(). For example, value 266 (0x10A) silently
truncates to 10 (0x0A), successfully bypassing the > 90 upper bound
check in pcache_cache_set_gc_percent(), and setting a different value
than the user intended.

Use kstrtou8 directly instead of kstrtoul, so that overflow values are
properly rejected.

Signed-off-by: Jianyun Gao <[email protected]>
---
 drivers/md/dm-pcache/dm_pcache.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/md/dm-pcache/dm_pcache.c b/drivers/md/dm-pcache/dm_pcache.c
index d5cfd162c063..645fc27d82ba 100644
--- a/drivers/md/dm-pcache/dm_pcache.c
+++ b/drivers/md/dm-pcache/dm_pcache.c
@@ -439,13 +439,13 @@ static int dm_pcache_message(struct dm_target *ti, 
unsigned int argc,
                             char **argv, char *result, unsigned int maxlen)
 {
        struct dm_pcache *pcache = ti->private;
-       unsigned long val;
+       u8 val;
 
        if (argc != 2)
                goto err;
 
        if (!strcasecmp(argv[0], "gc_percent")) {
-               if (kstrtoul(argv[1], 10, &val))
+               if (kstrtou8(argv[1], 10, &val))
                        goto err;
 
                return pcache_cache_set_gc_percent(&pcache->cache, val);
-- 
2.34.1


Reply via email to