From nobody Tue Feb 10 09:59:35 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648110834597409.9484541552396; Thu, 24 Mar 2022 01:33:54 -0700 (PDT) Received: from localhost ([::1]:49664 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nXIun-0003fe-1D for importer@patchew.org; Thu, 24 Mar 2022 04:33:53 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52212) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nXIhm-0005wn-V1 for qemu-devel@nongnu.org; Thu, 24 Mar 2022 04:20:27 -0400 Received: from mout.kundenserver.de ([212.227.126.135]:54823) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nXIhk-0003On-Bm for qemu-devel@nongnu.org; Thu, 24 Mar 2022 04:20:26 -0400 Received: from quad ([82.142.12.150]) by mrelayeu.kundenserver.de (mreue011 [212.227.15.167]) with ESMTPSA (Nemesis) id 1MEVJq-1nIQc32Yuo-00G0tU; Thu, 24 Mar 2022 09:20:21 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Subject: [PULL 04/10] linux-user: Properly handle sigset arg to pselect Date: Thu, 24 Mar 2022 09:20:10 +0100 Message-Id: <20220324082016.3463521-5-laurent@vivier.eu> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220324082016.3463521-1-laurent@vivier.eu> References: <20220324082016.3463521-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:bfJ3jrAxtj2L4It4OZ/JdzQGDXMGqrZYZOJ9DbZJkKRuPxDZgVo 5q0HsXVLAYHGZb24Zaumk/+GVjS8LRZxNv3d8sPSQck5QYdT8BcBwDaw+prLDMrf5zooBlk OKkzN2vhbonA4vDZxRW/kr3jld30s4bLgWY5JyzdaH3V6GI7Flt7witUp7/kcthobYaYXCW 6ja4doaNCJWAHJENaAwIg== X-UI-Out-Filterresults: notjunk:1;V03:K0:sJYDj1PbD/c=:aZVY0KofkaVghyr4xM3rHy dnAMZgXmoNDlXzMDioxhJ8St2vKkZ7ctrZKU4BUDCXhg3j/U+71RmPHkInqTKFplJx6FyMa5U QoP9NF8ZUNJ9YIkupeWWhE8NHmudShn6KM2+2rI2l/uqC+k6QUQpsEGPW2rujQNvlakxYB9HE r4WGwRP5ZqUdApCUilxNLTM30U8wR9H5coLpMwUSJxht1C4daIqY4XiKE7wFf/u9ytsMi2YrE 69UzjrnTWrHaSMWtn7tnFbpTt4CPPM414dQjPXNnTHzFUKGOLimrVz3PCxrCrGmjmlcpeSu0y ebDNk8fQN9xx6TM3pWzfTTZbTW6hgq0XF8cXHqI/dmEmUQkNRq2vIWfSf6rUSS8SBNK2XU5yd Sb1HL9K+uELhOy8s9lWhO5Ddw5D/7cNm8pW7TwyAJ4Kel1/v0FdLCl5m5WvPS8CsMr7a7OJG1 sWR4CdfLn/GhtlS456HysWAO0cLvZn1yGcEgcrnTvJXj+s3JO+GtzbradjDOIToLhdjQ922lo A9/edBmU2MF/XE5rWbpuHoyl56SFoZh9wE0p069gAZilac2FklspUzUlPQP57Jgsx8+OmRu+P MTDeba03AwJEUIQesnc6QSa+lBX+uMQjXSh/Ygtlxs5cDkiPogKxlb4Yhh1jSlnBlioXqN8L0 kWvwu730FM2YwcCq00wdSwnxDvYz+/zLJoW91zn3JZENq/Fg5hADWqZD4VK1L1uLpRGQ= Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: none client-ip=212.227.126.135; envelope-from=laurent@vivier.eu; helo=mout.kundenserver.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Henderson , Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1648110836684100001 Content-Type: text/plain; charset="utf-8" From: Richard Henderson Unblocked signals are never delivered, because we didn't record the new mask for process_pending_signals. Handle this with the same mechanism as sigsuspend. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/834 Signed-off-by: Richard Henderson Reviewed-by: Laurent Vivier Message-Id: <20220315084308.433109-4-richard.henderson@linaro.org> Signed-off-by: Laurent Vivier --- linux-user/syscall.c | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index d9b5662ff820..ffd4cefc8b7a 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -1391,14 +1391,12 @@ static abi_long do_pselect6(abi_long arg1, abi_long= arg2, abi_long arg3, * The 6th arg is actually two args smashed together, * so we cannot use the C library. */ - sigset_t set; struct { sigset_t *set; size_t size; } sig, *sig_ptr; =20 abi_ulong arg_sigset, arg_sigsize, *arg7; - target_sigset_t *target_sigset; =20 n =3D arg1; rfd_addr =3D arg2; @@ -1439,10 +1437,8 @@ static abi_long do_pselect6(abi_long arg1, abi_long = arg2, abi_long arg3, } =20 /* Extract the two packed args for the sigset */ + sig_ptr =3D NULL; if (arg6) { - sig_ptr =3D &sig; - sig.size =3D SIGSET_T_SIZE; - arg7 =3D lock_user(VERIFY_READ, arg6, sizeof(*arg7) * 2, 1); if (!arg7) { return -TARGET_EFAULT; @@ -1452,28 +1448,22 @@ static abi_long do_pselect6(abi_long arg1, abi_long= arg2, abi_long arg3, unlock_user(arg7, arg6, 0); =20 if (arg_sigset) { - sig.set =3D &set; - if (arg_sigsize !=3D sizeof(*target_sigset)) { - /* Like the kernel, we enforce correct size sigsets */ - return -TARGET_EINVAL; - } - target_sigset =3D lock_user(VERIFY_READ, arg_sigset, - sizeof(*target_sigset), 1); - if (!target_sigset) { - return -TARGET_EFAULT; + ret =3D process_sigsuspend_mask(&sig.set, arg_sigset, arg_sigs= ize); + if (ret !=3D 0) { + return ret; } - target_to_host_sigset(&set, target_sigset); - unlock_user(target_sigset, arg_sigset, 0); - } else { - sig.set =3D NULL; + sig_ptr =3D &sig; + sig.size =3D SIGSET_T_SIZE; } - } else { - sig_ptr =3D NULL; } =20 ret =3D get_errno(safe_pselect6(n, rfds_ptr, wfds_ptr, efds_ptr, ts_ptr, sig_ptr)); =20 + if (sig_ptr) { + finish_sigsuspend_mask(ret); + } + if (!is_error(ret)) { if (rfd_addr && copy_to_user_fdset(rfd_addr, &rfds, n)) { return -TARGET_EFAULT; --=20 2.35.1