diff options
| -rw-r--r-- | mirai/invocations/fs/setlocation.zig | 14 | ||||
| -rw-r--r-- | mirai/invocations/kata/postman.zig | 19 | ||||
| -rw-r--r-- | mirai/kata/pool.zig | 9 | ||||
| -rw-r--r-- | mirai/kata/types.zig | 5 |
4 files changed, 38 insertions, 9 deletions
diff --git a/mirai/invocations/fs/setlocation.zig b/mirai/invocations/fs/setlocation.zig index 209134d..f2164fd 100644 --- a/mirai/invocations/fs/setlocation.zig +++ b/mirai/invocations/fs/setlocation.zig @@ -5,6 +5,7 @@ const ahci = @import("../../drivers/ahci/ahci.zig"); const copy = @import("../../utils/mem/copy.zig"); const fs_limits = @import("../../common/limits/fs.zig"); const handler = @import("../handler.zig"); +const heap = @import("../../memory/heap.zig"); const kata_mod = @import("../../kata/kata.zig"); const location = @import("../../utils/fs/location.zig"); const memory_limits = @import("../../common/limits/memory.zig"); @@ -44,9 +45,18 @@ pub fn invoke(ctx: *handler.InvocationContext) void { if (kata.parent_id != 0) { if (kata_mod.get_kata(kata.parent_id)) |parent| { + const len: u16 = @intCast(canonical.len); + if (parent.letter_capacity < len) { + if (parent.letter_data) |old| { + heap.free(@ptrCast(old), parent.letter_capacity); + } + const new_buf = heap.alloc(len) orelse return result.set_error(ctx); + parent.letter_data = new_buf; + parent.letter_capacity = len; + } parent.letter_type = 1; - parent.letter_len = @intCast(canonical.len); - copy.bytes(parent.letter_data[0..canonical.len], canonical.buf[0..canonical.len]); + parent.letter_len = len; + copy.bytes(parent.letter_data.?[0..len], canonical.buf[0..canonical.len]); } } diff --git a/mirai/invocations/kata/postman.zig b/mirai/invocations/kata/postman.zig index 1de6df9..6bea674 100644 --- a/mirai/invocations/kata/postman.zig +++ b/mirai/invocations/kata/postman.zig @@ -2,6 +2,7 @@ const copy = @import("../../utils/mem/copy.zig"); const handler = @import("../handler.zig"); +const heap = @import("../../memory/heap.zig"); const int = @import("../../utils/types/int.zig"); const kata_constants = @import("../../common/constants/kata.zig"); const kata_limits = @import("../../common/limits/kata.zig"); @@ -22,7 +23,7 @@ pub fn invoke(ctx: *handler.InvocationContext) void { fn send_letter(ctx: *handler.InvocationContext) void { const letter_type = int.u8_of(ctx.rsi); const data_ptr = ctx.rdx; - const data_len = ctx.r10; + const data_len = int.u16_of(ctx.r10); if (data_len > kata_limits.MAX_LETTER_LENGTH) return result.set_error(ctx); if (data_len > 0 and !memory_limits.is_valid_kata_pointer(data_ptr)) return result.set_error(ctx); @@ -31,10 +32,18 @@ fn send_letter(ctx: *handler.InvocationContext) void { const parent = kata_mod.get_kata(sender.parent_id) orelse return result.set_error(ctx); parent.letter_type = letter_type; - parent.letter_len = int.u8_of(data_len); + parent.letter_len = data_len; if (data_len > 0) { - copy.from_ptr(&parent.letter_data, data_ptr, data_len); + if (parent.letter_capacity < data_len) { + if (parent.letter_data) |old| { + heap.free(@ptrCast(old), parent.letter_capacity); + } + const new_buf = heap.alloc(data_len) orelse return result.set_error(ctx); + parent.letter_data = new_buf; + parent.letter_capacity = data_len; + } + copy.from_ptr(parent.letter_data.?[0..data_len], data_ptr, data_len); } result.set_ok(ctx); @@ -54,7 +63,9 @@ fn read_letter(ctx: *handler.InvocationContext) void { if (!memory_limits.is_valid_kata_pointer(buffer_ptr)) return result.set_error(ctx); if (kata.letter_len > buffer_len) return result.set_error(ctx); - copy.to_ptr(buffer_ptr, kata.letter_data[0..kata.letter_len]); + if (kata.letter_data) |data| { + copy.to_ptr(buffer_ptr, data[0..kata.letter_len]); + } if (kata.letter_len < buffer_len) { slice.byte_ptr(buffer_ptr)[kata.letter_len] = 0; diff --git a/mirai/kata/pool.zig b/mirai/kata/pool.zig index 3d7d014..b89fac3 100644 --- a/mirai/kata/pool.zig +++ b/mirai/kata/pool.zig @@ -2,6 +2,7 @@ const attachment = @import("attachment.zig"); const attachment_const = @import("../common/constants/attachment.zig"); +const heap = @import("../memory/heap.zig"); const kata_const = @import("../common/constants/kata.zig"); const kata_limits = @import("../common/limits/kata.zig"); const types = @import("types.zig"); @@ -83,6 +84,11 @@ pub fn dissolve(kata_id: u32) void { slot.* = null; } } + if (kata.letter_data) |data| { + heap.free(@ptrCast(data), kata.letter_capacity); + kata.letter_data = null; + kata.letter_capacity = 0; + } memory.cleanup(kata); kata.state = .Dissolved; used[i] = false; @@ -106,8 +112,9 @@ fn create_empty() types.Kata { .current_cluster = 0, .parent_id = 0, .letter_type = 0, - .letter_data = undefined, + .letter_data = null, .letter_len = 0, + .letter_capacity = 0, .vruntime = 0, .weight = kata_const.DEFAULT_WEIGHT, .last_run = 0, diff --git a/mirai/kata/types.zig b/mirai/kata/types.zig index 8779449..16a5024 100644 --- a/mirai/kata/types.zig +++ b/mirai/kata/types.zig @@ -78,8 +78,9 @@ pub const Kata = struct { parent_id: u32, letter_type: u8, - letter_data: [kata_limits.MAX_LETTER_LENGTH]u8, - letter_len: u8, + letter_data: ?[*]u8, + letter_len: u16, + letter_capacity: u16, vruntime: u64, weight: u32, |
