mirror of
https://git.robbyzambito.me/zits
synced 2026-02-04 11:44:48 +00:00
Cleanup on error
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user