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.
I can reproduce this. /bin/cat /tmp/huge-text from the reproducer can be replaced with /usr/bin/yes
Created attachment 433326 [details] patch to fix this
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.
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
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.
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