Bug 615284 - wrong redirections with SIGPIPE traps
Summary: wrong redirections with SIGPIPE traps
Keywords:
Status: CLOSED ERRATA
Alias: None
Product: Red Hat Enterprise Linux 5
Classification: Red Hat
Component: ksh
Version: 5.5
Hardware: All
OS: Linux
high
high
Target Milestone: rc
: ---
Assignee: Michal Hlavinka
QA Contact: qe-baseos-tools-bugs
URL:
Whiteboard:
Depends On:
Blocks: 590060 616684 675128
TreeView+ depends on / blocked
 
Reported: 2010-07-16 11:12 UTC by Tomas Smetana
Modified: 2018-11-14 19:24 UTC (History)
4 users (show)

Fixed In Version:
Doc Type: Bug Fix
Doc Text:
When a ksh script contained the "trap" command to capture a "SIGPIPE" signal, sending this signal via the built-in "echo" command could cause its output to be incorrectly added to the redirected output of an external command. With this update, ksh now flushes the output buffer before redirecting any output streams.
Clone Of:
: 616684 (view as bug list)
Environment:
Last Closed: 2012-02-21 05:49:56 UTC
Target Upstream Version:
Embargoed:


Attachments (Terms of Use)
patch to fix this (482 bytes, patch)
2010-07-21 07:49 UTC, Michal Hlavinka
no flags Details | Diff


Links
System ID Private Priority Status Summary Last Updated
Red Hat Product Errata RHBA-2012:0159 0 normal SHIPPED_LIVE ksh bug fix and enhancement update 2012-02-20 14:53:47 UTC

Description Tomas Smetana 2010-07-16 11:12:09 UTC
Description of problem:
In a ksh script, when SIGPIPE trap action is specified and SIGPIPE occurs by the output of the built-in echo command, the output appears in a redirect file of a external command.

Version-Release number of selected component (if applicable):
ksh-20100202-1.el5

How reproducible:
Always

Steps to Reproduce:

Assume there is a huge ascii file /tmp/huge-text which takes more than one second to cat to terminal.

Run the following scripts with

ssh localhost /path/to/the/script.ksh

Steps to reproduce:

Case 1:
-------

the script.ksh is:

#!/bin/ksh
killparent()
{
	sleep 1
	/bin/kill -9 $1
}
trap "/bin/echo trap > /dev/null" 13
killparent ${PPID} &
/bin/cat /tmp/huge-text
print "echo1"
/bin/echo "echo2" > /tmp/echo2
trap 13

After running the script with ssh print the contents of the resulting file:
# cat /tmp/echo2

Actual results:
echo1
echo2

Expected results:
echo2

Case 2:
-------

the script.ksh is

#!/bin/ksh
killparent()
{
	sleep 1
	/bin/kill -9 $1
}
trap "/bin/echo trap >> /tmp/trap" 13
killparent ${PPID} &
/bin/cat /tmp/huge-text
echo "echo1"
/bin/echo "echo2"
trap 13

After running the script with ssh print the contents of the resulting file:
# cat /tmp/trap

Actual results:
echo1
trap
trap

Expected results:
trap
trap

Additional information:
Seems that the output of the echo builtin command is buffered and the buffer is flushed upon forking a child process.  However when the flush fails the content of the buffer is not erased and then appears in where it should not.

Maybe the ksh should either delete the buffer after flush (even unsucessful), not to buffer the echo output or not to buffer the redirection output.

Comment 1 Michal Hlavinka 2010-07-16 11:34:07 UTC
I can reproduce this. 
/bin/cat /tmp/huge-text from the reproducer can be replaced with /usr/bin/yes

Comment 2 Michal Hlavinka 2010-07-21 07:49:56 UTC
Created attachment 433326 [details]
patch to fix this

Comment 5 RHEL Program Management 2010-08-09 18:40:51 UTC
This request was evaluated by Red Hat Product Management for
inclusion in the current release of Red Hat Enterprise Linux.
Because the affected component is not scheduled to be updated in the
current release, Red Hat is unfortunately unable to address this
request at this time. Red Hat invites you to ask your support
representative to propose this request, if appropriate and relevant,
in the next release of Red Hat Enterprise Linux.

Comment 10 Michal Hlavinka 2011-02-03 10:31:35 UTC
note: attached patch works fine without any regressions, but when combined with patch for bug #601555 (which works fine too) it no longer fixes second reproducer and output is:
echo1
trap

working on it to find out more and prepare better patch

Comment 15 Martin Prpič 2011-03-16 15:54:02 UTC
    Technical note added. If any revisions are required, please edit the "Technical Notes" field
    accordingly. All revisions will be proofread by the Engineering Content Services team.
    
    New Contents:
When a ksh script contained the "trap" command to capture a "SIGPIPE" signal, sending this signal via the built-in "echo" command could cause its output to be incorrectly added to the redirected output of an external command. With this update, ksh now flushes the output buffer before redirecting any output streams.

Comment 18 errata-xmlrpc 2012-02-21 05:49:56 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.

http://rhn.redhat.com/errata/RHBA-2012-0159.html


Note You need to log in before you can comment on or make changes to this bug.