threads/75374: pthread_kill() ignores SA_SIGINFO flag

Archie Cobbs archie at FreeBSD.org
Tue Dec 21 14:20:18 PST 2004


>Number:         75374
>Category:       threads
>Synopsis:       pthread_kill() ignores SA_SIGINFO flag
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-threads
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Dec 21 22:20:17 GMT 2004
>Closed-Date:
>Last-Modified:
>Originator:     Archie Cobbs
>Release:        FreeBSD 5.3-STABLE alpha
>Organization:
Packet Design
>Environment:
System: FreeBSD beast.freebsd.org 5.3-STABLE FreeBSD 5.3-STABLE #527: Tue Dec 21 15:02:03 UTC 2004 root at beast.freebsd.org:/usr/src/sys/alpha/compile/BEAST alpha

Also happens on FreeBSD 4.10.

>Description:
	When a signal handler is set with the SA_SIGINFO flag,
	the signal is supposed to be delivered with extra information
	including the siginfo_t and ucontext_t structures.

	pthread_kill() seems to ignore this flag, at least when
	sending the signal to oneself.

>How-To-Repeat:

/*
 * Note that the program below prints "info=0x0 ctx=0x0" which shows that
 * no SA_SIGINFO context is being passed
 *
 * Compile: cc -Wall -o bug bug.c -pthread
 */

#include <err.h>
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void
handler(int sig, siginfo_t *info, void *ctx)
{
        printf("info=%p ctx=%p\n", info, ctx);
}

static void *
entry(void *arg)
{
	pthread_kill(pthread_self(), SIGSEGV);
	return NULL;
}

int
main(int ac, char **av)
{
	struct sigaction sa;
	pthread_t tid;

	memset(&sa, 0, sizeof(sa));
	sigemptyset(&sa.sa_mask);
	sigaddset(&sa.sa_mask, SIGSEGV);
	sa.sa_flags = SA_SIGINFO | SA_NODEFER;
	sa.sa_sigaction = handler;
	if (sigaction(SIGSEGV, &sa, NULL) == -1)
		err(1, "sigaction");
	if ((errno = pthread_create(&tid, NULL, entry, NULL)) != 0)
		err(1, "pthread_create");
	if ((errno = pthread_join(tid, NULL)) != 0)
		err(1, "pthread_join");
	return 0;
}

>Fix:

Unknown.

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-threads mailing list