From patchwork Thu Mar 24 08:20:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 553903 Delivered-To: patch@linaro.org Received: by 2002:a05:7000:1248:0:0:0:0 with SMTP id z8csp4189842mag; Thu, 24 Mar 2022 01:31:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyj5cYDroEkMJFZUUHJZS3N3JJUWecnoMddnF4XaC2cfGtaL1Dugu6/PbcvZQNyaGx1auYr X-Received: by 2002:ac8:7ee3:0:b0:2e1:a508:c500 with SMTP id r3-20020ac87ee3000000b002e1a508c500mr3328337qtc.117.1648110718261; Thu, 24 Mar 2022 01:31:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648110718; cv=none; d=google.com; s=arc-20160816; b=ZHJd5ojdxPaG4VaaNY5Y0CuPYhP4TWIx5d2MiR8M+4+irAvgbFezt2sah/tkEUMiAO 5oXyM+LyMD1fvFumxSQO48lAgY3k3aEZK22wnXY6S+30UywwTHHBi/6MIPAfCenaEGPh ETycTOBseta43ryuUwEHGgzln9GAfo4iEUicCBL5f6aKQ2W1+S1kYLYd+Jv8w6qlo5Bw GWuFHzAUU1hLwfqMkJAtlzFNFrvQCcsANQQ17Bk1MEao+dVg1Hw+3gUGlTQcd3Yqw/LM 1/9ToUldj/vKlYIkhIRwISg1jK+wUafgDKYQK2q7pt9TQthqUt9UG4tu2vSXQu8v6dEn KfhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from; bh=q7Pwvdrf+6AIIz1HH/QSNujx5ns/6diDptxRae/YdH4=; b=EGZVsNVUERboCLbaslBqV09kLk9VryT9iaUYSRKPst+ECiZq0SGZSc27muEr6aiaHj uqNRKZn+8I9Eyux79JnX53uDZTJJhNZaerFZnmtm88buet/X7KsStBwYMno0Ui7VQgRH h+v5uHBH4hxFc8bhjE+CosnMZUaw5iQCLdRdDz0Q4q87VVIoU7w9ymRNCEwspgPotLRv zIIBY4A6FFP/AVyjSkKYBimh+Xv+VQn6twBukX04y/mqr10n6PohYdWpPBuUoetRXnwV dmvfLibj/kX5i9mr1S/o2kXGc15Qn0Fy/faoHcSB8qz3NRJTN4C2u3qNuD1+4GpbvWu9 2ezw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org" Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id m14-20020ad44a0e000000b00441070e4808si4782054qvz.50.2022.03.24.01.31.58 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Thu, 24 Mar 2022 01:31:58 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org" Received: from localhost ([::1]:45648 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nXIsv-0000pQ-Kp for patch@linaro.org; Thu, 24 Mar 2022 04:31:57 -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 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: 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+patch=linaro.org@nongnu.org Sender: "Qemu-devel" 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; abi_ulong arg_sigset, arg_sigsize, *arg7; - target_sigset_t *target_sigset; n = arg1; rfd_addr = arg2; @@ -1439,10 +1437,8 @@ static abi_long do_pselect6(abi_long arg1, abi_long arg2, abi_long arg3, } /* Extract the two packed args for the sigset */ + sig_ptr = NULL; if (arg6) { - sig_ptr = &sig; - sig.size = SIGSET_T_SIZE; - arg7 = 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); if (arg_sigset) { - sig.set = &set; - if (arg_sigsize != sizeof(*target_sigset)) { - /* Like the kernel, we enforce correct size sigsets */ - return -TARGET_EINVAL; - } - target_sigset = lock_user(VERIFY_READ, arg_sigset, - sizeof(*target_sigset), 1); - if (!target_sigset) { - return -TARGET_EFAULT; + ret = process_sigsuspend_mask(&sig.set, arg_sigset, arg_sigsize); + if (ret != 0) { + return ret; } - target_to_host_sigset(&set, target_sigset); - unlock_user(target_sigset, arg_sigset, 0); - } else { - sig.set = NULL; + sig_ptr = &sig; + sig.size = SIGSET_T_SIZE; } - } else { - sig_ptr = NULL; } ret = get_errno(safe_pselect6(n, rfds_ptr, wfds_ptr, efds_ptr, ts_ptr, sig_ptr)); + 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;