wasmer_wasix/syscalls/wasix/
dl_invalid_handle.rs

1use state::ModuleHandle;
2
3use super::*;
4use crate::syscalls::*;
5
6#[instrument(level = "trace", skip_all, fields(path = field::Empty), ret)]
7pub fn dl_invalid_handle(
8    mut ctx: FunctionEnvMut<'_, WasiEnv>,
9    handle: DlHandle,
10) -> Result<Errno, WasiError> {
11    WasiEnv::do_pending_operations(&mut ctx)?;
12
13    let (env, mut store) = ctx.data_and_store_mut();
14    let memory = unsafe { env.memory_view(&store) };
15
16    let handle = if handle == 0 {
17        // Handle zero is the main module, and never a valid side module handle
18        return Ok(Errno::Noexec);
19    } else {
20        ModuleHandle::from(handle)
21    };
22
23    let env_inner = unsafe { env.inner() };
24    let Some(linker) = env_inner.linker() else {
25        // No linker means no handles
26        return Ok(Errno::Noexec);
27    };
28
29    let is_valid = linker
30        .clone()
31        .is_handle_valid(handle, &mut ctx)
32        .unwrap_or(false);
33
34    Ok(if is_valid {
35        Errno::Success
36    } else {
37        Errno::Noexec
38    })
39}