[pacman-dev] [PATCH 11/11] remove soft interrupt handler before cleanup

Andrew Gregory andrew.gregory.8 at gmail.com
Fri Dec 4 20:31:42 UTC 2015


The soft interrupt handler dereferences config, causing a segfault if
it is called during cleanup.

Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>
---
 src/pacman/pacman.c     |  1 +
 src/pacman/sighandler.c | 10 ++++++++++
 src/pacman/sighandler.h |  1 +
 3 files changed, 12 insertions(+)

diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index 4237b4d..2380bd1 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -279,6 +279,7 @@ static void setuseragent(void)
  */
 static void cleanup(int ret)
 {
+	remove_soft_interrupt_handler();
 	if(config) {
 		/* free alpm library resources */
 		if(config->handle && alpm_release(config->handle) == -1) {
diff --git a/src/pacman/sighandler.c b/src/pacman/sighandler.c
index e88375a..3f18b5c 100644
--- a/src/pacman/sighandler.c
+++ b/src/pacman/sighandler.c
@@ -74,6 +74,16 @@ void install_soft_interrupt_handler(void)
 	sigaction(SIGHUP, &new_action, NULL);
 }
 
+void remove_soft_interrupt_handler(void)
+{
+	struct sigaction new_action;
+	sigemptyset(&new_action.sa_mask);
+	new_action.sa_handler = SIG_DFL;
+	new_action.sa_flags = 0;
+	sigaction(SIGINT, &new_action, NULL);
+	sigaction(SIGHUP, &new_action, NULL);
+}
+
 static void segv_handler(int signum)
 {
 	const char msg[] = "\nerror: segmentation fault\n"
diff --git a/src/pacman/sighandler.h b/src/pacman/sighandler.h
index 51f347b..b963357 100644
--- a/src/pacman/sighandler.h
+++ b/src/pacman/sighandler.h
@@ -23,6 +23,7 @@
 void install_segv_handler(void);
 void install_winch_handler(void);
 void install_soft_interrupt_handler(void);
+void remove_soft_interrupt_handler(void);
 
 #endif /* _PM_SIGHANDLER_H */
 
-- 
2.6.3


More information about the pacman-dev mailing list