Hi Samuel,

Thanks for catching this issue.

On Tue, Jun 9, 2026 at 8:31 AM Samuel Moelius
<[email protected]> wrote:
>
> The pcache target parses optional arguments as name/value pairs.  A
> table that advertises one optional argument and supplies only a
> recognized option name, for example "cache_mode", reaches
> parse_cache_opts() with argc == 1.  The parser consumes the name,
> decrements argc to zero, then calls dm_shift_arg() again for the value.
> dm_shift_arg() returns NULL when no arguments remain, and the following
> strcmp() dereferences that NULL pointer.
>
> Reject odd optional argument counts before parsing the name/value pairs.
> This keeps valid "cache_mode writeback" and "data_crc true/false" tables
> unchanged while making malformed tables fail during target construction.
>
> Assisted-by: Codex:gpt-5.5-cyber-preview
> Signed-off-by: Samuel Moelius <[email protected]>
> ---
>  drivers/md/dm-pcache/dm_pcache.c | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/drivers/md/dm-pcache/dm_pcache.c 
> b/drivers/md/dm-pcache/dm_pcache.c
> index 81c795c0400e..ba5471885b16 100644
> --- a/drivers/md/dm-pcache/dm_pcache.c
> +++ b/drivers/md/dm-pcache/dm_pcache.c
> @@ -163,6 +163,11 @@ static int parse_cache_opts(struct dm_pcache *pcache, 
> struct dm_arg_set *as,
>         if (ret)
>                 return -EINVAL;
>
> +       if (argc & 1) {
> +               *error = "Invalid number of cache option arguments";
> +               return -EINVAL;
> +       }
> +
The vulnerability regarding missing values for cache options is indeed
real and poses
a kernel panic risk due to potential NULL pointer dereference or
underflowing the loop counter.
However, resolving this using a rigid parity check (argc & 1) might
not be the most robust approach.
Instead of an aggressive top-level parity filter, it would be much
cleaner and more idiomatic to enforce
strict bounds validation and exact argument pairing inside the evaluation loop.
>         while (argc) {
>                 arg = dm_shift_arg(as);
>                 argc--;
+                       if (!argc) {
+                               *error = "Missing value for cache_mode";
+                               return -EINVAL;
+                       }
This way, we properly keep the argument parsing framework flexible for
future non-paired extensions.
What do you think?

Best regards,
Gu
> --
> 2.43.0
>

Reply via email to