gpio: sim: fix memory corruption when adding named lines and unnamed hogs
PATCH v2 1/1 gpio: sim: fix memory corruption when adding named lines and unnamed hogs
When constructing the sim, gpio-sim constructs an array of named lines, sized based on the largest offset of any named line, and then initializes that array with the names of all lines, including unnamed hogs with higher offsets. In doing so it writes NULLs beyond the extent of the array.
Add a check that only named lines are used to initialize the array.
---
changes v1 -> v2:
- check offset as well to make the purpose of the check clearer
drivers/gpio/gpio-sim.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/gpio/gpio-sim.c +4 -2
@@ -721,8 +721,10 @@ static char **gpio_sim_make_line_names(struct gpio_sim_bank *bank,if (!line_names)return ERR_PTR (-ENOMEM ); -list_for_each_entry (line, &bank->line_list, siblings) - line_names[line->offset] = line->name; +list_for_each_entry (line, &bank->line_list, siblings) { +if (line->name && (line->offset <= max_offset)) + line_names[line->offset] = line->name; + }return line_names; }
Signature · 1 line
2.40.1
Quoted 36 lines · Kent Gibson
When constructing the sim, gpio-sim constructs an array of named lines, sized based on the largest offset of any named line, and then initializes that array with the names of all lines, including unnamed hogs with higher offsets. In doing so it writes NULLs beyond the extent of the array.
Add a check that only named lines are used to initialize the array.
Fixes cb8c474e79be ("gpio: sim: new testing module")Signed-off-by Kent Gibson<[email protected]>---
changes v1 -> v2:
- check offset as well to make the purpose of the check clearerdrivers/gpio/gpio-sim.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)drivers/gpio/gpio-sim.c +4
-3@@ -721,8 +721,10 @@ static char **gpio_sim_make_line_names(struct gpio_sim_bank *bank,if (!line_names)return ERR_PTR (-ENOMEM ); -list_for_each_entry (line, &bank->line_list, siblings) - line_names[line->offset] = line->name; +list_for_each_entry (line, &bank->line_list, siblings) { +if (line->name && (line->offset <= max_offset)) + line_names[line->offset] = line->name; + }return line_names; } --
Quoted 2 lines
2.40.1
Thanks for figuring that out, queued for fixes.
Bart