Blame SOURCES/bz1422573_2-dont-override-user-signals.patch

fe522a
commit c751993c901805cc5cd02622c8672bbc7f8d6849
fe522a
Author: Christine Caulfield <ccaulfie@redhat.com>
fe522a
Date:   Fri Feb 24 16:23:43 2017 +0000
fe522a
fe522a
    loop: don't override external signal handlers
fe522a
    
fe522a
    qb_loop_signal_add() used to set any signals it wasn't managing
fe522a
    back to SIG_DFL. This is unfriendly behaviour in a library.
fe522a
    
fe522a
    Signed-off-by: Christine Caulfield <ccaulfie@redhat.com>
fe522a
    Reviewed-by: Jan Pokorný <jpokorny@redhat.com>
fe522a
fe522a
diff --git a/lib/loop_poll.c b/lib/loop_poll.c
fe522a
index 5c75748..386cae6 100644
fe522a
--- a/lib/loop_poll.c
fe522a
+++ b/lib/loop_poll.c
fe522a
@@ -643,8 +643,6 @@ _adjust_sigactions_(struct qb_signal_source *s)
fe522a
 		if (needed) {
fe522a
 			sigaddset(&s->signal_superset, i);
fe522a
 			sigaction(i, &sa, NULL);
fe522a
-		} else {
fe522a
-			(void)signal(i, SIG_DFL);
fe522a
 		}
fe522a
 	}
fe522a
 }
fe522a
@@ -775,6 +773,7 @@ qb_loop_signal_del(qb_loop_t * lp, qb_loop_signal_handle handle)
fe522a
 	}
fe522a
 
fe522a
 	qb_list_del(&sig->item.list);
fe522a
+	signal(sig->signal, SIG_DFL);
fe522a
 	free(sig);
fe522a
 	_adjust_sigactions_(s);
fe522a
 	return 0;
fe522a
diff --git a/tests/check_loop.c b/tests/check_loop.c
fe522a
index ff7f10a..0be5c21 100644
fe522a
--- a/tests/check_loop.c
fe522a
+++ b/tests/check_loop.c
fe522a
@@ -605,6 +605,36 @@ START_TEST(test_loop_sig_handling)
fe522a
 }
fe522a
 END_TEST
fe522a
 
fe522a
+/* Globals for this test only */
fe522a
+static int our_signal_called = 0;
fe522a
+static qb_loop_t *this_l;
fe522a
+static void handle_nonqb_signal(int num)
fe522a
+{
fe522a
+	our_signal_called = 1;
fe522a
+	qb_loop_job_add(this_l, QB_LOOP_LOW, NULL, job_stop);
fe522a
+}
fe522a
+
fe522a
+START_TEST(test_loop_dont_override_other_signals)
fe522a
+{
fe522a
+	qb_loop_signal_handle handle;
fe522a
+
fe522a
+	this_l = qb_loop_create();
fe522a
+	fail_if(this_l == NULL);
fe522a
+
fe522a
+	signal(SIGUSR1, handle_nonqb_signal);
fe522a
+
fe522a
+	qb_loop_signal_add(this_l, QB_LOOP_HIGH, SIGINT,
fe522a
+			   this_l, sig_handler, &handle);
fe522a
+	kill(getpid(), SIGUSR1);
fe522a
+	qb_loop_run(this_l);
fe522a
+
fe522a
+	ck_assert_int_eq(our_signal_called, 1);
fe522a
+
fe522a
+	qb_loop_destroy(this_l);
fe522a
+}
fe522a
+END_TEST
fe522a
+
fe522a
+
fe522a
 START_TEST(test_loop_sig_only_get_one)
fe522a
 {
fe522a
 	int res;
fe522a
@@ -706,6 +736,7 @@ loop_signal_suite(void)
fe522a
 	add_tcase(s, tc, test_loop_sig_handling, 10);
fe522a
 	add_tcase(s, tc, test_loop_sig_only_get_one);
fe522a
 	add_tcase(s, tc, test_loop_sig_delete);
fe522a
+	add_tcase(s, tc, test_loop_dont_override_other_signals);
fe522a
 
fe522a
 	return s;
fe522a
 }