Subject: bin/5848: poor pipe behavior in sh
To: None <gnats-bugs@gnats.netbsd.org>
From: David Holland <dholland@eecs.harvard.edu>
List: netbsd-bugs
Date: 07/24/1998 14:05:26
>Number: 5848
>Category: bin
>Synopsis: sh makes poor assumptions about pipe buffer sizes
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: bin-bug-people (Utility Bug People)
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sat Jul 25 20:35:00 1998
>Last-Modified:
>Originator: David A. Holland <dholland@eecs.harvard.edu>
>Organization:
- David A. Holland | VINO project home page:
dholland@eecs.harvard.edu | http://www.eecs.harvard.edu/vino
>Release: 1.3
>Environment:
This problem appears in the 1.3 release source for sh, and
appears to remain in -current.
>Description:
sh assumes a pipe can hold at least 4k, via the #define in
redir.c that sets PIPESIZE to 4096.
This assumption is not necessarily correct.
This value is only used to determine whether or not forking
is needed when processing a << redirection. The upshot of
this is that under rare circumstances (`<<' is rare, and
`<<' of large blocks is rarer, and worse, it doesn't always
happen and I don't know why) the shell will mysteriously
hang.
>How-To-Repeat:
Build a kernel with 2K pipes (or build sh on a system with 2K
pipes) and run the configure script from gnu binutils 2.8.2.
>Fix:
At a minimum, the uses of PIPESIZE should be changed to
PIPE_BUF.
Either that, or the logic should be changed to always fork.
This depends on whether the formal definition of PIPE_BUF and
the circumstances of the write guarantee that the shell won't
block. I believe that they do not guarantee this, but it is
a matter for standards lawyers to argue over.
Note that PIPESIZE is also defined but not used in init.c.
>Audit-Trail:
>Unformatted: