bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

SEGV on recursive trap


From: Nobuyoshi Nakada
Subject: SEGV on recursive trap
Date: Thu, 09 May 2002 11:00:57 +0900
User-agent: Wanderlust/2.8.1 (Something) EMIKO/1.14.1 (Choanoflagellata) LIMIT/1.14.7 (Fujiidera) APEL/10.3 MULE XEmacs/21.4 (patch 6) (Common Lisp) (i586-kondara-linux)

Configuration Information [Automatically generated, do not change]:
Machine: i686
OS: linux-gnu
Compiler: gcc
Compilation CFLAGS:  -DPROGRAM='bash' -DCONF_HOSTTYPE='i686' 
-DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='i686-pc-linux-gnu' 
-DCONF_VENDOR='pc' -DSHELL -DHAVE_CONFIG_H   -I.  -I. -I./include -I./lib -ggdb 
-g3 -O
uname output: Linux sharui.nakada.kanuma.tochigi.jp 2.4.18-pre9 #1 SMP Mon Feb 
11 10:22:09 JST 2002 i686 unknown
Machine Type: i686-pc-linux-gnu

Bash Version: 2.05a
Patch Level: 0
Release Status: release

Description:
        If trapping command runs while it's already running,
        job list for previous one is discarded.

Repeat-By:
        Running following script, and hit Ctrl-C twice.

        #! /bin/sh
        trap "echo trap; sleep 10" 0 2

Fix:
--- jobs.c~     Mon Nov  5 23:56:17 2001
+++ jobs.c      Thu May  9 10:52:04 2002
@@ -2524,4 +2524,5 @@ set_job_status_and_cleanup (job)
          signal_is_trapped (SIGINT))
        {
+         int old_jobs_list_frozen = jobs_list_frozen;
          wait_sigint_received = 0;
          last_command_exit_value = process_exit_status (child->status);
@@ -2529,5 +2530,5 @@ set_job_status_and_cleanup (job)
          jobs_list_frozen = 1;
          tstatus = maybe_call_trap_handler (SIGINT);
-         jobs_list_frozen = 0;
+         jobs_list_frozen = old_jobs_list_frozen;
        }
 
@@ -2544,4 +2545,5 @@ set_job_status_and_cleanup (job)
              IS_FOREGROUND (job) && IS_JOBCONTROL (job) == 0)
        {
+         int old_jobs_list_frozen = jobs_list_frozen;
          wait_sigint_received = 0;
 
@@ -2558,5 +2560,5 @@ set_job_status_and_cleanup (job)
          jobs_list_frozen = 1;
          tstatus = maybe_call_trap_handler (SIGINT);
-         jobs_list_frozen = 0;
+         jobs_list_frozen = old_jobs_list_frozen;
          if (tstatus == 0 && old_sigint_handler != INVALID_SIGNAL_HANDLER)
            {





reply via email to

[Prev in Thread] Current Thread [Next in Thread]