Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

A common approach to create persistent signal handlers is to call signal() from within the handler itself, consequently , unresetting the reset signal:

...

Code Block
bgColor#ccccff
langc
/* 
 * Equivalent to signal(SIGUSR1, handler) but makes
 * signal persistent. 
 */
struct sigaction act;
act.sa_handler = handler;
act.sa_flags = 0;
if (sigemptyset(&act.sa_mask) != 0) {
  /* Handle error */
}
if (sigaction(SIGUSR1, &act, NULL) != 0) {
  /* Handle error */
}

...

With the compliant solution for UNIX, no race condition occurs that can be exploited by an attacker sending a second signal. This is because a second signal sent to the handler, before the latter calls signal(signum, SIG_DFL), will only cause the handler to restart and call signal() anyway.

...

Code Block
bgColor#ccccff
langc
/* 
 * Equivalent to signal(SIGUSR1, handler) but makes
 * signal nonpersistent .
 */
struct sigaction act;
act.sa_handler = handler;
act.sa_flags = SA_RESETHAND;
if (sigemptyset(&act.sa_mask) != 0) {
  /* Handle error */
}
if (sigaction(SIGUSR1, &act, NULL) != 0) {
  /* Handle error */
}

...

Failure to understand implementation-specific details regarding signal-handler persistence can lead to unexpected behavior.

Recommendation

Severity

Likelihood

Remediation Cost

Priority

Level

SIG01-C

lowLow

unlikelyUnlikely

lowLow

P3

L3

Automated Detection

Tool

Version

Checker

Description

Compass/ROSE

 

 

Could detect possible violations by flagging any signal handler that calls signal() to (re)assert itself as the handler for its signal

PRQA QA-C
Include Page
PRQA_V
PRQA_V
warncall for signalPartially implemented

...