Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Restore SIGPIPE default action for subprocesses
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 quantum.agent.linux.utils.execute,
quantum.common.utils.execute and quantum-rootwrap created subprocesses.

Fixes bug 1053364

Change-Id: Ib805f1f8846c245b75a5ea64278c840b823c1fb2
  • Loading branch information
ttx committed Sep 20, 2012
1 parent 3c3de43 commit 30fe8a4
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 0 deletions.
8 changes: 8 additions & 0 deletions bin/quantum-rootwrap
Expand Up @@ -38,6 +38,7 @@

import ConfigParser
import os
import signal
import subprocess
import sys

Expand All @@ -47,6 +48,12 @@ 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)
Expand Down Expand Up @@ -84,6 +91,7 @@ if __name__ == '__main__':
stdin=sys.stdin,
stdout=sys.stdout,
stderr=sys.stderr,
preexec_fn=_subprocess_setup,
env=filtermatch.get_environment(userargs))
obj.wait()
sys.exit(obj.returncode)
Expand Down
8 changes: 8 additions & 0 deletions quantum/agent/linux/utils.py
Expand Up @@ -21,6 +21,7 @@
import logging
import os
import shlex
import signal
import socket
import struct

Expand All @@ -30,6 +31,12 @@
LOG = logging.getLogger(__name__)


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, root_helper=None, process_input=None, addl_env=None,
check_exit_code=True, return_stderr=False):
if root_helper:
Expand All @@ -42,6 +49,7 @@ def execute(cmd, root_helper=None, process_input=None, addl_env=None,
env.update(addl_env)
obj = subprocess.Popen(cmd, shell=False, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
preexec_fn=_subprocess_setup,
env=env)

_stdout, _stderr = (process_input and
Expand Down
8 changes: 8 additions & 0 deletions quantum/common/utils.py
Expand Up @@ -23,6 +23,7 @@

import logging
import os
import signal
import subprocess
import uuid

Expand All @@ -47,13 +48,20 @@ def boolize(subject):
return subject


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, process_input=None, addl_env=None, check_exit_code=True):
logging.debug("Running cmd: %s", cmd)
env = os.environ.copy()
if addl_env:
env.update(addl_env)
obj = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
preexec_fn=_subprocess_setup,
env=env)
result = None
if process_input is not None:
Expand Down

0 comments on commit 30fe8a4

Please sign in to comment.