summaryrefslogtreecommitdiff
path: root/src/server/message_parser.zig
diff options
context:
space:
mode:
authorRobby Zambito <contact@robbyzambito.me>2026-01-02 13:34:25 +0000
committerRobby Zambito <contact@robbyzambito.me>2026-01-02 13:58:23 +0000
commitaca265f09576645ef904a8a4e3cd2bb674ea11fb (patch)
tree5d7dd620481c77a02d5f99a3fd85100b06491d69 /src/server/message_parser.zig
parent4bf064056cf8938c90fe5ac8ac374a6e998fbc27 (diff)
Cleanup on error
Diffstat (limited to 'src/server/message_parser.zig')
-rw-r--r--src/server/message_parser.zig18
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
{