From 09c81c8a7fd885c44fa9fff18cb3af2c04678843 Mon Sep 17 00:00:00 2001 From: Abderrahim Indjaren Date: Fri, 18 Sep 2026 02:50:18 +0100 Subject: [PATCH] fix: prevent struct crashing from tuple expansion overflow --- src/check_expr.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index d0acc0744..d35231b91 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -10959,6 +10959,8 @@ gb_internal ExprKind check_compound_literal(CheckerContext *c, Operand *o, Ast * Operand src_o = o; src_o.type = src_field->type; + if (index + jj >= field_count) + continue ; field = t->Struct.fields[index + (jj++)]; check_assignment(c, &src_o, field->type, str_lit("structure literal")); @@ -10981,15 +10983,18 @@ gb_internal ExprKind check_compound_literal(CheckerContext *c, Operand *o, Ast * handled_elem_count += 1; } - + if (handled_elem_count > field_count) { + error(o.expr, "Expansion overflows structure literal, expected %td, got %td", field_count, handled_elem_count); + break ; + } } if (cl->elems.count < field_count) { if (min_field_count < field_count) { if (cl->elems.count < min_field_count) { - error(cl->close, "Too few values in structure literal, expected at least %td, got %td", min_field_count, cl->elems.count); + error(cl->close, "Too few values in structure literal, expected at least %td, got %td", min_field_count, handled_elem_count); } } else if (handled_elem_count != field_count) { - error(cl->close, "Too few values in structure literal, expected %td, got %td", field_count, cl->elems.count); + error(cl->close, "Too few values in structure literal, expected %td, got %td", field_count, handled_elem_count); } } }