diff mbox series

fix crash when inlining casts of erroneous expressions

Message ID 20220607124333.23988-1-lucvoo@kernel.org (mailing list archive)
State Mainlined, archived
Headers show
Series fix crash when inlining casts of erroneous expressions | expand

Commit Message

Luc Van Oostenryck June 7, 2022, 12:43 p.m. UTC
From: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>

Sparse do inlining very early, during expansion, just after (type)
evaluation and before IR linearization, and is done even if some
errors have been found. This means that the inlining must be robust
against erroneous code.

However, during inlining, a cast expression is always dereferenced and
a crash will occur if not valid (in which case it should be null).

Fix this by checking for null cast expressions and directly returning
NULL, like done for the inlining of the other invalid expressions.

Link: https://lore.kernel.org/r/e42698a9-494c-619f-ac16-8ffe2c87e04e@intel.com
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Yafang Shao <laoar.shao@gmail.com>
Reported-by: Yujie Liu <yujie.liu@intel.com>
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
 inline.c                                |  2 ++
 validation/inline-early/bug-bad-token.c | 15 +++++++++++++++
 2 files changed, 17 insertions(+)
 create mode 100644 validation/inline-early/bug-bad-token.c
diff mbox series

Patch

diff --git a/inline.c b/inline.c
index eceef8ba0443..0097e4bf620a 100644
--- a/inline.c
+++ b/inline.c
@@ -155,6 +155,8 @@  static struct expression * copy_expression(struct expression *expr)
 
 	/* Cast/sizeof/__alignof__ */
 	case EXPR_CAST:
+		if (!expr->cast_expression)
+			return NULL;
 		if (expr->cast_expression->type == EXPR_INITIALIZER) {
 			struct expression *cast = expr->cast_expression;
 			struct symbol *sym = expr->cast_type;
diff --git a/validation/inline-early/bug-bad-token.c b/validation/inline-early/bug-bad-token.c
new file mode 100644
index 000000000000..9049bdb48ab0
--- /dev/null
+++ b/validation/inline-early/bug-bad-token.c
@@ -0,0 +1,15 @@ 
+inline void fun(int x)
+{
+	(typeof(@)) x;
+}
+
+void foo(void)
+{
+	fun;
+}
+
+/*
+ * check-name: bug-bad-token
+ * check-exit-value: 0
+ * check-error-ignore
+ */