Versions Compared

Key

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

...

This non-complaint code example fails to persist the signal handler on Windows platforms.

Code Block
bgColor#FFCCCC
#include <stdio.h>
#include <signal.h>

volatile sig_atomic_t e_flag = 0;

void handler(int signum) {
  e_flag = 1;
}

int main(void) {
  signal(SIGINT, handler);
  while(!e_flag) {}
  puts("Escaped from first while()");
  e_flag = 0;
  while(!e_flag) {}
  puts("Escaped from second while()");
  return 0;
}

...

Code Block
% ./SIG01-A
^C
Escaped from first while()
^C
Escaped from second while()
%

When However, when compiled with Microsoft Visual Studio 2005 version 8.0 and executed under Windows the signal handler is not automatically reinstalled.

...

The second interrupt executes the default action for SIGINT, which is to terminate program execution.

...

Compliant Solution (Windows)

A C99-compliant solution to persist the handler on a Windows system is to rebind the signal to the handler in the first line of the handler itself.

Code Block
void handler(int signum) {
  signal(signum, handler);
  /* rest of handling code */
}

Risk Analysis

Failure to re-establish a persistent signal handler on Windows platforms can lead to unexpected behavior.

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

SIG01-A

1 (high)

1 (likely)

3 (low)

P3

L3

References

Wiki Markup
\[[ISO/IEC 9899-1999TR2|AA. C References#ISO/IEC 9899-1999]\] "The {{signal}} function"