From: Bart Schaefer <schaefer@brasslantern.com>
To: martin.ebourne@arcordia.com, zsh-workers@sunsite.dk
Subject: Re: Very odd behaviour with zsh, maybe corruption bug
Date: Fri, 12 Oct 2001 05:02:27 +0000 [thread overview]
Message-ID: <1011012050227.ZM19535@candle.brasslantern.com> (raw)
In-Reply-To: <OFFE2ABA9E.2332FF4A-ON80256AE2.0038ACE5@uk.jpmorgan.com>
On Oct 11, 11:57am, martin.ebourne@arcordia.com wrote:
}
} _down_fn() {
} setopt local_options
} set -x
} if [[ ${LASTWIDGET} == ${_searching} ]]
} then
} _searching=$WIDGET
} zle .history-beginning-search-forward
} else
} if [[ $RBUFFER == *$'\n'* ]]
} then
} _searching=''
} zle .down-line-or-history
} else
} _searching=$WIDGET
} zle .history-beginning-search-forward
} fi
} fi
} }
}
} Here is an example trace where it has gone wrong (once the bug had been
} 'activated' I just pressed up followed by down to get this):
}
} gdd-odybin2% +_down_fn:3> [[ new-up == new-up ]]
} +_down_fn:8> [[ "abc
} def" == *
} * ]]
} +_down_fn:10> _searching=
} +_down_fn:11> zle .down-line-or-history
I've gotten a bit closer to what's going on here, but I'm still not sure
exactly what's happening.
In evalcond(), there's this fragment:
int test, npat = state->pc[1];
Patprog pprog = state->prog->pats[npat];
if (pprog == dummy_patprog1 || pprog == dummy_patprog2) {
char *opat;
int save;
right = opat = dupstring(ecrawstr(state->prog, state->pc,
&htok));
if (htok)
singsub(&right);
save = (!(state->prog->flags & EF_HEAP) &&
!strcmp(opat, right) && pprog != dummy_patprog2);
if (!(pprog = patcompile(right, (save ? PAT_ZDUP : PAT_STATIC),
NULL)))
zerr("bad pattern: %s", right, 0);
else if (save)
state->prog->pats[npat] = pprog;
}
On the *next* call to _down_fn *after* the call which executes
} _searching=''
} zle .down-line-or-history
The C code above gets into this state:
(gdb) p opat
$21 = 0x4011b220 ""
(gdb) p right
$22 = 0x4011b230 ""
Thus `save' is true, so we execute `state->prog->pats[npat] = pprog;' and
thereafter the test at _down_fn:3 can never succeed again. The problem
is that before calling `singsub(&right);', the string is not empty:
(gdb) p ecrawstr(state->prog, state->pc, &htok)
$26 = 0x8140d5f "\205\215_searching\216"
Hence `save' should not have become true, but it did.
This *must* be a bug in prefork() called via singsub(); it must be zeroing
`right' (and thus also zeroing `opat') before copying the string. But I
just can't seem to catch it happening.
--
Bart Schaefer Brass Lantern Enterprises
http://www.well.com/user/barts http://www.brasslantern.com
Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net
next prev parent reply other threads:[~2001-10-12 5:04 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-10-11 10:57 martin.ebourne
2001-10-11 16:30 ` Bart Schaefer
2001-10-12 5:02 ` Bart Schaefer [this message]
2001-10-14 21:56 ` PATCH: " Bart Schaefer
2001-10-15 11:24 ` Sven Wischnowsky
2001-10-11 17:09 martin.ebourne
2001-10-12 9:19 martin.ebourne
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1011012050227.ZM19535@candle.brasslantern.com \
--to=schaefer@brasslantern.com \
--cc=martin.ebourne@arcordia.com \
--cc=zsh-workers@sunsite.dk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).