From nobody Thu Nov 6 12:14:36 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1540946302669402.9637904743561; Tue, 30 Oct 2018 17:38:22 -0700 (PDT) Received: from localhost ([::1]:56273 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gHeWb-00004q-F2 for importer@patchew.org; Tue, 30 Oct 2018 20:38:21 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43069) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gHeQP-0002D0-GP for qemu-devel@nongnu.org; Tue, 30 Oct 2018 20:32:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gHeQM-0003uJ-U3 for qemu-devel@nongnu.org; Tue, 30 Oct 2018 20:31:57 -0400 Received: from mx1.redhat.com ([209.132.183.28]:52758) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gHeQI-0003og-Ca; Tue, 30 Oct 2018 20:31:50 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8C31C356D4; Wed, 31 Oct 2018 00:31:49 +0000 (UTC) Received: from localhost (ovpn-116-56.gru2.redhat.com [10.97.116.56]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7BC0C19745; Wed, 31 Oct 2018 00:31:46 +0000 (UTC) From: Eduardo Habkost To: Peter Maydell , qemu-devel@nongnu.org Date: Tue, 30 Oct 2018 21:31:12 -0300 Message-Id: <20181031003120.26771-8-ehabkost@redhat.com> In-Reply-To: <20181031003120.26771-1-ehabkost@redhat.com> References: <20181031003120.26771-1-ehabkost@redhat.com> X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Wed, 31 Oct 2018 00:31:49 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 07/15] iotests: Explicitly bequeath FDs in Python X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Fam Zheng , Eduardo Habkost , qemu-block@nongnu.org, =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Max Reitz , Cleber Rosa , =?UTF-8?q?Alex=20Benn=C3=A9e?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Max Reitz 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 Reviewed-by: Eduardo Habkost Reviewed-by: Cleber Rosa Message-Id: <20181022135307.14398-7-mreitz@redhat.com> Signed-off-by: Eduardo Habkost --- 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) =20 + # 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 =20 - 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=3DNone, file_path=3DNone): # 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 =3D ["%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 =3D open(os.path.devnull, 'rb') proc =3D subprocess.Popen(fd_param, stdin=3Ddevnull, stdout=3Dsubp= rocess.PIPE, - stderr=3Dsubprocess.STDOUT) + stderr=3Dsubprocess.STDOUT, close_fds=3DFa= lse) output =3D proc.communicate()[0] if output: LOG.debug(output) @@ -286,7 +309,8 @@ class QEMUMachine(object): stdin=3Ddevnull, stdout=3Dself._qemu_log_file, stderr=3Dsubprocess.STDOUT, - shell=3DFalse) + shell=3DFalse, + close_fds=3DFalse) self._post_launch() =20 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) =20 def _send_fd_by_SCM(self): - ret =3D self.vm.send_fd_scm(image0) + ret =3D self.vm.send_fd_scm(file_path=3Dimage0) self.assertEqual(ret, 0, 'Failed to send fd with UNIX SCM') =20 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 =3D socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sockfd.connect(unix_socket) =20 - result =3D self.vm.send_fd_scm(str(sockfd.fileno())) + result =3D self.vm.send_fd_scm(fd=3Dsockfd.fileno()) self.assertEqual(result, 0, 'Failed to send socket FD') =20 result =3D self.vm.qmp('getfd', fdname=3D'nbd-fifo') --=20 2.18.0.rc1.1.g3f1ff2140