From 42f212e6787a0f63a8c01099852e45e4db032d33 Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jeremy@system76.com> Date: Sun, 27 Jan 2019 15:53:09 -0700 Subject: [PATCH] Verify current system before continuing. --- src/platform/linux/mod.rs | 5 +++++ src/platform/pal/mod.rs | 2 ++ src/platform/redox/mod.rs | 5 +++++ src/start.rs | 15 ++++++++++++++- 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index d9611da1..e28970d2 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -435,4 +435,9 @@ impl Pal for Sys { fn write(fildes: c_int, buf: &[u8]) -> ssize_t { e(unsafe { syscall!(WRITE, fildes, buf.as_ptr(), buf.len()) }) as ssize_t } + + fn verify() -> bool { + // GETPID on Linux is 39, which does not exist on Redox + e(unsafe { sc::syscall5(sc::nr::GETPID, !0, !0, !0, !0, !0) }) != !0 + } } diff --git a/src/platform/pal/mod.rs b/src/platform/pal/mod.rs index 211b9554..042d7c82 100644 --- a/src/platform/pal/mod.rs +++ b/src/platform/pal/mod.rs @@ -155,4 +155,6 @@ pub trait Pal { fn waitpid(pid: pid_t, stat_loc: *mut c_int, options: c_int) -> pid_t; fn write(fildes: c_int, buf: &[u8]) -> ssize_t; + + fn verify() -> bool; } diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 86f2396a..eb3abed1 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -1164,4 +1164,9 @@ impl Pal for Sys { fn write(fd: c_int, buf: &[u8]) -> ssize_t { e(syscall::write(fd as usize, buf)) as ssize_t } + + fn verify() -> bool { + // GETPID on Redox is 20, which is WRITEV on Linux + e(unsafe { syscall::syscall5(syscall::number::SYS_GETPID, !0, !0, !0, !0, !0) }) != !0 + } } diff --git a/src/start.rs b/src/start.rs index 884e67a7..79c22d8e 100644 --- a/src/start.rs +++ b/src/start.rs @@ -1,8 +1,9 @@ use alloc::vec::Vec; -use core::ptr; +use core::{intrinsics, ptr}; use header::{stdio, stdlib}; use platform; +use platform::{Pal, Sys}; use platform::types::*; #[repr(C)] @@ -44,6 +45,15 @@ unsafe fn copy_string_array(array: *const *const c_char, len: usize) -> Vec<*mut vec } +// Since Redox and Linux are so similar, it is easy to accidentally run a binary from one on the +// other. This will test that the current system is compatible with the current binary +#[no_mangle] +pub unsafe fn relibc_verify_host() { + if ! Sys::verify() { + intrinsics::abort(); + } +} + #[inline(never)] #[no_mangle] pub unsafe extern "C" fn relibc_start(sp: &'static Stack) -> ! { @@ -58,6 +68,9 @@ pub unsafe extern "C" fn relibc_start(sp: &'static Stack) -> ! { fn main(argc: isize, argv: *mut *mut c_char, envp: *mut *mut c_char) -> c_int; } + // Ensure correct host system before executing more system calls + relibc_verify_host(); + // Set up argc and argv let argc = sp.argc(); let argv = sp.argv(); -- GitLab