Python ignores SIGPIPE on startup, because it prefers to check every
write and raise an IOError exception rather than taking the signal. Most
Unix subprocesses don't expect to work this way. This patch (adapted
from Colin Watson's post at http://tinyurl.com/2a7mzh5) sets SIGPIPE
back to the default action for cinder.utils.execute and cinder-rootwrap
created subprocesses.
Fixes bug
1053364
Change-Id: I4b3307bd2f0f5d0da529d8b7d80fabae28c57732
import ConfigParser
import os
+import signal
import subprocess
import sys
RC_NOCOMMAND = 98
RC_BADCONFIG = 97
+
+def _subprocess_setup():
+ # Python installs a SIGPIPE handler by default. This is usually not what
+ # non-Python subprocesses expect.
+ signal.signal(signal.SIGPIPE, signal.SIG_DFL)
+
+
if __name__ == '__main__':
# Split arguments, require at least a command
execname = sys.argv.pop(0)
stdin=sys.stdin,
stdout=sys.stdout,
stderr=sys.stderr,
+ preexec_fn=_subprocess_setup,
env=filtermatch.get_environment(userargs))
obj.wait()
sys.exit(obj.returncode)
import re
import shlex
import shutil
+import signal
import socket
import struct
import sys
execute('curl', '--fail', url, '-o', target)
+def _subprocess_setup():
+ # Python installs a SIGPIPE handler by default. This is usually not what
+ # non-Python subprocesses expect.
+ signal.signal(signal.SIGPIPE, signal.SIG_DFL)
+
+
def execute(*cmd, **kwargs):
"""Helper method to execute command with optional retry.
stdout=_PIPE,
stderr=_PIPE,
close_fds=True,
+ preexec_fn=_subprocess_setup,
shell=shell)
result = None
if process_input is not None: