* patch for "bizarre read bug" in klibc dash
@ 2006-06-15 3:19 Joshua Hudson
2006-06-15 3:53 ` Alexander E. Patrakov
0 siblings, 1 reply; 3+ messages in thread
From: Joshua Hudson @ 2006-06-15 3:19 UTC (permalink / raw)
To: linux-kernel
I had forked ash awhile back, patched up a few things to behave the
way I wanted them.
While I was at it, I fixed the "echo X | read X ; echo $X" bug that
echoed a blank line.
I tried awhile ago to raise who was responsible for the code and got nowhere.
I suppose you think the above code is a bizarre corner case. It is
not. I use very
complex shell expressions (think loops and subshells) in pipes, with
read in the end to
get the variable I was looking for. The work-around is particularly ugly.
I was quite surprised that this bug never got squashed in dash. So, I
backported it.
Well, here's the patch.
--- usr/dash/eval.c.orig 2006-06-14 19:48:47.000000000 -0700
+++ usr/dash/eval.c 2006-06-14 20:07:58.000000000 -0700
@@ -539,7 +539,17 @@
sh_error("Pipe call failed");
}
}
- if (forkshell(jp, lp->n, n->npipe.backgnd) == 0) {
+ if (!lp->next) {
+ extern void tempredir0(int prevfd);
+ /* Fix for "bizarre read bug" */
+ if (prevfd > 0) {
+ tempredir0(prevfd);
+ close(prevfd);
+ }
+ evaltree(lp->n, 0);
+ if (prevfd > 0)
+ popredir(0);
+ } else if (forkshell(jp, lp->n, n->npipe.backgnd) == 0) {
INTON;
if (pip[1] >= 0) {
close(pip[0]);
--- usr/dash/redir.c.orig 2006-06-14 19:59:21.000000000 -0700
+++ usr/dash/redir.c 2006-06-14 20:03:38.000000000 -0700
@@ -310,6 +310,21 @@
}
+void tempredir0(int fd)
+{
+ struct redirtab *sv = redirlist;
+ int i;
+ sv = ckmalloc(sizeof (struct redirtab));
+ for (i = 0 ; i < 10 ; i++)
+ sv->renamed[i] = EMPTY;
+ sv->next = redirlist;
+ redirlist = sv;
+ INTOFF;
+ sv->renamed[0] = copyfd(0, 10);
+ close(0);
+ copyfd(fd, 0);
+ INTON;
+}
/*
* Undo the effects of the last redirection.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: patch for "bizarre read bug" in klibc dash
2006-06-15 3:19 patch for "bizarre read bug" in klibc dash Joshua Hudson
@ 2006-06-15 3:53 ` Alexander E. Patrakov
[not found] ` <bda6d13a0606142145r11628ec2w788117ee2d418e59@mail.gmail.com>
0 siblings, 1 reply; 3+ messages in thread
From: Alexander E. Patrakov @ 2006-06-15 3:53 UTC (permalink / raw)
To: linux-kernel
Joshua Hudson wrote:
> I had forked ash awhile back, patched up a few things to behave the
> way I wanted them.
> While I was at it, I fixed the "echo X | read X ; echo $X" bug that
> echoed a blank line.
> I tried awhile ago to raise who was responsible for the code and got
> nowhere.
Have you tested your line with bash? Here it prints an empty line. You really
should use "echo X | ( read X ; echo $X )".
So I don't think that ash is broken, and thus cannot acknowledge the patch.
--
Alexander E. Patrakov
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: patch for "bizarre read bug" in klibc dash
[not found] ` <bda6d13a0606142145r11628ec2w788117ee2d418e59@mail.gmail.com>
@ 2006-06-15 5:02 ` Alexander E. Patrakov
0 siblings, 0 replies; 3+ messages in thread
From: Alexander E. Patrakov @ 2006-06-15 5:02 UTC (permalink / raw)
To: linux-kernel
Joshua Hudson wrote:
> Oh, and the original code that found this long ago:
> grep MemFree /proc/meminfo | read J MEMFREE K
> case $MEMFREE in
> ...
> (MEMFREE used several times below)
>
> Had to convert to:
>
> MEMFREE=`grep MemFree /proc/meminfo | (READ J M K ; echo $M)`
> case $MEMFREE in
> ...
Pure-shell implementation:
while read J M K ; do
case "$J" in
MemFree:)
MEMFREE="$M"
esac
done </proc/meminfo
case $MEMFREE in
...
--
Alexander E. Patrakov
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2006-06-15 5:02 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-06-15 3:19 patch for "bizarre read bug" in klibc dash Joshua Hudson
2006-06-15 3:53 ` Alexander E. Patrakov
[not found] ` <bda6d13a0606142145r11628ec2w788117ee2d418e59@mail.gmail.com>
2006-06-15 5:02 ` Alexander E. Patrakov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox