Files
RedBear-OS/local/patches/relibc/P3-tls-get-addr-panic-fix.patch
T

35 lines
1.3 KiB
Diff

diff --git a/src/header/dl-tls/mod.rs b/src/header/dl-tls/mod.rs
index 0196bf7b..785ab343 100644
--- a/src/header/dl-tls/mod.rs
+++ b/src/header/dl-tls/mod.rs
@@ -51,6 +51,14 @@ pub unsafe extern "C" fn __tls_get_addr(ti: *mut dl_tls_index) -> *mut c_void {
let layout = Layout::from_size_align_unchecked(master.segment_size, 16);
let ptr = alloc(layout);
+ if ptr.is_null() {
+ eprintln!(
+ "__tls_get_addr: TLS allocation failed for module {:#x} (size {})",
+ ti.ti_module, master.segment_size
+ );
+ return ptr::null_mut();
+ }
+
ptr::copy_nonoverlapping(master.ptr, ptr, master.image_size);
ptr::write_bytes(
ptr.add(master.image_size),
@@ -68,10 +76,11 @@ pub unsafe extern "C" fn __tls_get_addr(ti: *mut dl_tls_index) -> *mut c_void {
let mut ptr = tcb.dtv_mut()[dtv_index];
if ptr.is_null() {
- panic!(
- "__tls_get_addr({ti:p}: {:#x}, {:#x})",
- ti.ti_module, ti.ti_offset
+ eprintln!(
+ "__tls_get_addr({:p}: {:#x}, {:#x}): DTV entry is null, module {} TLS not available",
+ ti, ti.ti_module, ti.ti_offset, ti.ti_module
);
+ return ptr::null_mut();
}
if cfg!(target_arch = "riscv64") {