krait_signal_handler.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #if defined(__ANDROID__)
  2. #include <signal.h>
  3. #define SIGMAX 64
  4. static void (*wrapped_signal_handlers[SIGMAX]) (int, siginfo_t *, void *);
  5. static void signal_handler(int signum, siginfo_t* siginfo, void* sigcontext)
  6. {
  7. if (wrapped_signal_handlers[signum])
  8. wrapped_signal_handlers[signum](signum, siginfo, sigcontext);
  9. }
  10. extern int __real_sigaction(int signum, const struct sigaction *action, struct sigaction *old_action);
  11. __attribute__((used)) int __wrap_sigaction(int signum, const struct sigaction *action, struct sigaction *old_action)
  12. {
  13. struct sigaction wrapper_action_data;
  14. struct sigaction* wrapper_action = NULL;
  15. if (signum >= SIGMAX)
  16. return __real_sigaction(signum, action, old_action);
  17. // patch sig action with our thumb compiled dispatcher
  18. if (action)
  19. {
  20. wrapper_action = &wrapper_action_data;
  21. memcpy(wrapper_action, action, sizeof(*action));
  22. wrapper_action->sa_sigaction = signal_handler;
  23. }
  24. // install handler (abort on error)
  25. if (__real_sigaction(signum, wrapper_action, old_action) == -1)
  26. return -1;
  27. // hide any previously installed wrapper
  28. if (old_action && old_action->sa_sigaction == signal_handler)
  29. old_action->sa_sigaction = wrapped_signal_handlers[signum];
  30. // add action to dispatch table
  31. if (action)
  32. wrapped_signal_handlers[signum] = action->sa_sigaction;
  33. return 0;
  34. }
  35. #undef SIGMAX
  36. #endif /* __ANDROID__ */