...
Code Block | ||
---|---|---|
| ||
#include <signal.h>
char *foo;
void int_handler() {
free(foo);
_Exit(0);
}
int main(void) {
foo = (char *)malloc(sizeof("Hello World."));
if (foo == NULL) {
/* handle error condition */
}
signal(SIGINT, int_handler);
strcpy(foo, "Hello World.");
puts(foo);
free(foo);
/* ... */
return 0;
}
|
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.
...
The OpenBSD signal()
man page also says:
Code Block |
---|
A few other functions are signal race safe in OpenBSD but
probably not on other systems:
snprintf() Safe.
vsnprintf() Safe.
syslog_r() Safe if the syslog_data struct is initialized
as a local variable.
|
...