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: | ksh | Assignee: | Siteshwar Vashisht <svashisht> | ||||
| Status: | CLOSED ERRATA | QA Contact: | Jan Kepler <jkejda> | ||||
| Severity: | medium | Docs Contact: | |||||
| Priority: | unspecified | ||||||
| Version: | 7.3 | CC: | 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: |
|
||||||
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.
Created attachment 1285074 [details]
ksh-20120801-jobwait-sigstop.patch
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 |
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]