diff mbox series

scripts: kconfig: Fix potential NULL pointer dereference in

Message ID 20250212154537.235297-1-ant.v.moryakov@gmail.com (mailing list archive)
State New
Headers show
Series scripts: kconfig: Fix potential NULL pointer dereference in | expand

Commit Message

Anton Moryakov Feb. 12, 2025, 3:45 p.m. UTC
The function `prop_get_symbol` may return NULL, which was not checked
before dereferencing the pointer in `menu_finalize`. This could lead
to undefined behavior or crashes.

This commit adds a NULL check before accessing `es->rev_dep.expr` and
`es->implied.expr`. If `es` is NULL, a warning is logged, and the
operation is skipped.

Triggers found by static analyzer Svace.

Signed-off-by: Anton Moryakov <ant.v.moryakov@gmail.com>

---
 scripts/kconfig/menu.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

Comments

Masahiro Yamada Feb. 13, 2025, 4:08 a.m. UTC | #1
On Thu, Feb 13, 2025 at 12:45 AM Anton Moryakov
<ant.v.moryakov@gmail.com> wrote:
>
> The function `prop_get_symbol` may return NULL, which was not checked
> before dereferencing the pointer in `menu_finalize`. This could lead
> to undefined behavior or crashes.


Please attach a simple test case that leads to a crash.



>
> This commit adds a NULL check before accessing `es->rev_dep.expr` and
> `es->implied.expr`. If `es` is NULL, a warning is logged, and the
> operation is skipped.
>
> Triggers found by static analyzer Svace.

In my understanding, P_SELECT always has  a non-NULL ->expr
if you look at the code in scripts/kconfig/parser.y

  menu_add_symbol(P_SELECT, $2, $3);


$2 is the selected symbol, and passed to expr_alloc_symbol()








> Signed-off-by: Anton Moryakov <ant.v.moryakov@gmail.com>
>
> ---
>  scripts/kconfig/menu.c | 14 ++++++++++----
>  1 file changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c
> index 0fe7f3255a..3fb3ab4637 100644
> --- a/scripts/kconfig/menu.c
> +++ b/scripts/kconfig/menu.c
> @@ -400,12 +400,18 @@ void menu_finalize(struct menu *parent)
>                                  */
>                                 if (prop->type == P_SELECT) {
>                                         struct symbol *es = prop_get_symbol(prop);
> -                                       es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
> -                                                       expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
> +                                       if (es) {
> +                                               es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
> +                                                               expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
> +                                       } else
> +                                               menu_warn(menu, "select property has no symbol");
>                                 } else if (prop->type == P_IMPLY) {
>                                         struct symbol *es = prop_get_symbol(prop);
> -                                       es->implied.expr = expr_alloc_or(es->implied.expr,
> -                                                       expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
> +                                       if (es) {
> +                                               es->implied.expr = expr_alloc_or(es->implied.expr,
> +                                                               expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
> +                                       } else
> +                                               menu_warn(menu, "imply property has no symbol");
>                                 }
>                         }
>                 }
> --
> 2.30.2
>
>
diff mbox series

Patch

diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c
index 0fe7f3255a..3fb3ab4637 100644
--- a/scripts/kconfig/menu.c
+++ b/scripts/kconfig/menu.c
@@ -400,12 +400,18 @@  void menu_finalize(struct menu *parent)
 				 */
 				if (prop->type == P_SELECT) {
 					struct symbol *es = prop_get_symbol(prop);
-					es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
-							expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
+					if (es) {
+						es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
+								expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
+					} else
+						menu_warn(menu, "select property has no symbol");
 				} else if (prop->type == P_IMPLY) {
 					struct symbol *es = prop_get_symbol(prop);
-					es->implied.expr = expr_alloc_or(es->implied.expr,
-							expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
+					if (es) {
+						es->implied.expr = expr_alloc_or(es->implied.expr,
+								expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
+					} else
+						menu_warn(menu, "imply property has no symbol");
 				}
 			}
 		}