Re: [PATCH] input: preadfd: read standard input byte-wise

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 13/12/2022 22:17, наб wrote:
Reading the standard input byte-by-byte is the obvious solution to this
issue, Just Works, and is how all other shells do it (we could,
theoretically, read regular files block-wise, then seek within them after
parsing, but the complexity out-weighs the rarity of running
sh < program; we could also do whole-line reads on teletypes in
icanon mode, but, again, the gain here is miniscule for an interactive
session, and the teletype mode can change at any time, so...).
Naturally, we keep reading block-wise for non-standard-input.

There are a few things to consider here:

- Not all shells do it this way. bash does do the block-wise read,
  followed by a seek, when stdin is seekable. While I agree that it is
  not necessary and not worth it, you specifically say that other shells
  do not do this. That's simply not true.
- This will have no effect when running 'dash /dev/stdin'. I personally
  consider this acceptable, this doesn't work in other shells either.
- This patch breaks internal assumptions in dash that the buffer will
  contain a full line, affecting error recovery. See below.

With this patch, we observe the correct
   uid=1000(nabijaczleweli) gid=100(users) groups=100(users)
   good!
and
   + id
   uid=1000(nabijaczleweli) gid=100(users) groups=100(users)
   + read Q
   + echo Qgood!
   Qgood!

Fixes: https://bugs.debian.org/862907
---
  src/input.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/input.c b/src/input.c
index ec075f5..6b6113e 100644
--- a/src/input.c
+++ b/src/input.c
@@ -195,7 +195,7 @@ retry:
} else
  #endif
-		nr = read(parsefile->fd, buf, IBUFSIZ - 1);
+		nr = read(parsefile->fd, buf, parsefile->fd == 0 ? 1 : IBUFSIZ - 1);
if (nr < 0) {

With dash 0.5.12:

  $ | echo bug
  src/dash: 1: Syntax error: "|" unexpected
  $

With dash 0.5.12 + your patch:

  $ | echo bug
  src/dash: 1: Syntax error: "|" unexpected
  $ bug
  $

I had implemented the same change in my fork, see <https://github.com/hvdijk/gwsh/commit/d279523041c1c380d64b6dec7760feba20bbf6b5> for the additional changes I needed to get everything working.

Cheers,
Harald van Dijk



[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux