aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mirai/invocations/fs/setlocation.zig14
-rw-r--r--mirai/invocations/kata/postman.zig19
-rw-r--r--mirai/kata/pool.zig9
-rw-r--r--mirai/kata/types.zig5
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,