From 910e3e51ba5e320a198ca5e9ca8584c94b735b04 Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Mon, 6 Jul 2026 13:24:24 +0200 Subject: [PATCH] parser: check field_state before further parsing To prevent the fuzzer from being able to reach stack overflows, we need to give an error for invalid field/decl ordering before attempting to parse the next field. --- lib/std/zig/Parse.zig | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/std/zig/Parse.zig b/lib/std/zig/Parse.zig index 0e4fe3109f3648d484567a0c6ecb2dea5a902d3a..50e2829948c525084044814b6b8a6bd2a6608456 100644 --- a/lib/std/zig/Parse.zig +++ b/lib/std/zig/Parse.zig @@ -334,13 +334,6 @@ fn parseContainerMembers(p: *Parse) Error!Members { else => { const identifier = p.tok_i; defer last_field = identifier; - const container_field = p.expectContainerField() catch |err| switch (err) { - error.OutOfMemory => |e| return e, - error.ParseError => { - p.findNextContainerMember(); - continue; - }, - }; switch (field_state) { .none => field_state = .seen, .err, .seen => {}, @@ -363,6 +356,13 @@ fn parseContainerMembers(p: *Parse) Error!Members { field_state = .err; }, } + const container_field = p.expectContainerField() catch |err| switch (err) { + error.OutOfMemory => |e| return e, + error.ParseError => { + p.findNextContainerMember(); + continue; + }, + }; try p.scratch.append(p.gpa, container_field); switch (p.tokenTag(p.tok_i)) { .comma => { @@ -439,13 +439,6 @@ fn parseContainerMembers(p: *Parse) Error!Members { const identifier = p.tok_i; defer last_field = identifier; - const container_field = p.expectContainerField() catch |err| switch (err) { - error.OutOfMemory => |e| return e, - error.ParseError => { - p.findNextContainerMember(); - continue; - }, - }; switch (field_state) { .none => field_state = .seen, .err, .seen => {}, @@ -468,6 +461,13 @@ fn parseContainerMembers(p: *Parse) Error!Members { field_state = .err; }, } + const container_field = p.expectContainerField() catch |err| switch (err) { + error.OutOfMemory => |e| return e, + error.ParseError => { + p.findNextContainerMember(); + continue; + }, + }; try p.scratch.append(p.gpa, container_field); switch (p.tokenTag(p.tok_i)) { .comma => { -- 2.54.0