Skip to content

Instantly share code, notes, and snippets.

@markmentovai
Last active November 27, 2020 05:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save markmentovai/7895452de6a8a0b74541950bca792096 to your computer and use it in GitHub Desktop.
Save markmentovai/7895452de6a8a0b74541950bca792096 to your computer and use it in GitHub Desktop.
// clang++ -Wall -Werror t_impossible_sigaltstack.cc -o t_impossible_sigaltstack
#include <err.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/mman.h>
namespace {
void HandleSignal(int sig, siginfo_t* info, void* ucontext) {
struct sigaction sa;
sa.sa_handler = SIG_DFL;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(sig, &sa, nullptr) != 0) {
err(EXIT_FAILURE, "sigaction");
}
}
} // namespace
int main(int argc, char* argv[]) {
stack_t ss;
ss.ss_flags = 0;
ss.ss_size = SIGSTKSZ;
ss.ss_sp = mmap(nullptr, ss.ss_size, PROT_READ | PROT_WRITE,
MAP_ANON | MAP_PRIVATE, -1, 0);
if (!ss.ss_sp) {
err(EXIT_FAILURE, "mmap");
}
if (sigaltstack(&ss, nullptr) != 0) {
err(EXIT_FAILURE, "sigaltstack");
}
struct sigaction sa;
sa.sa_sigaction = HandleSignal;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
if (sigaction(SIGABRT, &sa, nullptr) != 0) {
err(EXIT_FAILURE, "sigaction");
}
if (mprotect(ss.ss_sp, ss.ss_size, PROT_NONE) != 0) {
err(EXIT_FAILURE, "mprotect");
}
abort();
return EXIT_SUCCESS;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment