Noux: check ELF signature on 'execve()'

Issue #2687
This commit is contained in:
Christian Prochaska 2018-02-23 13:29:32 +01:00 committed by Christian Helmuth
parent ecff980761
commit 7ac9a16090
3 changed files with 16 additions and 1 deletions

View File

@ -319,7 +319,9 @@ struct Noux::Sysio
SYMLINK_ERR_NO_SPACE, SYMLINK_ERR_NO_PERM,
SYMLINK_ERR_NAME_TOO_LONG };
enum Execve_error { EXECVE_NONEXISTENT = Vfs::Directory_service::NUM_GENERAL_ERRORS, EXECVE_NOMEM };
enum Execve_error { EXECVE_NONEXISTENT = Vfs::Directory_service::NUM_GENERAL_ERRORS,
EXECVE_NOMEM,
EXECVE_NOEXEC };
enum Fork_error { FORK_NOMEM = Vfs::Directory_service::NUM_GENERAL_ERRORS };
enum Select_error { SELECT_ERR_INTERRUPT };

View File

@ -1101,6 +1101,7 @@ namespace {
switch (sysio()->error.execve) {
case Noux::Sysio::EXECVE_NONEXISTENT: errno = ENOENT; break;
case Noux::Sysio::EXECVE_NOMEM: errno = ENOMEM; break;
case Noux::Sysio::EXECVE_NOEXEC: errno = ENOEXEC; break;
}
return -1;
}

View File

@ -296,6 +296,18 @@ bool Noux::Child::syscall(Noux::Session::Syscall sc)
break;
}
{
Attached_dataspace attached_binary_ds(_env.rm(), binary_ds->ds);
char const *binary_addr = attached_binary_ds.local_addr<char const>();
if ((binary_addr[0] != 0x7f) ||
(binary_addr[1] != 'E') ||
(binary_addr[2] != 'L') ||
(binary_addr[3] != 'F')) {
_sysio.error.execve = Sysio::EXECVE_NOEXEC;
break;
}
}
binary_ds.destruct();
try {