[Tcsh] tcsh 6.22.00 does not merge history (was: Re: tcsh Deadlock with SIGHUP)

Christos Zoulas christos at zoulas.com
Sun Feb 23 22:34:32 UTC 2020


Fixed, thanks!

christos

> On Feb 23, 2020, at 3:55 PM, Brett Frankenberger <rbf at rbfnet.com> wrote:
> 
> So I replaced my custom tcsh with the current source and confirmed that
> the fix you implemented prevents the deadlock, but in the process of
> testing, found another bug -- tcsh no longer (as of 6.21) properly
> merges history even when savehist is configured to do so.  (This is
> unrelated to the fix for the SIGHUP deadlock.)
> 
> For example, if you do the following (with savehist = (100 merge lock))
> (although the lock is, I think, not important here):
> 
>  (1) Launch two sessions.
>  (2) In the first session, enter the command "testcommand1".
>  (2) In the second session, enter the command "testcommand2".
>  (3) Exit the first session.
>  (4) Exit the second session.
>  (5) Launch a new session.
> 
> Then, in the new session, the history will only include "testcommand2";
> it will not include "testcommmand1", because when the second sesson
> exited (step 4 above), the history file written by the first session
> (which exited in step 3 above) is not merged.
> 
> This appears to have broken between 6.21.00 and 6.22.00; I believe this
> fix:
>   4. Avoid infinite loops during history loads when merging, print a better
>      error for errors during history load.
> is the cause; specifically, this code in sh.hist.c:
>   - loadhist(fname, 1);
>   + getexit(osetexit);
>   + if (setexit())
>   +     loadhist(fname, 1);
>   + resexit(osetexit);
> 
> It looks to me like "if (setexit())" should be "if (!setexit())".
> (setexit() is ultimately a wrapper around setjmp() or sigsetjmp(), both
> of which return 0 on their first invocation.  So the code as written is
> skipping loadhist() the first time through, which appears to be the
> opposite of what was intended.)
> 
> Replacing "setexit()" with "!setexit()" fixed the merge issue for me.
> Specifically:
> 
> ============
> --- tcsh-6.22.02.orig/sh.hist.c
> +++ tcsh-6.22.02/sh.hist.c
> @@ -1292,7 +1292,7 @@ rechist(Char *fname, int ref)
> #endif
>            }
>            getexit(osetexit);
> -           if (setexit())
> +           if (!setexit())
>                loadhist(fname, 1);
>            resexit(osetexit);
>        }
> ============
> 
>     -- Brett
> 
> On Mon, Jan 20, 2020 at 11:40:49AM -0500, Christos Zoulas wrote:
>> Thanks, it should be fixed now.
>> 
>> christos
>> 
>>> On Jan 20, 2020, at 9:08 AM, Brett Frankenberger <rbf at rbfnet.com> wrote:
>>> 
>>> (Resending what I posted last August ... let me know if there's
>>> anything I can do to get this (or a differnet fix for the same issue)
>>> into the tree.)
>>> 
>>> tcsh can deadlock with itself if savehist is confgured with "merge" and
>>> "lock", and two SIGHUPs are received in rapid succession.  The
>>> mechanism of the deadlock is the first SIGHUP triggers a rechist() and
>>> while that rechist() is executing (and after it has created the lock
>>> file), the second SIGHUP triggers a another rechist() which then waits
>>> forever for the lock the the first rechist() created to be released
>>> (which will never happen).
> 
>    [ . . . ]

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 235 bytes
Desc: Message signed with OpenPGP
URL: <https://mailman.astron.com/pipermail/tcsh/attachments/20200223/dc9df613/attachment.asc>


More information about the Tcsh mailing list