authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-17 13:35:39+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-17 13:35:39+02:00
log5bc4417d2a5155ceb10c73b5f56229c8f66539fc
tree63bf3de943a4531e145f00e29cb52381abf8f94c
parent17af53554e1362f9632aff592afcba11190c94b1

tapi: fix memory bugs in yaml parser


1 files changed, 20 insertions(+), 13 deletions(-)

src/link/tapi/parse.zig+20-13
...@@ -40,10 +40,26 @@ pub const Node = struct {...@@ -40,10 +40,26 @@ pub const Node = struct {
4040
41 pub fn deinit(self: *Node, allocator: Allocator) void {41 pub fn deinit(self: *Node, allocator: Allocator) void {
42 switch (self.tag) {42 switch (self.tag) {
43 .doc => @fieldParentPtr(Node.Doc, "base", self).deinit(allocator),43 .doc => {
44 .map => @fieldParentPtr(Node.Map, "base", self).deinit(allocator),44 const parent = @fieldParentPtr(Node.Doc, "base", self);
45 .list => @fieldParentPtr(Node.List, "base", self).deinit(allocator),45 parent.deinit(allocator);
46 .value => @fieldParentPtr(Node.Value, "base", self).deinit(allocator),46 allocator.destroy(parent);
47 },
48 .map => {
49 const parent = @fieldParentPtr(Node.Map, "base", self);
50 parent.deinit(allocator);
51 allocator.destroy(parent);
52 },
53 .list => {
54 const parent = @fieldParentPtr(Node.List, "base", self);
55 parent.deinit(allocator);
56 allocator.destroy(parent);
57 },
58 .value => {
59 const parent = @fieldParentPtr(Node.Value, "base", self);
60 parent.deinit(allocator);
61 allocator.destroy(parent);
62 },
47 }63 }
48 }64 }
4965
...@@ -76,7 +92,6 @@ pub const Node = struct {...@@ -76,7 +92,6 @@ pub const Node = struct {
76 pub fn deinit(self: *Doc, allocator: Allocator) void {92 pub fn deinit(self: *Doc, allocator: Allocator) void {
77 if (self.value) |node| {93 if (self.value) |node| {
78 node.deinit(allocator);94 node.deinit(allocator);
79 allocator.destroy(node);
80 }95 }
81 }96 }
8297
...@@ -122,7 +137,6 @@ pub const Node = struct {...@@ -122,7 +137,6 @@ pub const Node = struct {
122 for (self.values.items) |entry| {137 for (self.values.items) |entry| {
123 if (entry.value) |value| {138 if (entry.value) |value| {
124 value.deinit(allocator);139 value.deinit(allocator);
125 allocator.destroy(value);
126 }140 }
127 }141 }
128 self.values.deinit(allocator);142 self.values.deinit(allocator);
...@@ -163,7 +177,6 @@ pub const Node = struct {...@@ -163,7 +177,6 @@ pub const Node = struct {
163 pub fn deinit(self: *List, allocator: Allocator) void {177 pub fn deinit(self: *List, allocator: Allocator) void {
164 for (self.values.items) |node| {178 for (self.values.items) |node| {
165 node.deinit(allocator);179 node.deinit(allocator);
166 allocator.destroy(node);
167 }180 }
168 self.values.deinit(allocator);181 self.values.deinit(allocator);
169 }182 }
...@@ -239,7 +252,6 @@ pub const Tree = struct {...@@ -239,7 +252,6 @@ pub const Tree = struct {
239 self.line_cols.deinit();252 self.line_cols.deinit();
240 for (self.docs.items) |doc| {253 for (self.docs.items) |doc| {
241 doc.deinit(self.allocator);254 doc.deinit(self.allocator);
242 self.allocator.destroy(doc);
243 }255 }
244 self.docs.deinit(self.allocator);256 self.docs.deinit(self.allocator);
245 }257 }
...@@ -386,7 +398,6 @@ const Parser = struct {...@@ -386,7 +398,6 @@ const Parser = struct {
386 }398 }
387 errdefer if (node.value) |val| {399 errdefer if (node.value) |val| {
388 val.deinit(self.allocator);400 val.deinit(self.allocator);
389 self.allocator.destroy(val);
390 };401 };
391402
392 // Parse footer403 // Parse footer
...@@ -426,7 +437,6 @@ const Parser = struct {...@@ -426,7 +437,6 @@ const Parser = struct {
426 for (node.values.items) |entry| {437 for (node.values.items) |entry| {
427 if (entry.value) |val| {438 if (entry.value) |val| {
428 val.deinit(self.allocator);439 val.deinit(self.allocator);
429 self.allocator.destroy(val);
430 }440 }
431 }441 }
432 node.values.deinit(self.allocator);442 node.values.deinit(self.allocator);
...@@ -467,7 +477,6 @@ const Parser = struct {...@@ -467,7 +477,6 @@ const Parser = struct {
467 const val = try self.value();477 const val = try self.value();
468 errdefer if (val) |v| {478 errdefer if (val) |v| {
469 v.deinit(self.allocator);479 v.deinit(self.allocator);
470 self.allocator.destroy(v);
471 };480 };
472481
473 if (val) |v| {482 if (val) |v| {
...@@ -503,7 +512,6 @@ const Parser = struct {...@@ -503,7 +512,6 @@ const Parser = struct {
503 errdefer {512 errdefer {
504 for (node.values.items) |val| {513 for (node.values.items) |val| {
505 val.deinit(self.allocator);514 val.deinit(self.allocator);
506 self.allocator.destroy(val);
507 }515 }
508 node.values.deinit(self.allocator);516 node.values.deinit(self.allocator);
509 }517 }
...@@ -535,7 +543,6 @@ const Parser = struct {...@@ -535,7 +543,6 @@ const Parser = struct {
535 errdefer {543 errdefer {
536 for (node.values.items) |val| {544 for (node.values.items) |val| {
537 val.deinit(self.allocator);545 val.deinit(self.allocator);
538 self.allocator.destroy(val);
539 }546 }
540 node.values.deinit(self.allocator);547 node.values.deinit(self.allocator);
541 }548 }