bug-bash
[Top][All Lists]
Advanced

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

Re: Race condition in handling SIGHUP


From: Siteshwar Vashisht
Subject: Re: Race condition in handling SIGHUP
Date: Fri, 29 Apr 2016 05:12:06 -0400 (EDT)


----- Original Message -----
> From: "Chet Ramey" <chet.ramey@case.edu>
> To: "Siteshwar Vashisht" <svashish@redhat.com>, bug-bash@gnu.org
> Cc: dkaspar@redhat.com, "chet ramey" <chet.ramey@case.edu>
> Sent: Thursday, April 28, 2016 6:19:17 PM
> Subject: Re: Race condition in handling SIGHUP
> 
> On 4/27/16 6:04 AM, Siteshwar Vashisht wrote:
> 
> > While this issue was fixed by backporting somes changes (See attached
> > patch) from [4]  to bash-4.2 or older versions, there is still a corner
> > case which may cause race condition in handling SIGHUP in current upstream.
> > 
> > 'bash_tilde_expand ()' function sets 'terminate_immediately' to 1 at [5]
> > 
> > If SIGHUP is received and termsig_handler () gets executed before reaching
> > [6], ~/.bash_history will not be updated. This can happen in a scenario
> > where user is running ssh session and requests for expansion for '~', if an
> > admin issues 'reboot' command at the same time then ~/.bash_history may not
> > be updated.
> > 
> > I have 2 questions about how current upstream handles this condition :
> > 
> > 1. Why 'terminate_immediately' is set to 1 at [7]?
> 
> Because systems using a networked password database can hang at a priority
> that doesn't interrupt the system call when a SIGHUP arrives.  The handler
> gets run, but the system call gets restarted.  Setting
> terminate_immediately was a way to get around that.
> 
> That's probably not as necessary as it once was, so we can try removing
> that code from bash_tilde_expand.
> 
> > 2. Why 'RL_ISSTATE (RL_STATE_READCMD)' is being checked at [8]? This will
> > evaluate to 0 if readline is not waiting to read a command from user. I
> > believe this check can be removed.
> 
> The checks have to handle all the places terminate_immediately is being
> set.  However, you need to notice how terminate_immediately can be set if
> a terminating signal arrives twice before it's handled.  You don't want to
> try and save the history, which involves memory allocation and multiple
> system and C library calls, from a signal handler context.
> 
> That code is written the way it is to accommodate the much more common
> case of users exiting a shell by hitting the `close' button on their
> terminal window, which causes the terminal emulator to send one or more
> SIGHUPs to the shell process, usually while readline is active.  You want
> shell to try and save the history in this case, since that's what users
> expect.

if (interactive_shell == 0 || interactive == 0 || (sig != SIGHUP && sig != 
SIGTERM) || no_line_editing || (RL_ISSTATE (RL_STATE_READCMD) == 0))

This condition means if shell is waiting for a command to finish execution 
(readline is not waiting for user input) and the terminating signal arrives 
more than once (may be through hitting 'close' button in terminal) 
~/.bash_history will not be saved.

> 
> Chet
> --
> ``The lyf so short, the craft so long to lerne.'' - Chaucer
>                ``Ars longa, vita brevis'' - Hippocrates
> Chet Ramey, ITS, CWRU    chet@case.edu    http://cnswww.cns.cwru.edu/~chet/
> 
> 

-- 
--
Siteshwar Vashisht
Software Engineer



reply via email to

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