diff --git a/fuzz/crashes/id:000000,sig:06,src:000000,time:2049,execs:911,op:quick,pos:263 b/fuzz/crashes/id:000000,sig:06,src:000000,time:2049,execs:911,op:quick,pos:263 new file mode 100644 index 0000000000000000000000000000000000000000..64279d976ad0e474637f422f1b7c4b1469c2f993 --- /dev/null +++ b/fuzz/crashes/id:000000,sig:06,src:000000,time:2049,execs:911,op:quick,pos:263 @@ -0,0 +1,31 @@ +id: g982zq6e8wsvnmduerpbf8787hu85brugmngn8wf +name: yaml +main: yaml.zig +license: MIT +description: A Yaml parser built on top of libyaml +dependencies: + - src: git https://github.com/yaml/libyaml tag-0.2.5 + id: 8mdbh0zuneb0i3hs5jby5je0heem1i6yxusl7c8y8qx68hqc + J license: MIT + c_include_dirs: + - include + c_source_flags: + - -DYAML_VERSION_MAJOR=0 + - -DYAML_VERSION_MINOR=2 + - -DYAML_VERSION_PATCH=5 + - -DYAML_VERSION_STRING="0.2.5" + - -DYAML_DECLARE_STATIC=1 + c_source_files: + - src/api.c + - src/dumper.c + - src/emitter.c + - src/loader.c + - src/parser.c + - src/reader.c + - src/scanner.c + - src/writer.c + + - src: git https://github.com/nektro/zig-extras + +root_dependencies: + - src: git https://github.com/nektro/zig-expect diff --git a/test.zig b/test.zig index adbe9046033ce502cad9a5849aefaf4d986e5904..52aa66c870c3a4f6f2b4a553dcd4d852987e8c98 100644 --- a/test.zig +++ b/test.zig @@ -11,6 +11,11 @@ test { try expect(doc.mapping.get_string("id").?).toEqualString("g982zq6e8wsvnmduerpbf8787hu85brugmngn8wf"); } +test { + const alloc = std.testing.allocator; + const doc = yaml.parse(alloc, @embedFile("./fuzz/crashes/id:000000,sig:06,src:000000,time:2049,execs:911,op:quick,pos:263")) catch return; + defer doc.deinit(alloc); +} fn parseTest(comptime basename: [:0]const u8) !void { const alloc = std.testing.allocator; diff --git a/yaml.zig b/yaml.zig index 0cc41325a61e6143eb7f832e24938be2efb79333..a71be83a88b319f6595d7784308f45d41a424b6b 100644 --- a/yaml.zig +++ b/yaml.zig @@ -302,6 +302,7 @@ fn parse_document(p: *Parser) Error!Document { switch (tok.type) { c.YAML_MAPPING_START_EVENT => { const item = try parse_item(p, tok); + errdefer item.deinit(p.alloc); const tok2 = try p.next(); if (tok2.type != c.YAML_DOCUMENT_END_EVENT) { return error.YamlUnexpectedToken; @@ -310,6 +311,7 @@ fn parse_document(p: *Parser) Error!Document { }, c.YAML_SEQUENCE_START_EVENT => { const item = try parse_item(p, tok); + errdefer item.deinit(p.alloc); const tok2 = try p.next(); if (tok2.type != c.YAML_DOCUMENT_END_EVENT) { return error.YamlUnexpectedToken; @@ -357,6 +359,7 @@ fn parse_value(p: *Parser) Error!Value { fn parse_sequence(p: *Parser) Error!Sequence { var res = std.ArrayList(Item).init(p.alloc); errdefer res.deinit(); + errdefer for (res.items) |k| k.deinit(p.alloc); while (true) { const tok = try p.next();