Refactor Signal handling code

This commit is contained in:
EnderIce2 2024-03-20 21:29:02 +02:00
parent ce654bf710
commit 08458927ac
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD

View File

@ -498,19 +498,18 @@ namespace Tasking
int Signal::SetAction(int sig, const sigaction act) int Signal::SetAction(int sig, const sigaction act)
{ {
SmartLock(SignalLock); SmartLock(SignalLock);
if ((size_t)sig > sizeof(SignalAction) / sizeof(SignalAction[0])) int nSig = CTNif(sig);
if ((size_t)nSig > sizeof(SignalAction) / sizeof(SignalAction[0]))
return -EINVAL; return -EINVAL;
sig = CTNif(sig); SignalAction[nSig].__sa_handler.sa_handler = act.__sa_handler.sa_handler;
SignalAction[nSig].sa_mask = act.sa_mask;
SignalAction[sig].__sa_handler.sa_handler = act.__sa_handler.sa_handler; SignalAction[nSig].sa_flags = act.sa_flags;
SignalAction[sig].sa_mask = act.sa_mask;
SignalAction[sig].sa_flags = act.sa_flags;
debug("Set action for %s with handler %#lx, mask %#lx and flags %#lx", debug("Set action for %s with handler %#lx, mask %#lx and flags %#lx",
LinuxSig() ? lSigStr[sig] : sigStr[sig], LinuxSig() ? lSigStr[nSig] : sigStr[nSig],
SignalAction[sig].__sa_handler.sa_handler, SignalAction[nSig].__sa_handler.sa_handler,
SignalAction[sig].sa_mask, SignalAction[nSig].sa_mask,
SignalAction[sig].sa_flags); SignalAction[nSig].sa_flags);
return 0; return 0;
} }
@ -518,32 +517,31 @@ namespace Tasking
{ {
SmartLock(SignalLock); SmartLock(SignalLock);
if ((size_t)sig > sizeof(SignalAction) / sizeof(SignalAction[0])) int nSig = CTNif(sig);
if ((size_t)nSig > sizeof(SignalAction) / sizeof(SignalAction[0]))
return -EINVAL; return -EINVAL;
sig = CTNif(sig); act->__sa_handler.sa_handler = SignalAction[nSig].__sa_handler.sa_handler;
act->sa_mask = SignalAction[nSig].sa_mask;
act->__sa_handler.sa_handler = SignalAction[sig].__sa_handler.sa_handler; act->sa_flags = SignalAction[nSig].sa_flags;
act->sa_mask = SignalAction[sig].sa_mask;
act->sa_flags = SignalAction[sig].sa_flags;
debug("Got action for %s with handler %#lx, mask %#lx and flags %#lx", debug("Got action for %s with handler %#lx, mask %#lx and flags %#lx",
LinuxSig() ? lSigStr[sig] : sigStr[sig], LinuxSig() ? lSigStr[nSig] : sigStr[nSig],
SignalAction[sig].__sa_handler.sa_handler, SignalAction[nSig].__sa_handler.sa_handler,
SignalAction[sig].sa_mask, SignalAction[nSig].sa_mask,
SignalAction[sig].sa_flags); SignalAction[nSig].sa_flags);
return 0; return 0;
} }
int Signal::SendSignal(int sig, union sigval val) int Signal::SendSignal(int sig, union sigval val)
{ {
PCB *pcb = (PCB *)ctx; PCB *pcb = (PCB *)ctx;
sig = CTNif(sig); int nSig = CTNif(sig);
LastSignal = (Signals)sig; LastSignal = (Signals)nSig;
debug("Sending signal %s to %s(%d)", debug("Sending signal %s to %s(%d)",
sigStr[sig], pcb->Name, pcb->ID); sigStr[nSig], pcb->Name, pcb->ID);
if (SignalAction[sig].__sa_handler.sa_handler) if (SignalAction[nSig].__sa_handler.sa_handler)
{ {
if (pcb->Security.ExecutionMode == Kernel) if (pcb->Security.ExecutionMode == Kernel)
{ {
@ -552,24 +550,24 @@ namespace Tasking
} }
debug("sa_handler: %#lx", debug("sa_handler: %#lx",
SignalAction[sig].__sa_handler.sa_handler); SignalAction[nSig].__sa_handler.sa_handler);
debug("Adding signal %s to queue", sigStr[sig]); debug("Adding signal %s to queue", sigStr[nSig]);
goto CompleteSignal; goto CompleteSignal;
} }
debug("Signal disposition: %s", dispStr[sigDisp[sig]]); debug("Signal disposition: %s", dispStr[sigDisp[nSig]]);
switch (sigDisp[sig]) switch (sigDisp[nSig])
{ {
case SIG_TERM: case SIG_TERM:
{ {
if (unlikely(pcb->Security.IsCritical)) if (unlikely(pcb->Security.IsCritical))
{ {
debug("Critical process %s received signal %s(%d): Terminated", debug("Critical process %s received signal %s(%d): Terminated",
pcb->Name, sigStr[sig], sig); pcb->Name, sigStr[nSig], nSig);
// int3; // int3;
} }
pcb->SetExitCode(MakeExitCode(sig)); pcb->SetExitCode(MakeExitCode(nSig));
debug("We have %d watchers", this->Watchers.size()); debug("We have %d watchers", this->Watchers.size());
if (this->Watchers.size() > 0) if (this->Watchers.size() > 0)
pcb->SetState(Zombie); pcb->SetState(Zombie);
@ -579,7 +577,7 @@ namespace Tasking
} }
case SIG_IGN: case SIG_IGN:
{ {
debug("Ignoring signal %d", sig); debug("Ignoring signal %d", nSig);
return 0; return 0;
} }
case SIG_CORE: case SIG_CORE:
@ -589,11 +587,11 @@ namespace Tasking
if (unlikely(pcb->Security.IsCritical)) if (unlikely(pcb->Security.IsCritical))
{ {
debug("Critical process %s received signal %s(%d): Core dumped", debug("Critical process %s received signal %s(%d): Core dumped",
pcb->Name, sigStr[sig], sig); pcb->Name, sigStr[nSig], nSig);
// int3; // int3;
} }
pcb->SetExitCode(MakeExitCode(sig)); pcb->SetExitCode(MakeExitCode(nSig));
debug("We have %d watchers", this->Watchers.size()); debug("We have %d watchers", this->Watchers.size());
if (this->Watchers.size() > 0) if (this->Watchers.size() > 0)
pcb->SetState(CoreDump); pcb->SetState(CoreDump);
@ -620,14 +618,14 @@ namespace Tasking
if (pcb->Security.ExecutionMode == Kernel) if (pcb->Security.ExecutionMode == Kernel)
{ {
debug("Kernel process %s received signal %s(%d)! Ignoring... (with exceptions)", debug("Kernel process %s received signal %s(%d)! Ignoring... (with exceptions)",
pcb->Name, sigStr[sig], sig); pcb->Name, sigStr[nSig], nSig);
return 0; return 0;
} }
this->InitTrampoline(); this->InitTrampoline();
debug("Signal %s(%d) completed", sigStr[sig], sig); debug("Signal %s(%d) completed", sigStr[nSig], nSig);
if (sigDisp[sig] != SIG_IGN) if (sigDisp[nSig] != SIG_IGN)
{ {
foreach (auto info in Watchers) foreach (auto info in Watchers)
{ {
@ -641,7 +639,7 @@ namespace Tasking
} }
debug("Adding signal to queue"); debug("Adding signal to queue");
SignalQueue.push_back({.sig = sig, .val = val}); SignalQueue.push_back({.sig = nSig, .val = val});
return 0; return 0;
} }