From: Eduardo Habkost <ehabkost@redhat.com>
To: Peter Maydell <peter.maydell@linaro.org>, qemu-devel@nongnu.org
Cc: "Eduardo Habkost" <ehabkost@redhat.com>,
qemu-block@nongnu.org, "Fam Zheng" <famz@redhat.com>,
"Kevin Wolf" <kwolf@redhat.com>, "Max Reitz" <mreitz@redhat.com>,
"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
"Cleber Rosa" <crosa@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>
Subject: [Qemu-devel] [PULL 07/15] iotests: Explicitly bequeath FDs in Python
Date: Tue, 30 Oct 2018 21:31:12 -0300 [thread overview]
Message-ID: <20181031003120.26771-8-ehabkost@redhat.com> (raw)
In-Reply-To: <20181031003120.26771-1-ehabkost@redhat.com>
From: Max Reitz <mreitz@redhat.com>
Python 3.4 introduced the inheritable attribute for FDs. At the same
time, it changed the default so that all FDs are not inheritable by
default, that only inheritable FDs are inherited to subprocesses, and
only if close_fds is explicitly set to False.
Adhere to this by setting close_fds to False when working with
subprocesses that may want to inherit FDs, and by trying to
set_inheritable() on FDs that we do want to bequeath to them.
Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Reviewed-by: Cleber Rosa <crosa@redhat.com>
Message-Id: <20181022135307.14398-7-mreitz@redhat.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
scripts/qemu.py | 34 +++++++++++++++++++++++++++++-----
tests/qemu-iotests/045 | 2 +-
tests/qemu-iotests/147 | 2 +-
3 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/scripts/qemu.py b/scripts/qemu.py
index fd4249f7a8..768611f1de 100644
--- a/scripts/qemu.py
+++ b/scripts/qemu.py
@@ -148,11 +148,19 @@ class QEMUMachine(object):
if opts:
options.append(opts)
+ # This did not exist before 3.4, but since then it is
+ # mandatory for our purpose
+ if hasattr(os, 'set_inheritable'):
+ os.set_inheritable(fd, True)
+
self._args.append('-add-fd')
self._args.append(','.join(options))
return self
- def send_fd_scm(self, fd_file_path):
+ # Exactly one of fd and file_path must be given.
+ # (If it is file_path, the helper will open that file and pass its
+ # own fd)
+ def send_fd_scm(self, fd=None, file_path=None):
# In iotest.py, the qmp should always use unix socket.
assert self._qmp.is_scm_available()
if self._socket_scm_helper is None:
@@ -160,12 +168,27 @@ class QEMUMachine(object):
if not os.path.exists(self._socket_scm_helper):
raise QEMUMachineError("%s does not exist" %
self._socket_scm_helper)
+
+ # This did not exist before 3.4, but since then it is
+ # mandatory for our purpose
+ if hasattr(os, 'set_inheritable'):
+ os.set_inheritable(self._qmp.get_sock_fd(), True)
+ if fd is not None:
+ os.set_inheritable(fd, True)
+
fd_param = ["%s" % self._socket_scm_helper,
- "%d" % self._qmp.get_sock_fd(),
- "%s" % fd_file_path]
+ "%d" % self._qmp.get_sock_fd()]
+
+ if file_path is not None:
+ assert fd is None
+ fd_param.append(file_path)
+ else:
+ assert fd is not None
+ fd_param.append(str(fd))
+
devnull = open(os.path.devnull, 'rb')
proc = subprocess.Popen(fd_param, stdin=devnull, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
+ stderr=subprocess.STDOUT, close_fds=False)
output = proc.communicate()[0]
if output:
LOG.debug(output)
@@ -286,7 +309,8 @@ class QEMUMachine(object):
stdin=devnull,
stdout=self._qemu_log_file,
stderr=subprocess.STDOUT,
- shell=False)
+ shell=False,
+ close_fds=False)
self._post_launch()
def wait(self):
diff --git a/tests/qemu-iotests/045 b/tests/qemu-iotests/045
index 6be8fc4912..55a5d31ca8 100755
--- a/tests/qemu-iotests/045
+++ b/tests/qemu-iotests/045
@@ -140,7 +140,7 @@ class TestSCMFd(iotests.QMPTestCase):
os.remove(image0)
def _send_fd_by_SCM(self):
- ret = self.vm.send_fd_scm(image0)
+ ret = self.vm.send_fd_scm(file_path=image0)
self.assertEqual(ret, 0, 'Failed to send fd with UNIX SCM')
def test_add_fd(self):
diff --git a/tests/qemu-iotests/147 b/tests/qemu-iotests/147
index d2081df84b..05b374b7d3 100755
--- a/tests/qemu-iotests/147
+++ b/tests/qemu-iotests/147
@@ -229,7 +229,7 @@ class BuiltinNBD(NBDBlockdevAddBase):
sockfd = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sockfd.connect(unix_socket)
- result = self.vm.send_fd_scm(str(sockfd.fileno()))
+ result = self.vm.send_fd_scm(fd=sockfd.fileno())
self.assertEqual(result, 0, 'Failed to send socket FD')
result = self.vm.qmp('getfd', fdname='nbd-fifo')
--
2.18.0.rc1.1.g3f1ff2140
next prev parent reply other threads:[~2018-10-31 0:32 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-31 0:31 [Qemu-devel] [PULL 00/15] Python queue, 2018-10-30 Eduardo Habkost
2018-10-31 0:31 ` [Qemu-devel] [PULL 01/15] scripts/device-crash-test: Remove devices that are not user_creatable anymore Eduardo Habkost
2018-10-31 0:31 ` [Qemu-devel] [PULL 02/15] iotests: Make nbd-fault-injector flush Eduardo Habkost
2018-10-31 0:31 ` [Qemu-devel] [PULL 03/15] iotests: Flush in iotests.py's QemuIoInteractive Eduardo Habkost
2018-10-31 0:31 ` [Qemu-devel] [PULL 04/15] iotests: Use Python byte strings where appropriate Eduardo Habkost
2018-10-31 0:31 ` [Qemu-devel] [PULL 05/15] iotests: Use // for Python integer division Eduardo Habkost
2018-10-31 0:31 ` [Qemu-devel] [PULL 06/15] iotests: Different iterator behavior in Python 3 Eduardo Habkost
2018-10-31 0:31 ` Eduardo Habkost [this message]
2018-10-31 0:31 ` [Qemu-devel] [PULL 08/15] iotests: 'new' module replacement in 169 Eduardo Habkost
2018-10-31 0:31 ` [Qemu-devel] [PULL 09/15] iotests: Modify imports for Python 3 Eduardo Habkost
2018-10-31 0:31 ` [Qemu-devel] [PULL 10/15] iotests: Unify log outputs between Python 2 and 3 Eduardo Habkost
2018-10-31 0:31 ` [Qemu-devel] [PULL 11/15] Bootstrap Python venv for tests Eduardo Habkost
2018-11-06 13:10 ` Peter Maydell
2018-11-06 13:34 ` Philippe Mathieu-Daudé
2018-11-06 14:13 ` [Qemu-devel] [PATCH] tests: Fix Python 3 detection on older GNU make versions Eduardo Habkost
2018-11-06 14:27 ` Philippe Mathieu-Daudé
2018-11-06 14:38 ` Philippe Mathieu-Daudé
2018-11-06 15:40 ` Peter Maydell
2018-11-07 6:05 ` [Qemu-devel] [Qemu-block] " Markus Armbruster
2018-11-07 11:25 ` Peter Maydell
2018-11-07 12:49 ` Eduardo Habkost
2018-11-07 13:45 ` Peter Maydell
2018-11-07 15:34 ` Eduardo Habkost
2018-11-07 16:22 ` Markus Armbruster
2018-11-08 1:13 ` Cleber Rosa
2018-11-08 8:45 ` Markus Armbruster
2018-11-08 9:11 ` Philippe Mathieu-Daudé
2018-11-08 12:43 ` Markus Armbruster
2018-11-09 17:58 ` Max Reitz
2018-11-12 9:07 ` Markus Armbruster
2018-11-08 16:06 ` Cleber Rosa
2018-11-08 16:51 ` Eduardo Habkost
2018-11-08 17:36 ` Cleber Rosa
2018-11-08 18:26 ` Eduardo Habkost
2018-11-09 0:31 ` Cleber Rosa
2018-10-31 0:31 ` [Qemu-devel] [PULL 12/15] Acceptance tests: add make rule for running them Eduardo Habkost
2018-11-06 23:24 ` Paolo Bonzini
2018-11-28 17:25 ` Eduardo Habkost
2018-10-31 0:31 ` [Qemu-devel] [PULL 13/15] Travis support for the acceptance tests Eduardo Habkost
2018-10-31 0:31 ` [Qemu-devel] [PULL 14/15] scripts/decodetree.py: fix reference to attributes Eduardo Habkost
2018-10-31 0:31 ` [Qemu-devel] [PULL 15/15] scripts/qemu.py: use a more consistent docstring style Eduardo Habkost
2018-11-01 5:02 ` [Qemu-devel] [PULL 00/15] Python queue, 2018-10-30 no-reply
2018-11-01 13:54 ` Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181031003120.26771-8-ehabkost@redhat.com \
--to=ehabkost@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=crosa@redhat.com \
--cc=f4bug@amsat.org \
--cc=famz@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.