diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/message_parser.zig | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/server/message_parser.zig b/src/server/message_parser.zig index af29c1e..bd14ec7 100644 --- a/src/server/message_parser.zig +++ b/src/server/message_parser.zig @@ -111,6 +111,10 @@ pub const Message = union(MessageType) { errdefer if (res.pass) |p| alloc.free(p); res.name = if (self.name) |n| try alloc.dupe(u8, n) else null; errdefer if (res.name) |n| alloc.free(n); + res.lang = try alloc.dupe(u8, self.lang); + errdefer alloc.free(res.lang); + res.version = try alloc.dupe(u8, self.version); + errdefer alloc.free(res.version); res.sig = if (self.sig) |s| try alloc.dupe(u8, s) else null; errdefer if (res.sig) |s| alloc.free(s); res.jwt = if (self.jwt) |j| try alloc.dupe(u8, j) else null; @@ -307,6 +311,7 @@ pub const Message = union(MessageType) { return error.InvalidStream; } const subject = try readSubject(alloc, in); + errdefer alloc.free(subject); const second = blk: { // Drop whitespace while (in.peekByte()) |byte| { @@ -316,6 +321,7 @@ pub const Message = union(MessageType) { } else |err| return err; var acc: std.ArrayList(u8) = try .initCapacity(alloc, 32); + errdefer acc.deinit(alloc); while (in.peekByte()) |byte| { if (std.ascii.isWhitespace(byte)) break; try acc.append(alloc, byte); @@ -324,8 +330,12 @@ pub const Message = union(MessageType) { break :blk try acc.toOwnedSlice(alloc); }; + errdefer alloc.free(second); const queue_group = if ((try in.peekByte()) != '\r') second else null; - const sid = if (queue_group) |_| try in.takeDelimiterExclusive('\r') else second; + // We do not need an errdefer free for queue group, because it will only be second (already has errdefer free) or null. + const sid = if (queue_group) |_| try alloc.dupe(u8, try in.takeDelimiterExclusive('\r')) else second; + // if queue_group is null, that means sid is second, and already has an errdefer free. + errdefer if (queue_group) |_| alloc.free(sid); try expectStreamBytes(in, "\r\n"); return .{ .sub = .{ @@ -340,9 +350,10 @@ pub const Message = union(MessageType) { @branchHint(.unlikely); return error.InvalidStream; } - // Parse byte count + // Parse sid const sid = blk: { var acc: std.ArrayList(u8) = try .initCapacity(alloc, 8); + errdefer acc.deinit(alloc); while (in.peekByte()) |byte| { if (std.ascii.isWhitespace(byte)) break; try acc.append(alloc, byte); @@ -350,6 +361,7 @@ pub const Message = union(MessageType) { } else |err| return err; break :blk try acc.toOwnedSlice(alloc); }; + errdefer alloc.free(sid); if ((try in.peekByte()) == '\r') { try expectStreamBytes(in, "\r\n"); @@ -362,6 +374,7 @@ pub const Message = union(MessageType) { in.toss(1); const max_msgs = blk: { var max_msgs_list: std.ArrayList(u8) = try .initCapacity(alloc, 64); + errdefer max_msgs_list.deinit(alloc); while (in.peekByte()) |byte| { if (std.ascii.isWhitespace(byte)) { try expectStreamBytes(in, "\r\n"); @@ -393,6 +406,7 @@ pub const Message = union(MessageType) { fn readSubject(alloc: std.mem.Allocator, in: *std.Io.Reader) ![]const u8 { var subject_list: std.ArrayList(u8) = try .initCapacity(alloc, 1024); + errdefer subject_list.deinit(alloc); // Handle the first character { |
