]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
zram: do not autocorrect bad recompression parameters
authorSergey Senozhatsky <senozhatsky@chromium.org>
Wed, 11 Mar 2026 08:42:45 +0000 (17:42 +0900)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 5 Apr 2026 20:53:24 +0000 (13:53 -0700)
Do not silently autocorrect bad recompression priority parameter value and
just error out.

Link: https://lkml.kernel.org/r/20260311084312.1766036-3-senozhatsky@chromium.org
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Suggested-by: Minchan Kim <minchan@kernel.org>
Cc: Brian Geffon <bgeffon@google.com>
Cc: gao xu <gaoxu2@honor.com>
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/block/zram/zram_drv.c

index bc5777b245d4fcc05e48c4455fa9093086d62bee..71c4e2d350ced1ffd56492841a8d7c90dfdeae41 100644 (file)
@@ -2517,19 +2517,16 @@ static ssize_t recompress_store(struct device *dev,
                                struct device_attribute *attr,
                                const char *buf, size_t len)
 {
+       u32 prio = ZRAM_SECONDARY_COMP, prio_max = ZRAM_MAX_COMPS;
        struct zram *zram = dev_to_zram(dev);
        char *args, *param, *val, *algo = NULL;
        u64 num_recomp_pages = ULLONG_MAX;
        struct zram_pp_ctl *ctl = NULL;
        struct zram_pp_slot *pps;
        u32 mode = 0, threshold = 0;
-       u32 prio, prio_max;
        struct page *page = NULL;
        ssize_t ret;
 
-       prio = ZRAM_SECONDARY_COMP;
-       prio_max = zram->num_active_comps;
-
        args = skip_spaces(buf);
        while (*args) {
                args = next_arg(args, &param, &val);
@@ -2579,10 +2576,7 @@ static ssize_t recompress_store(struct device *dev,
                        if (ret)
                                return ret;
 
-                       if (prio == ZRAM_PRIMARY_COMP)
-                               prio = ZRAM_SECONDARY_COMP;
-
-                       prio_max = prio + 1;
+                       prio_max = min(prio + 1, ZRAM_MAX_COMPS);
                        continue;
                }
        }
@@ -2602,7 +2596,7 @@ static ssize_t recompress_store(struct device *dev,
                                continue;
 
                        if (!strcmp(zram->comp_algs[prio], algo)) {
-                               prio_max = prio + 1;
+                               prio_max = min(prio + 1, ZRAM_MAX_COMPS);
                                found = true;
                                break;
                        }
@@ -2620,6 +2614,11 @@ static ssize_t recompress_store(struct device *dev,
                goto out;
        }
 
+       if (prio < ZRAM_SECONDARY_COMP || prio >= ZRAM_MAX_COMPS) {
+               ret = -EINVAL;
+               goto out;
+       }
+
        page = alloc_page(GFP_KERNEL);
        if (!page) {
                ret = -ENOMEM;