From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28255 invoked from network); 16 Jun 1999 06:48:25 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 16 Jun 1999 06:48:25 -0000 Received: (qmail 20034 invoked by alias); 16 Jun 1999 06:48:10 -0000 Mailing-List: contact zsh-workers-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 6651 Received: (qmail 20025 invoked from network); 16 Jun 1999 06:48:09 -0000 From: "Bart Schaefer" Message-Id: <990616064758.ZM25956@candle.brasslantern.com> Date: Wed, 16 Jun 1999 06:47:58 +0000 X-Mailer: Z-Mail (5.0.0 30July97) To: zsh-workers@sunsite.auc.dk Subject: PATCH: 3.0.6-pre-4: Sneaky history bug MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Start with an empty history, as with "zsh -f" or a non-login shell, and then try to do a "quick substitution" on the nonexistent previous command using the second character in $histchars (usually '^'). I found myself in hend() with chwordpos == -2, which did all sorts of fun things when memcpy was called with chwordpos * sizeof(short) as its third parameter. I think only Wayne really knows what's going on in the code below, but this patch at least seems to prevent zsh committing hara-kiri. You end up with an empty entry in the history, though. Index: Src/hist.c =================================================================== @@ -719,7 +719,7 @@ } #endif /* get rid of pesky \n which we've already nulled out */ - if (!chline[chwords[chwordpos-2]]) + if (chwordpos > 1 && !chline[chwords[chwordpos-2]]) chwordpos -= 2; /* strip superfluous blanks, if desired */ if (isset(HISTREDUCEBLANKS)) -- Bart Schaefer Brass Lantern Enterprises http://www.well.com/user/barts http://www.brasslantern.com