#[test] fn os_user_runtime_native_static_elf_positive() { assert_eq!(&ELF[..4], b"\x7fELF"); assert_eq!(ELF[4], 2); // ELF64 assert_eq!(ELF[5], 1); // little endian assert_eq!(u16::from_le_bytes([ELF[18], ELF[19]]), 183); // AArch64 let program_headers = u64::from_le_bytes(ELF[32..40].try_into().unwrap()) as usize; let stride = u16::from_le_bytes([ELF[54], ELF[55]]) as usize; assert_eq!(u16::from_le_bytes([ELF[56], ELF[57]]), 2); assert_eq!(u32::from_le_bytes(ELF[program_headers + 4..program_headers + 8].try_into().unwrap()), 5); assert_eq!(u32::from_le_bytes(ELF[program_headers + stride + 4..program_headers + stride + 8].try_into().unwrap()), 6); let backend = UserBackend::new(); let before = backend.primary_inventory(); let image = unsafe { spawn::TrustedImage::from_kernel(ELF, ELF.len()) }.unwrap(); let executable = Executable::new(image, &[b"runtime", b"two"], &[], 2).unwrap(); assert_eq!(executable.required(), 2); assert_eq!(backend.primary_inventory(), before); assert_eq!(backend.runtime_hooks.borrow().acquisitions, 0); let (stack_image, start) = stack(); let startup = crt::Startup::parse(&stack_image, start).unwrap(); assert_eq!(startup.argc(), 2); assert_eq!(startup.arguments().collect::>(), vec![b"runtime".as_slice(), b"two".as_slice()]); } #[test] fn os_user_runtime_macho_and_corrupt_elf_reject_before_owner_change() { let (mut runtime, shell, child) = setup(); let before = runtime.fixture_backend().primary_inventory(); let acquisitions = runtime.fixture_backend().runtime_hooks.borrow().acquisitions; let mut corrupt = ELF.to_vec(); corrupt[0] = 0xcf; for bytes in [MACHO, corrupt.as_slice()] { let trusted = unsafe { spawn::TrustedImage::from_kernel(bytes, bytes.len()) }.unwrap(); assert!(Executable::new(trusted, &[b"runtime", b"two"], &[], 2).is_err()); assert_eq!(runtime.fixture_backend().primary_inventory(), before); assert_eq!(runtime.fixture_backend().runtime_hooks.borrow().acquisitions, acquisitions); assert_eq!(runtime.fixture_backend().record(shell).id, shell); assert_eq!(runtime.fixture_backend().record(child).id, child); } activate(&mut runtime, shell); let buffer = runtime.allocate(8, 8).unwrap(); runtime.push(&buffer, 0x51).unwrap(); assert_eq!(runtime.read(&buffer, 0), Ok(0x51)); runtime.free(buffer).ok().unwrap(); assert_eq!(runtime.fixture_backend().primary_inventory(), before); }