Thank you for your contribution! Sashiko AI review found 1 potential issue(s) 
to consider:
- [Medium] Off-by-one error in runtime classmap offset validation restricts the 
maximum valid class ID.
--

commit 9fc4489f7afee86c427de8b09e6f38f827d4fc24
Author: Jim Cromie <[email protected]>

dyndbg: harden classmap and descriptor validation

This commit improves classmap and descriptor validation by mirroring
compile-time limits of _DEFINE and adding run-time overlap checks for _USEd
classmaps. It scans module descriptors at load time to warn about missing
class_ids instead of waiting for a user query.

> diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
> index a5d813ad323a1..b7ccf471b5efe 100644
> --- a/lib/dynamic_debug.c
> +++ b/lib/dynamic_debug.c
[ ... ]
> @@ -1524,10 +1543,47 @@ static int ddebug_add_module(struct _ddebug_info *di)
>       dd_set_module_subrange(i, cm, &dt->info, maps);
>       dd_set_module_subrange(i, cli, &dt->info, users);
>  
> -     /* insure 2+ classmaps share the per-module 0..62 class_id space */
> +     /* validate the per-module shared 0..62 class_id space */
>       for_subvec(i, cm, &dt->info, maps)
>               if (ddebug_class_range_overlap(cm, &reserved_ids))
> -                     goto cleanup;
> +                     err = -EINVAL;
> +
> +     for_subvec(i, cli, &dt->info, users) {
> +             cm = cli->map;
> +             if (!cm) {
> +                     pr_err("module %s: classmap not found for user\n", 
> di->mod_name);
> +                     err = -EINVAL;
> +                     continue;
> +             }
> +
> +             if (cm->base + cm->length + cli->offset >= _DPRINTK_CLASS_DFLT) 
> {

[Severity: Medium]
Does this condition have an off-by-one error that restricts the maximum valid
class ID?

The _DPRINTK_CLASS_DFLT macro is defined as 63, which means valid class IDs
range from 0 to 62. The maximum assigned class ID for a given map and offset is
base + length + offset - 1. If base + length + offset == 63, the maximum
assigned class ID is exactly 62, which should be valid.

Because the code checks if the sum is >= _DPRINTK_CLASS_DFLT, a valid
boundary case of 63 is erroneously flagged as an error. This shrinks the valid
class ID space to 0..61 instead of the expected 0..62.

> +                     pr_err("module %s: base:%d + classes.len:%d + 
> cli.offset:%d must be < %d\n",
> +                            di->mod_name, cm->base, cm->length,
> +                            cli->offset, _DPRINTK_CLASS_DFLT);
> +                     err = -EINVAL;
> +                     continue;
> +             }
> +
> +             if (ddebug_class_user_overlap(cli, &reserved_ids))
> +                     err = -EINVAL;
> +     }

-- 
Sashiko AI review ยท 
https://sashiko.dev/#/patchset/[email protected]?part=37

Reply via email to