Пример #1
0
static void
die (int signo)
{
  char const *message =
    signo ? program_error_message : stack_overflow_message;
  segv_action (signo);
  write (STDERR_FILENO, program_name, strlen (program_name));
  write (STDERR_FILENO, ": ", 2);
  write (STDERR_FILENO, message, strlen (message));
  write (STDERR_FILENO, "\n", 1);
  if (! signo)
    _exit (exit_failure);
  kill (getpid (), signo);
  abort ();
}
Пример #2
0
static void
die (int signo)
{
  char const *message;
  segv_action (signo);
  message = signo ? program_error_message : stack_overflow_message;
  ignore_value (write (STDERR_FILENO, program_name, strlen (program_name)));
  ignore_value (write (STDERR_FILENO, ": ", 2));
  ignore_value (write (STDERR_FILENO, message, strlen (message)));
  ignore_value (write (STDERR_FILENO, "\n", 1));
  if (! signo)
    _exit (exit_failure);
  raise (signo);
  abort ();
}
Пример #3
0
static void
die (int signo)
{
  char const *message;
#if !SIGINFO_WORKS && !HAVE_LIBSIGSEGV
  /* We can't easily determine whether it is a stack overflow; so
     assume that the rest of our program is perfect (!) and that
     this segmentation violation is a stack overflow.  */
  signo = 0;
#endif /* !SIGINFO_WORKS && !HAVE_LIBSIGSEGV */
  segv_action (signo);
  message = signo ? program_error_message : stack_overflow_message;
  ignore_value (write (STDERR_FILENO, program_name, strlen (program_name)));
  ignore_value (write (STDERR_FILENO, ": ", 2));
  ignore_value (write (STDERR_FILENO, message, strlen (message)));
  ignore_value (write (STDERR_FILENO, "\n", 1));
  if (! signo)
    _exit (exit_failure);
  raise (signo);
  abort ();
}
Пример #4
0
static void
segv_handler (int signo, siginfo_t *info, void *context)
{
  /* Clear SIGNO if it seems to have been a stack overflow.  */
  if (0 < info->si_code)
    {
      /* If the faulting address is within the stack, or within one
	 page of the stack end, assume that it is a stack
	 overflow.  */
      ucontext_t const *user_context = context;
      char const *stack_min = user_context->uc_stack.ss_sp;
      size_t stack_size = user_context->uc_stack.ss_size;
      char const *faulting_address = info->si_addr;
      size_t s = faulting_address - stack_min;
      size_t page_size = sysconf (_SC_PAGESIZE);
      if (find_stack_direction (0) < 0)
	s += page_size;
      if (s < stack_size + page_size)
	signo = 0;
    }

  segv_action (signo, info, context);
}