e start - make e exit with parent when possible

also clean up some formatting
This commit is contained in:
Carsten Haitzler 2021-11-11 13:22:49 +00:00
parent 422b757080
commit 86dd52026a
1 changed files with 32 additions and 33 deletions

View File

@ -9,6 +9,11 @@
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/utsname.h> #include <sys/utsname.h>
#ifdef HAVE_PRCTL
# include <sys/prctl.h>
#elif defined(HAVE_PROCCTL)
# include <sys/procctl.h>
#endif
/* the ptrace interface used here is really linux specific - /* the ptrace interface used here is really linux specific -
* FreeBSD, NetBSD and Mac OS X use slightly different ptrace API that should * FreeBSD, NetBSD and Mac OS X use slightly different ptrace API that should
@ -126,8 +131,7 @@ prefix_determine(char *argv0)
static void static void
copy_args(char **dst, char **src, size_t count) copy_args(char **dst, char **src, size_t count)
{ {
for (; count > 0; count--, dst++, src++) for (; count > 0; count--, dst++, src++) *dst = *src;
*dst = *src;
} }
static void static void
@ -212,7 +216,7 @@ _sigusr1(int x EINA_UNUSED, siginfo_t *info EINA_UNUSED, void *data EINA_UNUSED)
{ {
struct sigaction action; struct sigaction action;
/* release ptrace */ // release ptrace
stop_ptrace = EINA_TRUE; stop_ptrace = EINA_TRUE;
action.sa_sigaction = _sigusr1; action.sa_sigaction = _sigusr1;
@ -252,7 +256,7 @@ _print_usage(const char *hstr)
{ {
printf("Please run:\n" printf("Please run:\n"
"\tenlightenment %s\n" "\tenlightenment %s\n"
"for more options.\n", "\tfor more options.\n",
hstr); hstr);
exit(0); exit(0);
} }
@ -260,10 +264,10 @@ _print_usage(const char *hstr)
static Eina_Bool static Eina_Bool
_sig_continue(siginfo_t sig) _sig_continue(siginfo_t sig)
{ {
return (sig.si_signo != SIGSEGV && return ((sig.si_signo != SIGSEGV) &&
sig.si_signo != SIGFPE && (sig.si_signo != SIGFPE) &&
// sig.si_signo != SIGBUS && // (sig.si_signo != SIGBUS) &&
sig.si_signo != SIGABRT); (sig.si_signo != SIGABRT));
} }
static void static void
@ -273,8 +277,7 @@ _sig_remember(siginfo_t sig, Eina_Bool *susr1, Eina_Bool *sill)
{ {
if (*sill) *susr1 = EINA_TRUE; if (*sill) *susr1 = EINA_TRUE;
} }
else else *sill = (sig.si_signo == SIGILL);
*sill = (sig.si_signo == SIGILL);
} }
static int static int
@ -283,14 +286,12 @@ _e_ptrace_attach(int child, int *status, Eina_Bool really_know)
int result = 0; int result = 0;
#ifdef HAVE_SYS_PTRACE_H #ifdef HAVE_SYS_PTRACE_H
if (really_know) if (really_know) return waitpid(child, status, 0);
return waitpid(child, status, 0);
ptrace(PT_ATTACH, child, NULL, 0); ptrace(PT_ATTACH, child, NULL, 0);
result = waitpid(child, status, 0); result = waitpid(child, status, 0);
if (!stop_ptrace && WIFSTOPPED(*status)) if (!stop_ptrace && WIFSTOPPED(*status)) ptrace(PT_CONTINUE, child, NULL, 0);
ptrace(PT_CONTINUE, child, NULL, 0);
#else #else
(void)child; (void)child;
(void)really_know; (void)really_know;
@ -304,8 +305,7 @@ static void
_e_ptrace_detach(int child, int back, Eina_Bool really_know) _e_ptrace_detach(int child, int back, Eina_Bool really_know)
{ {
#ifdef HAVE_SYS_PTRACE_H #ifdef HAVE_SYS_PTRACE_H
if (!really_know) if (!really_know) ptrace(PT_DETACH, child, NULL, back);
ptrace(PT_DETACH, child, NULL, back);
#else #else
(void)child; (void)child;
(void)back; (void)back;
@ -317,8 +317,7 @@ static void
_e_ptrace_traceme(Eina_Bool really_know) _e_ptrace_traceme(Eina_Bool really_know)
{ {
#ifdef HAVE_SYS_PTRACE_H #ifdef HAVE_SYS_PTRACE_H
if (!really_know) if (!really_know) ptrace(PT_TRACE_ME, 0, NULL, 0);
ptrace(PT_TRACE_ME, 0, NULL, 0);
#else #else
(void)really_know; (void)really_know;
#endif #endif
@ -329,8 +328,7 @@ _e_ptrace_getsiginfo(int child, siginfo_t *sig, Eina_Bool really_know)
{ {
memset(sig, 0, sizeof(siginfo_t)); memset(sig, 0, sizeof(siginfo_t));
#ifdef HAVE_SYS_PTRACE_H #ifdef HAVE_SYS_PTRACE_H
if (!really_know) if (!really_know) return ptrace(PT_GETSIGINFO, child, NULL, sig);
return ptrace(PT_GETSIGINFO, child, NULL, sig);
#else #else
(void)child; (void)child;
(void)sig; (void)sig;
@ -343,8 +341,7 @@ static void
_e_ptrace_continue(int child, int back, Eina_Bool really_know) _e_ptrace_continue(int child, int back, Eina_Bool really_know)
{ {
#ifdef HAVE_SYS_PTRACE_H #ifdef HAVE_SYS_PTRACE_H
if (!really_know) if (!really_know) ptrace(PT_CONTINUE, child, NULL, back);
ptrace(PT_CONTINUE, child, NULL, back);
#else #else
(void)child; (void)child;
(void)back; (void)back;
@ -355,6 +352,13 @@ _e_ptrace_continue(int child, int back, Eina_Bool really_know)
static int static int
_e_start_child(char **args, Eina_Bool really_know) _e_start_child(char **args, Eina_Bool really_know)
{ {
#ifdef HAVE_PRCTL
prctl(PR_SET_PDEATHSIG, SIGTERM);
#elif defined(HAVE_PROCCTL)
int sig = SIGTERM;
procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &sig);
#endif
_e_ptrace_traceme(really_know); _e_ptrace_traceme(really_know);
execv(args[0], args); execv(args[0], args);
// We failed, 0 means normal exit from E with no restart or crash so // We failed, 0 means normal exit from E with no restart or crash so
@ -363,7 +367,7 @@ _e_start_child(char **args, Eina_Bool really_know)
} }
static Eina_Bool static Eina_Bool
_e_ptrace_kernel_check() _e_ptrace_kernel_check(void)
{ {
#ifdef __linux__ #ifdef __linux__
// Check if patch to prevent ptrace to another process is present // Check if patch to prevent ptrace to another process is present
@ -373,7 +377,7 @@ _e_ptrace_kernel_check()
if (fd != -1) if (fd != -1)
{ {
char c; char c;
ret = (read(fd, &c, sizeof (c)) == sizeof (c) && c != '0'); ret = read(fd, &c, (sizeof(c)) == sizeof(c)) && (c != '0');
close(fd); close(fd);
} }
return ret; return ret;
@ -400,13 +404,8 @@ _e_call_gdb(int child, const char *home, char **backtrace_str)
home); home);
r = system(buf); r = system(buf);
fprintf(stderr, "called gdb with '%s' = %i\n", fprintf(stderr, "called gdb with '%s' = %i\n", buf, WEXITSTATUS(r));
buf, WEXITSTATUS(r)); myasprintf(&buf, "%s/.e-crashdump.txt", home);
myasprintf(&buf,
"%s/.e-crashdump.txt",
home);
*backtrace_str = strdup(buf); *backtrace_str = strdup(buf);
return WEXITSTATUS(r); return WEXITSTATUS(r);
} }
@ -633,12 +632,12 @@ not_done:
int r = _e_ptrace_getsiginfo(child, &sig, int r = _e_ptrace_getsiginfo(child, &sig,
really_know); really_know);
back = (r == 0 && sig.si_signo != SIGTRAP) back = ((r == 0) && (sig.si_signo != SIGTRAP))
? sig.si_signo : 0; ? sig.si_signo : 0;
_sig_remember(sig, &remember_sigusr1, &remember_sigill); _sig_remember(sig, &remember_sigusr1, &remember_sigill);
if (r != 0 || _sig_continue(sig)) if ((r != 0) || (_sig_continue(sig)))
{ {
_e_ptrace_continue(child, back, really_know); _e_ptrace_continue(child, back, really_know);
goto not_done; goto not_done;