Bug 1457990

Summary: ksh program hangs when piped through a program that terminates before EOF
Product: Red Hat Enterprise Linux 7 Reporter: Paulo Andrade <pandrade>
Component: kshAssignee: Siteshwar Vashisht <svashisht>
Status: CLOSED ERRATA QA Contact: Jan Kepler <jkejda>
Severity: medium Docs Contact:
Priority: unspecified    
Version: 7.3CC: jkejda, pandrade
Target Milestone: rc   
Target Release: ---   
Hardware: All   
OS: Linux   
Whiteboard:
Fixed In Version: ksh-20120801-36.el7 Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of:
: 1459000 (view as bug list) Environment:
Last Closed: 2018-04-10 13:51:41 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 1420851, 1459000, 1465901, 1466365, 1473612    
Attachments:
Description Flags
ksh-20120801-jobwait-sigstop.patch none

Description Paulo Andrade 2017-06-01 17:07:56 UTC
When using these scripts:

"""
$ cat p1
#!/bin/ksh
while true
do
  echo -n "Exit (y/n)? " 1>&2
  read V
  if [ "${V}" = "y" ]
  then
    exit 1
  fi
  sleep 1
done
"""

and
"""
$ cat p2
#!/bin/ksh
sleep 1
exit
"""

if run as:

"""
$ ./p1|./p2
"""

it will hang, most times, if the current shell is ksh. But will work
with other *sh shells. If it does not hang at first, please try this:

"""
$ taskset 1 ksh
$ ./p1 | ./p2
"""

  Attaching gdb shows it keeps receiving two SIGTTIN followed by
a SIGCONT.

  I believe this is related to
https://bugzilla.redhat.com/show_bug.cgi?id=1311682
[Problem with pipes implemented using unix sockets]

Comment 2 Paulo Andrade 2017-06-01 19:23:55 UTC
  I tested with a ksh built to use real pipes instead of
sockets. The problem still happens. In gdb the same behaviour;
when it works, it will block waiting for input in the select
call in src/lib/libast/sfio/sfpkrd.c:sfpkrd(),
but if it blocks in src/cmd/ksh93/edit/edit.c:ed_read()
in the read call in the chunk:
		while(1)
		{
			rv = read(fd,buff,size);
			if(rv>=0 || errno!=EINTR)
				break;
			if(shp->trapnote&(SH_SIGSET|SH_SIGTRAP))
				goto done;
			/* an interrupt that should be ignored */
			fixtime();
		}
the problem happens.

  Using real pipes only fixed another test, running it
as:

yes | ./p1 | ./p2

forcing it to SIG_IGN TTIN, TTOU or CONT signals causes
the process to keep running after the parent process dies.
For example, running "call signal(SIG, 1)" in gdb, with
SIG being 18, 21 and/or 22.

Comment 3 Siteshwar Vashisht 2017-06-05 14:49:14 UTC
Created attachment 1285074 [details]
ksh-20120801-jobwait-sigstop.patch

Comment 9 Siteshwar Vashisht 2017-07-14 10:15:41 UTC
https://github.com/att/ast/pull/44

Comment 15 errata-xmlrpc 2018-04-10 13:51:41 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHBA-2018:0801