From 0ed2a954714992938b35893b70197090a61b3b2e Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 15 Dec 2016 14:40:26 +0100 Subject: 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 --- text-utils/more.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'text-utils/more.c') 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'); -- cgit v1.2.3-55-g7522