Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: SIGSEGV caused by global substitution modifier
- X-seq: zsh-workers 176
- From: hzoli@xxxxxxxxxx (Zoltan Hidvegi)
- To: kaefer@xxxxxxxxxxxxxxx (Thorsten Meinecke)
- Subject: Re: SIGSEGV caused by global substitution modifier
- Date: Fri, 7 Jul 1995 17:52:41 +0100 (MET DST)
- In-reply-to: <m0sTskY-00000PC@xxxxxxxxxxxxxxx> from "Thorsten Meinecke" at Jul 6, 95 05:21:57 pm
- Sender: hzoli@xxxxxxxxxx
Thorsten Meinecke wrote:
>
> Please have a look at this:
>
> $ zsh-2.6-beta5 -Fc 'FOO=123;echo $FOO:gs//bar/'
> bar
> $ zsh-2.6-beta10 -fc 'FOO=123;echo $FOO:gs//bar/'
> zsh: segmentation fault zsh-2.6-beta10 -fc 'FOO=123;echo $FOO:gs//bar/'
>
>
> $FOO:gs/// loops forever now, which is especially unpleasant (since
> not interruptible) when it occurs in completion control functions like
> P.Stephenson's new `multicomp'. This is how I noticed the problem.
>
> You might want to try `!??:gs///' on the command line, too. Don't.
>
> An empty left-hand side of a substitution has a special meaning
> ("use scan string or previous match"), right? Only if there's no
> non-empty scan string or previous match, the left-hand side evaluates
> to a null string, and zsh chokes.
>
>
> There's another (somewhat related) problem: Used on the result of
> parameter expansion, empty l strings of substitution modifiers don't
> produce the expected result:
>
> $ FOO=1213
> $ echo $FOO:s/1/a/:s//b/
> b
>
> I've expected `a2b3'. That is what `!:s/1/a/:s//b/' would give.
The patch below should fix all of your problems.
Bye,
Zoltan
rcsdiff -qc -kk -r1.12 -r1.13 Src/subst.c
*** 1.12 1995/07/04 18:33:00
--- Src/subst.c 1995/07/07 00:29:43
***************
*** 1460,1466 ****
case 's':
c = **ptr;
(*ptr)++;
- zsfree(hsubl);
zsfree(hsubr);
ptr1 = *ptr;
del = *ptr1++;
--- 1460,1465 ----
***************
*** 1473,1481 ****
for (ptr3 = ptr2; *ptr3 != del && *ptr3; ptr3++);
if ((sav = *ptr3))
*ptr3++ = '\0';
! for (tt = hsubl = ztrdup(ptr1); *tt; tt++)
! if (INULL(*tt))
! chuck(tt);
for (tt = hsubr = ztrdup(ptr2); *tt; tt++)
if (INULL(*tt))
chuck(tt);
--- 1472,1485 ----
for (ptr3 = ptr2; *ptr3 != del && *ptr3; ptr3++);
if ((sav = *ptr3))
*ptr3++ = '\0';
! if (*ptr1) {
! zsfree(hsubl);
! hsubl = ztrdup(ptr1);
! }
! if (hsubl)
! for (tt = hsubl; *tt; tt++)
! if (INULL(*tt))
! chuck(tt);
for (tt = hsubr = ztrdup(ptr2); *tt; tt++)
if (INULL(*tt))
chuck(tt);
rcsdiff -qc -kk -r1.3 -r1.4 Src/hist.c
*** 1.3 1995/07/06 12:25:26
--- Src/hist.c 1995/07/07 00:29:43
***************
*** 881,887 ****
int off, inlen, outlen;
if (!*in)
! in = str;
if (!(substcut = (char *)strstr(str, in)))
return;
inlen = strlen(in);
--- 881,887 ----
int off, inlen, outlen;
if (!*in)
! in = str, gbal = 0;
if (!(substcut = (char *)strstr(str, in)))
return;
inlen = strlen(in);
Messages sorted by:
Reverse Date,
Date,
Thread,
Author