@@ -1453,13 +1453,13 @@ mod signal_handler {
14531453    /// When an error signal (such as SIGABRT or SIGSEGV) is delivered to the 
14541454/// process, print a stack trace and then exit. 
14551455pub ( super )  fn  install ( )  { 
1456+         use  std:: alloc:: { alloc,  Layout } ; 
1457+ 
14561458        unsafe  { 
1457-             const   ALT_STACK_SIZE :  usize  = libc :: MINSIGSTKSZ  + 64  *  1024 ; 
1459+             let  alt_stack_size :  usize  = min_sigstack_size ( )  + 64  *  1024 ; 
14581460            let  mut  alt_stack:  libc:: stack_t  = std:: mem:: zeroed ( ) ; 
1459-             alt_stack. ss_sp  =
1460-                 std:: alloc:: alloc ( std:: alloc:: Layout :: from_size_align ( ALT_STACK_SIZE ,  1 ) . unwrap ( ) ) 
1461-                     as  * mut  libc:: c_void ; 
1462-             alt_stack. ss_size  = ALT_STACK_SIZE ; 
1461+             alt_stack. ss_sp  = alloc ( Layout :: from_size_align ( alt_stack_size,  1 ) . unwrap ( ) ) . cast ( ) ; 
1462+             alt_stack. ss_size  = alt_stack_size; 
14631463            libc:: sigaltstack ( & alt_stack,  std:: ptr:: null_mut ( ) ) ; 
14641464
14651465            let  mut  sa:  libc:: sigaction  = std:: mem:: zeroed ( ) ; 
@@ -1469,6 +1469,23 @@ mod signal_handler {
14691469            libc:: sigaction ( libc:: SIGSEGV ,  & sa,  std:: ptr:: null_mut ( ) ) ; 
14701470        } 
14711471    } 
1472+ 
1473+     /// Modern kernels on modern hardware can have dynamic signal stack sizes. 
1474+ #[ cfg( any( target_os = "linux" ,  target_os = "android" ) ) ]  
1475+     fn  min_sigstack_size ( )  -> usize  { 
1476+         const  AT_MINSIGSTKSZ :  core:: ffi:: c_ulong  = 51 ; 
1477+         let  dynamic_sigstksz = unsafe  {  libc:: getauxval ( AT_MINSIGSTKSZ )  } ; 
1478+         // If getauxval couldn't find the entry, it returns 0, 
1479+         // so take the higher of the "constant" and auxval. 
1480+         // This transparently supports older kernels which don't provide AT_MINSIGSTKSZ 
1481+         libc:: MINSIGSTKSZ . max ( dynamic_sigstksz as  _ ) 
1482+     } 
1483+ 
1484+     /// Not all OS support hardware where this is needed. 
1485+ #[ cfg( not( any( target_os = "linux" ,  target_os = "android" ) ) ) ]  
1486+     fn  min_sigstack_size ( )  -> usize  { 
1487+         libc:: MINSIGSTKSZ 
1488+     } 
14721489} 
14731490
14741491#[ cfg( not( all( unix,  any( target_env = "gnu" ,  target_os = "macos" ) ) ) ) ]  
0 commit comments