From 0dac8402cf77442c7f16fe7a17c7a313e8ca41d9 Mon Sep 17 00:00:00 2001 From: torque Date: Thu, 24 Aug 2023 20:11:27 -0700 Subject: [PATCH] thunks: also aligncast userdata This is probably the sort of thing that I wouldn't actually think of having explicit test coverage for if I hadn't accidentally ran across it while fiddling. I will compensate for this easily by not actually writing tests at all. --- src/connection.zig | 14 +++++++------- src/subscription.zig | 2 +- src/thunk.zig | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/connection.zig b/src/connection.zig index a4cd644..b6db633 100644 --- a/src/connection.zig +++ b/src/connection.zig @@ -893,7 +893,7 @@ pub fn makeConnectionCallbackThunk( return struct { fn thunk(conn: ?*nats_c.natsConnection, userdata: ?*anyopaque) callconv(.C) void { const connection: *Connection = if (conn) |c| @ptrCast(c) else unreachable; - const data: *T = if (userdata) |u| @ptrCast(u) else unreachable; + const data: *T = if (userdata) |u| @alignCast(@ptrCast(u)) else unreachable; callback(connection, data); } }.thunk; @@ -916,7 +916,7 @@ pub fn makeReconnectDelayCallbackThunk( userdata: ?*anyopaque, ) callconv(.C) i64 { const connection: *Connection = if (conn) |c| @ptrCast(c) else unreachable; - const data: *T = if (userdata) |u| @ptrCast(u) else unreachable; + const data: *T = if (userdata) |u| @alignCast(@ptrCast(u)) else unreachable; return callback(connection, attempts, data); } }.thunk; @@ -946,7 +946,7 @@ pub fn makeErrorHandlerCallbackThunk( ) callconv(.C) void { const connection: *Connection = if (conn) |c| @ptrCast(c) else unreachable; const subscription: *Subscription = if (sub) |s| @ptrCast(s) else unreachable; - const data: *T = if (userdata) |u| @ptrCast(u) else unreachable; + const data: *T = if (userdata) |u| @alignCast(@ptrCast(u)) else unreachable; callback(connection, subscription, Status.fromInt(status), data); } @@ -1005,7 +1005,7 @@ pub fn makeEventLoopAddRemoveCallbackThunk( userdata: ?*anyopaque, ) callconv(.C) nats_c.natsStatus { const connection: *Connection = if (conn) |c| @ptrCast(c) else unreachable; - const data: *T = if (userdata) |u| @ptrCast(u) else unreachable; + const data: *T = if (userdata) |u| @alignCast(@ptrCast(u)) else unreachable; callback(connection, attempts, data) catch |err| return Status.fromError(err).toInt(); @@ -1028,7 +1028,7 @@ pub fn makeEventLoopDetachCallbackThunk( fn thunk( userdata: ?*anyopaque, ) callconv(.C) nats_c.natsStatus { - const data: *T = if (userdata) |u| @ptrCast(u) else unreachable; + const data: *T = if (userdata) |u| @alignCast(@ptrCast(u)) else unreachable; callback(data) catch |err| return Status.fromError(err).toInt(); return nats_c.NATS_OK; } @@ -1058,7 +1058,7 @@ pub fn makeJwtHandlerCallbackThunk( err_out: *?[*:0]u8, userdata: ?*anyopaque, ) callconv(.C) nats_c.natsStatus { - const data: *T = if (userdata) |u| @ptrCast(u) else unreachable; + const data: *T = if (userdata) |u| @alignCast(@ptrCast(u)) else unreachable; switch (callback(data)) { .jwt => |jwt| { @@ -1099,7 +1099,7 @@ pub fn makeSignatureHandlerCallbackThunk( nonce: [*:0]const u8, userdata: ?*anyopaque, ) callconv(.C) nats_c.natsStatus { - const data: *T = if (userdata) |u| @ptrCast(u) else unreachable; + const data: *T = if (userdata) |u| @alignCast(@ptrCast(u)) else unreachable; switch (callback(std.mem.sliceTo(nonce, 0), data)) { .signature => |sig| { diff --git a/src/subscription.zig b/src/subscription.zig index 92c8aae..2d9b415 100644 --- a/src/subscription.zig +++ b/src/subscription.zig @@ -197,7 +197,7 @@ pub fn makeSubscriptionCallbackThunk( const connection: *Connection = if (conn) |c| @ptrCast(c) else unreachable; const subscription: *Subscription = if (sub) |s| @ptrCast(s) else unreachable; - const data: *T = if (userdata) |u| @ptrCast(u) else unreachable; + const data: *T = if (userdata) |u| @alignCast(@ptrCast(u)) else unreachable; callback(data, connection, subscription, message); } diff --git a/src/thunk.zig b/src/thunk.zig index 5d26a26..2ceb0ad 100644 --- a/src/thunk.zig +++ b/src/thunk.zig @@ -16,7 +16,7 @@ pub fn makeSimpleCallbackThunk( ) *const SimpleCallback { return struct { fn thunk(userdata: ?*anyopaque) callconv(.C) void { - const data: *T = if (userdata) |u| @ptrCast(u) else unreachable; + const data: *T = if (userdata) |u| @alignCast(@ptrCast(u)) else unreachable; callback(data); } }.thunk;