Versions Compared

Key

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

...

This program has two potential problems. The first is that the free() function is not asynchronous-safe and its invocation from within a signal handler is a violation of this rule. If an interrupt signal is received during the free() call in main(), the heap may be corrupted.

Wiki Markup
The second problem is if {{SIGINT}} occurs after the call to {{free()}}, resulting in the memory referenced by {{foo()}} being freed twice.  This is a violation of \[[MEM31-C. Free dynamically allocated memory exactly once]\] and also \[[SIG31-C. Do not access or modify shared objects in signal handlers]\].

The _Exit() function called from within the int_handler() signal handler causes immediate program termination, and is asynchronous-safe, whereas exit() may call cleanup routines first, and is consequently not asynchronous-safe.

...

All functions not in the this table are considered to be unsafe with respect to signals. In the presence of signals, all functions defined by IEEE Std 1003.1-2001 behave as defined when called from or interrupted by a signal-catching function, with a single exception: when a signal interrupts an unsafe function and the signal-catching function calls an unsafe function, the behavior is undefined.

Wiki Markup
Note that while {{raise()}} is on the list of asynchronous-safe functions, it is specifically covered by \[[SIG33-C. Do not recursively invoke the raise() function]\].

OpenBSD

The OpenBSD signal() man page identifies functions that are asynchronous-signal safe. Applications may consequently invoke them, without restriction, from signal-catching functions.

...

Wiki Markup
\[[Dowd 06|AA. C References#Dowd 06]\] Chapter 13, "Synchronization and State"
\[[ISO/IEC 03|AA. C References#ISO/IEC 03]\] Section 5.2.3, "Signals and interrupts"
\[[ISO/IEC 9899-1999|AA. C References#ISO/IEC 9899-1999]\] Section 7.14, "Signal handling <signal.h>"
\[[Open Group 04|AA. C References#Open Group 04]\] [longjmp|http://www.opengroup.org/onlinepubs/000095399/functions/longjmp.html]
\[[OpenBSD]AA. C References#OpenBSD\] [{{signal()}} Man Page|http://www.openbsd.org/cgi-bin/man.cgi?query=signal]
\[[Zalewski 01|AA. C References#Zalewski 01]\]

...