Double reference in the signal round-trip with rust's libc
Example
use libc::{c_int, signal, SIGINT};
extern "C" fn handler(_signal: c_int) {}
fn main() {
eprintln!("Handler: {:x}", handler as usize);
assert_eq!(
unsafe { signal(SIGINT, handler as usize) },
std::ptr::null() as *const () as usize
); // sanity check
let prev = unsafe { signal(SIGINT, handler as usize) };
eprintln!("Return: {:x}", prev as usize);
eprintln!("Deference once: {:x}", unsafe {
*(prev as *const usize)
});
eprintln!("Deference twice: {:x}", unsafe {
**(prev as *const *const usize)
});
}
Expected behaviour
Handler: 4008c0
Return: 4008c0
Real behaviour
Handler: 4008c0
Return: 180000ffa70
Deference once: 180000ffa88
Deference twice: 4008c0