From d8f7590848b07bb5f062fc0876d8f65164c4a9bc Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Thu, 5 Dec 2024 13:58:45 +1100 Subject: [PATCH] fix(__tls_get_addr): NULL check Has to be done before adding the offsets. Signed-off-by: Anhad Singh --- src/header/dl-tls/mod.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/header/dl-tls/mod.rs b/src/header/dl-tls/mod.rs index f1968de5f8..4620d204d9 100644 --- a/src/header/dl-tls/mod.rs +++ b/src/header/dl-tls/mod.rs @@ -22,7 +22,7 @@ pub unsafe extern "C" fn __tls_get_addr(ti: *mut dl_tls_index) -> *mut c_void { (*ti).ti_module, (*ti).ti_offset, tcb.masters().unwrap().len(), - tcb.dtv_mut().len() + tcb.dtv_mut().unwrap().len() ); if tcb.dtv_mut().unwrap_or_default().len() < tcb.masters().unwrap().len() { @@ -52,12 +52,6 @@ pub unsafe extern "C" fn __tls_get_addr(ti: *mut dl_tls_index) -> *mut c_void { let mut ptr = tcb.dtv_mut().unwrap()[dtv_index]; - if cfg!(target_arch = "riscv64") { - ptr = ptr.add(0x800 + ti.ti_offset as usize); // dynamic offsets are 0x800-based on risc-v - } else { - ptr = ptr.add(ti.ti_offset as usize); - } - if ptr.is_null() { panic!( "__tls_get_addr({ti:p}: {:#x}, {:#x})", @@ -65,6 +59,12 @@ pub unsafe extern "C" fn __tls_get_addr(ti: *mut dl_tls_index) -> *mut c_void { ); } + if cfg!(target_arch = "riscv64") { + ptr = ptr.add(0x800 + ti.ti_offset as usize); // dynamic offsets are 0x800-based on risc-v + } else { + ptr = ptr.add(ti.ti_offset as usize); + } + ptr.cast::() }