From 7125fa7573b523b5a0b5879193046c1d9a24f098 Mon Sep 17 00:00:00 2001 From: Balasubramania Pillai Date: Thu, 2 Apr 2026 17:19:18 -0400 Subject: [PATCH 1/3] #21 call asan on setjmp --- src/luaconf.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/luaconf.h b/src/luaconf.h index a5e54a0..13f9570 100644 --- a/src/luaconf.h +++ b/src/luaconf.h @@ -692,6 +692,9 @@ static inline void lua_number2str(char *buf, LUA_NUMBER n) ** compiling as C++ code, with _longjmp/_setjmp when asked to use them, ** and with longjmp/setjmp otherwise. */ + +void __asan_handle_no_return(void); + #if defined(__cplusplus) /* C++ exceptions */ #define LUAI_THROW(L,c) throw(c) @@ -701,13 +704,13 @@ static inline void lua_number2str(char *buf, LUA_NUMBER n) #elif defined(LUA_USE_ULONGJMP) /* in Unix, try _longjmp/_setjmp (more efficient) */ -#define LUAI_THROW(L,c) lua_do_longjmp((c)->b, 1) +#define LUAI_THROW(L,c) do { __asan_handle_no_return(); lua_do_longjmp((c)->b, 1); } while(0) #define LUAI_TRY(L,c,a) if (lua_do_setjmp((c)->b) == 0) { a } #define luai_jmpbuf jmp_buf #else /* default handling with long jumps */ -#define LUAI_THROW(L,c) lua_do_longjmp((c)->b, 1) +#define LUAI_THROW(L,c) do { __asan_handle_no_return(); lua_do_longjmp((c)->b, 1); } while(0) #define LUAI_TRY(L,c,a) if (lua_do_setjmp((c)->b) == 0) { a } #define luai_jmpbuf jmp_buf From a58f717c6c1184cc3969b232607f496d560c389b Mon Sep 17 00:00:00 2001 From: Balasubramania Pillai Date: Thu, 2 Apr 2026 18:01:44 -0400 Subject: [PATCH 2/3] #21 call asan on setjmp --- src/luaconf.h | 6 ++---- src/thrlua.h | 10 +++++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/luaconf.h b/src/luaconf.h index 13f9570..e4d2340 100644 --- a/src/luaconf.h +++ b/src/luaconf.h @@ -693,8 +693,6 @@ static inline void lua_number2str(char *buf, LUA_NUMBER n) ** and with longjmp/setjmp otherwise. */ -void __asan_handle_no_return(void); - #if defined(__cplusplus) /* C++ exceptions */ #define LUAI_THROW(L,c) throw(c) @@ -704,13 +702,13 @@ void __asan_handle_no_return(void); #elif defined(LUA_USE_ULONGJMP) /* in Unix, try _longjmp/_setjmp (more efficient) */ -#define LUAI_THROW(L,c) do { __asan_handle_no_return(); lua_do_longjmp((c)->b, 1); } while(0) +#define LUAI_THROW(L,c) lua_do_longjmp((c)->b, 1) #define LUAI_TRY(L,c,a) if (lua_do_setjmp((c)->b) == 0) { a } #define luai_jmpbuf jmp_buf #else /* default handling with long jumps */ -#define LUAI_THROW(L,c) do { __asan_handle_no_return(); lua_do_longjmp((c)->b, 1); } while(0) +#define LUAI_THROW(L,c) lua_do_longjmp((c)->b, 1) #define LUAI_TRY(L,c,a) if (lua_do_setjmp((c)->b) == 0) { a } #define luai_jmpbuf jmp_buf diff --git a/src/thrlua.h b/src/thrlua.h index 3f39d8f..0faa7a9 100644 --- a/src/thrlua.h +++ b/src/thrlua.h @@ -218,7 +218,15 @@ struct lua_longjmp { # define LUA_ASMNAME(x) _##x #endif -#if LUA_ARCH_X86_64 +/* +** Under AddressSanitizer, use system setjmp/longjmp so ASAN can +** intercept them and properly unpoison skipped stack frames. +** The custom asm versions bypass ASAN and cause false positives. +*/ +#if defined(__SANITIZE_ADDRESS__) || (defined(__has_feature) && __has_feature(address_sanitizer)) +# define lua_do_setjmp setjmp +# define lua_do_longjmp longjmp +#elif LUA_ARCH_X86_64 # define lua_do_setjmp LUA_ASMNAME(lua_setjmp_amd64) # define lua_do_longjmp LUA_ASMNAME(lua_longjmp_amd64) #elif LUA_ARCH_I386 From d6b2e674490c010e4d6949efd7017c05b87b925e Mon Sep 17 00:00:00 2001 From: Balasubramania Pillai Date: Thu, 2 Apr 2026 18:03:18 -0400 Subject: [PATCH 3/3] #21 call asan on setjmp --- src/thrlua.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/thrlua.h b/src/thrlua.h index 0faa7a9..e9b588b 100644 --- a/src/thrlua.h +++ b/src/thrlua.h @@ -223,7 +223,7 @@ struct lua_longjmp { ** intercept them and properly unpoison skipped stack frames. ** The custom asm versions bypass ASAN and cause false positives. */ -#if defined(__SANITIZE_ADDRESS__) || (defined(__has_feature) && __has_feature(address_sanitizer)) +#if defined(__SANITIZE_ADDRESS__) # define lua_do_setjmp setjmp # define lua_do_longjmp longjmp #elif LUA_ARCH_X86_64