Re: [PATCH v4 3/4] zram: validate parameters in each backend's setup_params

Sergey Senozhatsky <[email protected]> Thu, 30 Jul 2026 16:24:17 +0900
Newsgroups org.kernel.vger.linux-block,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On (26/07/30 14:01), Haoqin Huang wrote:
[..]
>  static int deflate_setup_params(struct zcomp_params *params)
>  {
> +	if (params->dict_sz) {
> +		pr_err("deflate: dictionary is not supported\n");
> +		return -EOPNOTSUPP;
> +	}
>  	if (params->level == ZCOMP_PARAM_NOT_SET)
>  		params->level = Z_DEFAULT_COMPRESSION;
> +	else if (params->level < Z_DEFAULT_COMPRESSION ||
> +		 params->level > Z_BEST_COMPRESSION) {
> +		pr_err("deflate: invalid compression level %d\n", params->level);
> +		return -EINVAL;
> +	}
>  	if (params->deflate.winbits == ZCOMP_PARAM_NOT_SET)
>  		params->deflate.winbits = DEFLATE_DEF_WINBITS;

This will conflict with winbits validation change that we landed
yesterday.  Can I trouble you with a rebase request (either on top
of linux-next, when winbits patch hits it, or on top of Andrew's mm
tree)?

[..]
> diff --git a/drivers/block/zram/backend_lz4hc.c b/drivers/block/zram/backend_lz4hc.c
> index f6a336acfe20..5d551d165213 100644
> --- a/drivers/block/zram/backend_lz4hc.c
> +++ b/drivers/block/zram/backend_lz4hc.c
> @@ -20,6 +20,11 @@ static int lz4hc_setup_params(struct zcomp_params *params)
>  {
>  	if (params->level == ZCOMP_PARAM_NOT_SET)
>  		params->level = LZ4HC_DEFAULT_CLEVEL;
> +	else if (params->level < LZ4HC_MIN_CLEVEL ||
> +		 params->level > LZ4HC_MAX_CLEVEL) {
> +		pr_err("lz4hc: invalid compression level %d\n", params->level);
> +		return -EINVAL;
> +	}

So...  lib/lz4/lz4hc_compress.c supports levels 1 and 2.  However,
LZ4HC_MIN_CLEVEL is set to 3, but clearly the compression library
supports levels lower than LZ4HC_MIN_CLEVEL.  In fact, LZ4HC_MIN_CLEVEL
is never used in the lz4 code.  Maybe here we need to just hardcode
"< 1" and put a comment:

      } else if (params->level < 1 || params->level > LZ4HC_MAX_CLEVEL) {
              /*
               * Not LZ4HC_MIN_CLEVEL: that constant is advisory, and
               * LZ4HC_compress_generic() only clamps levels below 1.
               * Levels 1-2 are valid.
               */
              pr_err("lz4hc: invalid compression level %d\n", params->level);
              return -EINVAL;
      }

[..]
> diff --git a/drivers/block/zram/backend_zstd.c b/drivers/block/zram/backend_zstd.c
> index 2584f47c9b3c..4d19d6089f13 100644
> --- a/drivers/block/zram/backend_zstd.c
> +++ b/drivers/block/zram/backend_zstd.c
> @@ -60,6 +60,11 @@ static int zstd_setup_params(struct zcomp_params *params)
>  	params->drv_data = zp;
>  	if (params->level == ZCOMP_PARAM_NOT_SET)
>  		params->level = zstd_default_clevel();
> +	else if (params->level < zstd_min_clevel() ||
> +		 params->level > zstd_max_clevel()) {
> +		pr_err("zstd: invalid compression level %d\n", params->level);
> +		goto error;

Should we also remove "zstd_release_params(params);" from here?
Same reason as with zstd_create().