mirror of
https://github.com/logos-messaging/libchat.git
synced 2026-05-12 04:59:27 +00:00
Nim's C backend silently transforms large struct parameters (>16 bytes) into pointer parameters when calling importc functions. The destroy_* functions were declared taking T by value in Rust, but Nim always passed &T — causing Rust to read garbage from the stack on x86-64 (SIGILL on CI) while accidentally working on ARM64 macOS due to that ABI coincidentally also using pointers for large structs. Fix by changing all destroy_* functions to take &mut T and using drop_in_place, which is the correct idiom for dropping a value through a pointer. On the Nim side, replace scattered manual destroy calls with defer, which guarantees cleanup on all exit paths and prevents use-after-destroy bugs.
libchat
Supporting library for Logos-chat
Description
Languages
Rust
93.3%
Nim
2.7%
C
2.5%
Nix
1.1%
Makefile
0.4%