summaryrefslogtreecommitdiffstats
path: root/text-utils/more.c
diff options
context:
space:
mode:
authorKarel Zak2016-12-15 14:40:26 +0100
committerKarel Zak2016-12-15 14:40:26 +0100
commit0ed2a954714992938b35893b70197090a61b3b2e (patch)
treeacca5ca94fbeeebc1712ebbe0244eefdffcac76f /text-utils/more.c
parenttests: add missing file (diff)
downloadkernel-qcow2-util-linux-0ed2a954714992938b35893b70197090a61b3b2e.tar.gz
kernel-qcow2-util-linux-0ed2a954714992938b35893b70197090a61b3b2e.tar.xz
kernel-qcow2-util-linux-0ed2a954714992938b35893b70197090a61b3b2e.zip
more: avoid double free() on exit
On 'q' command more(1) calls end_it() function with _exit(). The _exit() may suspend program execution due to pending I/O on very loaded server. In this time SIGINT may be delivered due to impatient user who will press ^C. And then end_it() cleanup function may be executed by signal handler too. The result is double free()... Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1403971 Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'text-utils/more.c')
-rw-r--r--text-utils/more.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/text-utils/more.c b/text-utils/more.c
index 21e0cbc70..76ba24a17 100644
--- a/text-utils/more.c
+++ b/text-utils/more.c
@@ -673,6 +673,14 @@ void chgwinsz(int dummy __attribute__((__unused__)))
/* Clean up terminal state and exit. Also come here if interrupt signal received */
void __attribute__((__noreturn__)) end_it(int dummy __attribute__((__unused__)))
{
+ /* May be executed as a signal handler as well as by main process.
+ *
+ * The _exit() may wait for pending I/O for really long time, be sure
+ * that signal handler is not executed in this time to avoid double
+ * de-initialization (free() calls, etc.).
+ */
+ signal(SIGINT, SIG_IGN);
+
reset_tty();
if (clreol) {
putchar('\r');