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:
parent
2aff1d6bca
commit
8c8bb51de1
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user