1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-22 13:34:15 +03:00

s3: signals are processed twice in child.

Signed-off-by: Bo Yang <boyang@samba.org>
This commit is contained in:
Bo Yang 2010-02-09 17:02:20 +08:00
parent 2aff1d6bca
commit 8c8bb51de1
3 changed files with 36 additions and 5 deletions

View File

@ -176,6 +176,13 @@ int tevent_common_context_destructor(struct tevent_context *ev)
sn = se->next;
se->event_ctx = NULL;
DLIST_REMOVE(ev->signal_events, se);
/*
* This is important, Otherwise signals
* are handled twice in child. eg, SIGHUP.
* one added in parent, and another one in
* the child. -- BoYang
*/
tevent_cleanup_pending_signal_handlers(se);
}
return 0;

View File

@ -299,6 +299,7 @@ struct tevent_signal *tevent_common_add_signal(struct tevent_context *ev,
const char *handler_name,
const char *location);
int tevent_common_check_signal(struct tevent_context *ev);
void tevent_cleanup_pending_signal_handlers(struct tevent_signal *se);
bool tevent_standard_init(void);
bool tevent_select_init(void);

View File

@ -133,7 +133,9 @@ static void tevent_common_signal_handler_info(int signum, siginfo_t *info,
static int tevent_common_signal_list_destructor(struct tevent_common_signal_list *sl)
{
DLIST_REMOVE(sig_state->sig_handlers[sl->se->signum], sl);
if (sig_state->sig_handlers[sl->se->signum]) {
DLIST_REMOVE(sig_state->sig_handlers[sl->se->signum], sl);
}
return 0;
}
@ -154,12 +156,16 @@ static int tevent_signal_destructor(struct tevent_signal *se)
if (sig_state->sig_handlers[se->signum] == NULL) {
/* restore old handler, if any */
sigaction(se->signum, sig_state->oldact[se->signum], NULL);
sig_state->oldact[se->signum] = NULL;
if (sig_state->oldact[se->signum]) {
sigaction(se->signum, sig_state->oldact[se->signum], NULL);
sig_state->oldact[se->signum] = NULL;
}
#ifdef SA_SIGINFO
if (se->sa_flags & SA_SIGINFO) {
talloc_free(sig_state->sig_info[se->signum]);
sig_state->sig_info[se->signum] = NULL;
if (sig_state->sig_info[se->signum]) {
talloc_free(sig_state->sig_info[se->signum]);
sig_state->sig_info[se->signum] = NULL;
}
}
#endif
}
@ -398,3 +404,20 @@ int tevent_common_check_signal(struct tevent_context *ev)
return 1;
}
void tevent_cleanup_pending_signal_handlers(struct tevent_signal *se)
{
struct tevent_common_signal_list *sl;
sl = talloc_get_type(se->additional_data,
struct tevent_common_signal_list);
tevent_common_signal_list_destructor(sl);
if (sig_state->sig_handlers[se->signum] == NULL) {
if (sig_state->oldact[se->signum]) {
sigaction(se->signum, sig_state->oldact[se->signum], NULL);
sig_state->oldact[se->signum] = NULL;
}
}
return;
}