Add RawCell::unsafe_set

This commit is contained in:
Jeremy Soller
2025-10-04 07:50:16 -06:00
parent 82084440ad
commit ced734c162
8 changed files with 41 additions and 36 deletions
+3 -3
View File
@@ -95,7 +95,7 @@ pub unsafe extern "C" fn gethostent() -> *mut hostent {
let mut _host_aliases: Vec<Vec<u8>> = iter
.map(|alias| alias.bytes().chain(Some(b'\0')).collect())
.collect();
*HOST_ALIASES.as_mut_ptr() = Some(_host_aliases);
HOST_ALIASES.unsafe_set(Some(_host_aliases));
let mut host_aliases: Vec<*mut c_char> = HOST_ALIASES
.unsafe_mut()
@@ -106,7 +106,7 @@ pub unsafe extern "C" fn gethostent() -> *mut hostent {
.chain([ptr::null_mut(), ptr::null_mut()])
.collect();
*HOST_NAME.as_mut_ptr() = Some(host_name);
HOST_NAME.unsafe_set(Some(host_name));
HOST_ENTRY = hostent {
h_name: HOST_NAME.unsafe_mut().as_mut().unwrap().as_mut_ptr() as *mut c_char,
@@ -115,7 +115,7 @@ pub unsafe extern "C" fn gethostent() -> *mut hostent {
h_length: 4,
h_addr_list: &raw mut HOST_ADDR_LIST as *mut _,
};
*_HOST_ALIASES.as_mut_ptr() = Some(host_aliases);
_HOST_ALIASES.unsafe_set(Some(host_aliases));
if HOST_STAYOPEN == 0 {
endhostent();
}
+11 -11
View File
@@ -267,13 +267,13 @@ pub unsafe extern "C" fn gethostbyaddr(
_host_aliases.push(vec![b'\0']);
let mut host_aliases: Vec<*mut c_char> = Vec::new();
host_aliases.push(ptr::null_mut());
*HOST_ALIASES.as_mut_ptr() = Some(_host_aliases);
HOST_ALIASES.unsafe_set(Some(_host_aliases));
match lookup_addr(addr).map(|host_names| host_names.into_iter().next()) {
Ok(Some(host_name)) => {
_HOST_ADDR_LIST = addr.s_addr.to_ne_bytes();
HOST_ADDR_LIST = [&raw mut _HOST_ADDR_LIST as *mut c_char, ptr::null_mut()];
*HOST_NAME.as_mut_ptr() = Some(host_name);
HOST_NAME.unsafe_set(Some(host_name));
HOST_ENTRY = hostent {
h_name: HOST_NAME.unsafe_mut().as_mut().unwrap().as_mut_ptr() as *mut c_char,
h_aliases: host_aliases.as_mut_slice().as_mut_ptr(),
@@ -373,7 +373,7 @@ pub unsafe extern "C" fn gethostbyname(name: *const c_char) -> *mut hostent {
};
let host_name: Vec<u8> = name_cstr.to_bytes().to_vec();
*HOST_NAME.as_mut_ptr() = Some(host_name);
HOST_NAME.unsafe_set(Some(host_name));
_HOST_ADDR_LIST = host_addr.s_addr.to_ne_bytes();
HOST_ADDR_LIST = [&raw mut _HOST_ADDR_LIST as *mut c_char, ptr::null_mut()];
HOST_ADDR = Some(host_addr);
@@ -384,7 +384,7 @@ pub unsafe extern "C" fn gethostbyname(name: *const c_char) -> *mut hostent {
let mut host_aliases: Vec<*mut c_char> = Vec::new();
host_aliases.push(ptr::null_mut());
host_aliases.push(ptr::null_mut());
*HOST_ALIASES.as_mut_ptr() = Some(_host_aliases);
HOST_ALIASES.unsafe_set(Some(_host_aliases));
HOST_ENTRY = hostent {
h_name: HOST_NAME.unsafe_mut().as_mut().unwrap().as_mut_ptr() as *mut c_char,
@@ -449,7 +449,7 @@ pub unsafe extern "C" fn getnetent() -> *mut netent {
let mut iter: SplitWhitespace = r.split_whitespace();
let net_name = iter.next().unwrap().bytes().chain(Some(b'\0')).collect();
*NET_NAME.as_mut_ptr() = Some(net_name);
NET_NAME.unsafe_set(Some(net_name));
let addr_vec: Vec<u8> = iter.next().unwrap().bytes().chain(Some(b'\0')).collect();
let addr_cstr = addr_vec.as_slice().as_ptr() as *const c_char;
@@ -466,7 +466,7 @@ pub unsafe extern "C" fn getnetent() -> *mut netent {
.map(|x| x.as_mut_ptr() as *mut c_char)
.chain(Some(ptr::null_mut()))
.collect();
*NET_ALIASES.as_mut_ptr() = Some(_net_aliases);
NET_ALIASES.unsafe_set(Some(_net_aliases));
NET_ENTRY = netent {
n_name: NET_NAME.unsafe_mut().as_mut().unwrap().as_mut_ptr() as *mut c_char,
@@ -573,8 +573,8 @@ pub unsafe extern "C" fn getprotoent() -> *mut protoent {
.chain(Some(ptr::null_mut()))
.collect();
*PROTO_ALIASES.as_mut_ptr() = Some(_proto_aliases);
*PROTO_NAME.as_mut_ptr() = Some(proto_name);
PROTO_ALIASES.unsafe_set(Some(_proto_aliases));
PROTO_NAME.unsafe_set(Some(proto_name));
PROTO_ENTRY = protoent {
p_name: PROTO_NAME
@@ -718,9 +718,9 @@ pub unsafe extern "C" fn getservent() -> *mut servent {
serv_aliases.push(ptr::null_mut());
serv_aliases.push(ptr::null_mut());
*SERV_ALIASES.as_mut_ptr() = Some(_serv_aliases);
*SERV_NAME.as_mut_ptr() = Some(serv_name);
*SERV_PROTO.as_mut_ptr() = Some(proto);
SERV_ALIASES.unsafe_set(Some(_serv_aliases));
SERV_NAME.unsafe_set(Some(serv_name));
SERV_PROTO.unsafe_set(Some(proto));
SERV_ENTRY = servent {
s_name: SERV_NAME
+3 -3
View File
@@ -104,7 +104,7 @@ impl OwnedPwd {
fn into_global(self) -> *mut passwd {
unsafe {
PASSWD_BUF = Some(self.buffer);
*PASSWD.as_mut_ptr() = self.reference;
PASSWD.unsafe_set(self.reference);
PASSWD.as_mut_ptr()
}
}
@@ -224,7 +224,7 @@ unsafe fn mux(
#[unsafe(no_mangle)]
pub extern "C" fn endpwent() {
unsafe {
*READER.as_mut_ptr() = None;
READER.unsafe_set(None);
}
}
@@ -240,7 +240,7 @@ pub extern "C" fn getpwent() -> *mut passwd {
};
let reader = BufReader::new(file);
unsafe {
*READER.as_mut_ptr() = Some(reader);
READER.unsafe_set(Some(reader));
READER.unsafe_mut().as_mut().unwrap()
}
}
+1 -1
View File
@@ -548,7 +548,7 @@ pub unsafe extern "C" fn l64a(value: c_long) -> *mut c_char {
let num_output_digits = usize::try_from(6 - (value_as_i32.leading_zeros() + 4) / 6).unwrap();
// Reset buffer (and have null terminator in place for any result)
*L64A_BUFFER.as_mut_ptr() = [0; 7];
L64A_BUFFER.unsafe_set([0; 7]);
for i in 0..num_output_digits {
// Conversion to c_char always succeeds for the range 0..=63
+16 -15
View File
@@ -182,21 +182,22 @@ pub unsafe extern "C" fn relibc_ld_so_start(sp: &'static mut Stack, ld_entry: us
};
unsafe {
*crate::platform::OUR_ENVIRON.as_mut_ptr() = envs
.iter()
.map(|(k, v)| {
let mut var = Vec::with_capacity(k.len() + v.len() + 2);
var.extend(k.as_bytes());
var.push(b'=');
var.extend(v.as_bytes());
var.push(b'\0');
let mut var = var.into_boxed_slice();
let ptr = var.as_mut_ptr();
core::mem::forget(var);
ptr.cast()
})
.chain(core::iter::once(core::ptr::null_mut()))
.collect::<Vec<_>>();
crate::platform::OUR_ENVIRON.unsafe_set(
envs.iter()
.map(|(k, v)| {
let mut var = Vec::with_capacity(k.len() + v.len() + 2);
var.extend(k.as_bytes());
var.push(b'=');
var.extend(v.as_bytes());
var.push(b'\0');
let mut var = var.into_boxed_slice();
let ptr = var.as_mut_ptr();
core::mem::forget(var);
ptr.cast()
})
.chain(core::iter::once(core::ptr::null_mut()))
.collect::<Vec<_>>(),
);
crate::platform::environ = crate::platform::OUR_ENVIRON.unsafe_mut().as_mut_ptr();
}
+1 -1
View File
@@ -51,7 +51,7 @@ pub fn init_state() -> &'static State {
// Safe due to STATE being thread_local (TODO: is it though?)
unsafe {
if STATE.unsafe_ref().is_none() {
*STATE.as_mut_ptr() = Some(State::new())
STATE.unsafe_set(Some(State::new()));
}
let state_ptr = STATE.unsafe_ref().as_ref().unwrap() as *const State;
&*state_ptr
+4
View File
@@ -30,6 +30,10 @@ impl<T> RawCell<T> {
&*self.inner.get()
}
#[inline]
pub unsafe fn unsafe_set(&self, t: T) {
*self.inner.get() = t;
}
#[inline]
pub unsafe fn unsafe_mut(&self) -> &mut T {
&mut *self.inner.get()
}
+2 -2
View File
@@ -184,7 +184,7 @@ pub unsafe extern "C" fn relibc_start_v1(
// Set up argc and argv
let argc = sp.argc;
let argv = sp.argv();
*platform::inner_argv.as_mut_ptr() = copy_string_array(argv, argc as usize);
platform::inner_argv.unsafe_set(copy_string_array(argv, argc as usize));
platform::argv = platform::inner_argv.unsafe_mut().as_mut_ptr();
// Special code for program_invocation_name and program_invocation_short_name
if let Some(arg) = platform::inner_argv.unsafe_ref().get(0) {
@@ -201,7 +201,7 @@ pub unsafe extern "C" fn relibc_start_v1(
while !(*envp.add(len)).is_null() {
len += 1;
}
*platform::OUR_ENVIRON.as_mut_ptr() = copy_string_array(envp, len);
platform::OUR_ENVIRON.unsafe_set(copy_string_array(envp, len));
platform::environ = platform::OUR_ENVIRON.unsafe_mut().as_mut_ptr();
}