Skip to content

Commit 6bb7f09

Browse files
committed
Don't use luaL_typename to get a static type name in Luau.
In Luau this function returns heap-allocated string rather than static string, so accessing this value when Lua state is destroyed is UB. Fixes #674
1 parent e67ae7f commit 6bb7f09

File tree

2 files changed

+6
-2
lines changed

2 files changed

+6
-2
lines changed

src/conversion.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1211,7 +1211,8 @@ impl<L: FromLua, R: FromLua> FromLua for Either<L, R> {
12111211
Err(_) => match R::from_stack(idx, lua).map(Either::Right) {
12121212
Ok(r) => Ok(r),
12131213
Err(_) => {
1214-
let value_type_name = CStr::from_ptr(ffi::luaL_typename(lua.state(), idx));
1214+
let value_type_name =
1215+
CStr::from_ptr(ffi::lua_typename(lua.state(), ffi::lua_type(lua.state(), idx)));
12151216
Err(Error::FromLuaConversionError {
12161217
from: value_type_name.to_str().unwrap(),
12171218
to: Self::type_name(),

src/state/raw.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1219,7 +1219,10 @@ impl RawLua {
12191219
Ok(type_id) => Ok(type_id),
12201220
Err(Error::UserDataTypeMismatch) if ffi::lua_type(state, idx) != ffi::LUA_TUSERDATA => {
12211221
// Report `FromLuaConversionError` instead
1222-
let idx_type_name = CStr::from_ptr(ffi::luaL_typename(state, idx));
1222+
// In Luau `luaL_typename` return heap-allocated string that is valid only for
1223+
// the `state` lifetime.
1224+
// `lua_typename` is used instead to get a truly static string.
1225+
let idx_type_name = CStr::from_ptr(ffi::lua_typename(state, ffi::lua_type(state, idx)));
12231226
let idx_type_name = idx_type_name.to_str().unwrap();
12241227
let message = format!("expected userdata of type '{}'", short_type_name::<T>());
12251228
Err(Error::from_lua_conversion(idx_type_name, "userdata", message))

0 commit comments

Comments
 (0)