From nobody Sun Mar 22 14:09:27 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1774101463; cv=none; d=zohomail.com; s=zohoarc; b=N49UmuJNxJwnOtxzHsd7a+E2PhP9L5A7gIIZVJ4JSZ5ifJCprQum4eyCIHtOYnSVMqLGXDTxWqlKsS7+R8MCh/aE486CVz5FWCKoY1BBG5C9PPqRkgaz0jGydb8aIGY1BePRdpV2Pggdnwwgh++Xl1w7Xk4bOcB8OoDD9fAU/5s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774101463; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=rbA6YNQSXrCmeEuAYqUodFtq31D0H7TEzGScaa4W5mE=; b=Mrn4YNVdRvCpnicaGb7NeX52nQUrN0Ag7/lmBVW5HNUuOFsJPIdY0K8gMX0M6F7e82G/C2narT81tLYTEACGFa1q6qhlOdM01GGagV5XD1kT76qW0Kc5A5zIW/9Oxm5/qhTXdEnR3WCUaN9eNHfJ9fboLTEW/w0Bd86XtA7tYr0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1774101463597644.4563620746759; Sat, 21 Mar 2026 06:57:43 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w3wou-0008Ru-EE; Sat, 21 Mar 2026 09:56:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w3wos-0008RM-A2 for qemu-devel@nongnu.org; Sat, 21 Mar 2026 09:56:50 -0400 Received: from mail-pl1-x631.google.com ([2607:f8b0:4864:20::631]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1w3woq-0000VM-J4 for qemu-devel@nongnu.org; Sat, 21 Mar 2026 09:56:50 -0400 Received: by mail-pl1-x631.google.com with SMTP id d9443c01a7336-2b056b7f783so14094635ad.1 for ; Sat, 21 Mar 2026 06:56:48 -0700 (PDT) Received: from lima-default (103.95.112.190.qld.leaptel.network. [103.95.112.190]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b08354bce3sm66285675ad.32.2026.03.21.06.56.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Mar 2026 06:56:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1774101406; x=1774706206; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rbA6YNQSXrCmeEuAYqUodFtq31D0H7TEzGScaa4W5mE=; b=ZSLX+7tzOzjJ7su2UE5iY7NiIWB2+skIH5tUgDhJpClsefmDx4j5rS3IqcpO5DdNl0 /nYprN0Tvdwu/QpmsB8ARkaZjLnCY+rS8oBTJeq46d5jygkmyjyf2g/FdzMbHVBlSd+I xnIBRLWHbmUp6+xn2dMau8zYTmxsDXN3NGyjfLZ6WIsZthrA423d2rK3TAWKawbEnxi8 1DGqhL3KDCzGIX0yrnWOt/a2TdkbkKFCaxpc22n27WIUO36y/5OGd/qpcNRzVBmY/FZm 51nPQLhHfSVABfNO3tzCdK34hmtPD2K2Dklsl9BrksM/SvUYxpyCamWAqLDuH2caD9r7 Wq9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774101406; x=1774706206; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=rbA6YNQSXrCmeEuAYqUodFtq31D0H7TEzGScaa4W5mE=; b=SEMvZUHrf0J7z2xwTes3+2eVlOPcmj7S4YsQvgS9BAzC4gqsVNAdT3GmOapdYgsKIZ Vuu7TV77Y+YGg4sXkJlgaqbA4zFM5S7wbzMFK7Lceq2cVy7kVzPN0Ass+t3hf7mhxf66 8KMCG+aK07GBhk8ympl/FmJOwK718UobeKdaC2wUfr2MO6blWJy3EpKyfRLzRLKdO0/H yiZgc1Gui+b9wvjSfs5w6OOH5D1HVkqS4McUOO7qctHE0meCfY4EZmDR0adG8KhMqSZm u1DBGK0cqXYBaSfG77ekjB5khf/W8q4SrEvRn/dD7SnQUgrQl3MIBNSsGEEAriI6buzX MkGQ== X-Gm-Message-State: AOJu0Ywom8Iqhc5uBpYLabAKWUwDKfei1Z+hum485Kr/4mwvmUyoDCi+ CgrxoMni6pG0FTtflLInTkyCW+Bnzp1kmRtrSoy853pLs6JbLRGNr9OldcbdUA== X-Gm-Gg: ATEYQzywmVBOAjuKEoK8fBcImKOri4R18glxOWAXA50s0djI+gjv/kCFUe+6bCogbP/ uBtAO+hw5R+IkfK5i/fzf8TKZYDFaL3vCoTbrG6BGhww+T7NWh9TDfCGuOZSLiajz1tI7e9gzrE ozHJw0sC/6yL0eX/JoWQilJkubiDliA7UDSnPvHbqgXzeTBl1DPO5HMRmP2/oiU8DqEjzLfuKX6 XsXyU7XmJQ4bnsTX3hw8LUGgaR1jztwJtaQPrpE48RU+ZZMNfCeneZcCa7D4N++Wpd5L4j85M/o 9T1S8FJGkMu9Xg8+ceiBmcESMhfzqVne7yyAjJrKQnJ22Km1qpqPJhbRV2nmcoDt+wdbvo2GsXA 3cls6ZbHeZ88mIC8b/Zepgl9lEtKxuNvhZB2mMBajzMdWaVPbEoRyRXT5ngcuOuD5cAU1EUYNGc HnMPaFVfwBEox9CWbW/SQPKAT1NVQ/fKk+uQrpr3Z0YcUpwAT66psNAkCYK8AAfppjYrHPQqxPh SM8bhw= X-Received: by 2002:a17:902:f54c:b0:2ae:ced7:465f with SMTP id d9443c01a7336-2b082735088mr54726515ad.7.1774101406330; Sat, 21 Mar 2026 06:56:46 -0700 (PDT) From: Nicholas Piggin To: qemu-devel@nongnu.org Cc: Nicholas Piggin , Warner Losh , Kyle Evans , Laurent Vivier , Pierrick Bouvier , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Peter Maydell Subject: [PATCH 1/3] linux-user: sigaltstack lock_user_struct missing unlock Date: Sat, 21 Mar 2026 23:56:21 +1000 Message-ID: <20260321135624.581398-2-npiggin@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260321135624.581398-1-npiggin@gmail.com> References: <20260321135624.581398-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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: pass client-ip=2607:f8b0:4864:20::631; envelope-from=npiggin@gmail.com; helo=mail-pl1-x631.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1774101466279158500 Content-Type: text/plain; charset="utf-8" lock_user_struct is missing a corresponding unlock. (bsd-user does correctly unlock in the equivalent code.) Signed-off-by: Nicholas Piggin --- linux-user/signal.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/linux-user/signal.c b/linux-user/signal.c index 804096bd44..e4b8b28bfe 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -292,11 +292,10 @@ void target_save_altstack(target_stack_t *uss, CPUArc= hState *env) __put_user(ts->sigaltstack_used.ss_size, &uss->ss_size); } =20 -abi_long target_restore_altstack(target_stack_t *uss, CPUArchState *env) +abi_long target_restore_altstack(target_stack_t *ss, CPUArchState *env) { TaskState *ts =3D get_task_state(thread_cpu); size_t minstacksize =3D TARGET_MINSIGSTKSZ; - target_stack_t ss; =20 #if defined(TARGET_PPC64) /* ELF V2 for PPC64 has a 4K minimum stack size for signal handlers */ @@ -306,33 +305,29 @@ abi_long target_restore_altstack(target_stack_t *uss,= CPUArchState *env) } #endif =20 - __get_user(ss.ss_sp, &uss->ss_sp); - __get_user(ss.ss_size, &uss->ss_size); - __get_user(ss.ss_flags, &uss->ss_flags); - if (on_sig_stack(get_sp_from_cpustate(env))) { return -TARGET_EPERM; } =20 - switch (ss.ss_flags) { + switch (ss->ss_flags) { default: return -TARGET_EINVAL; =20 case TARGET_SS_DISABLE: - ss.ss_size =3D 0; - ss.ss_sp =3D 0; + ss->ss_sp =3D 0; + ss->ss_size =3D 0; break; =20 case TARGET_SS_ONSTACK: case 0: - if (ss.ss_size < minstacksize) { + if (ss->ss_size < minstacksize) { return -TARGET_ENOMEM; } break; } =20 - ts->sigaltstack_used.ss_sp =3D ss.ss_sp; - ts->sigaltstack_used.ss_size =3D ss.ss_size; + ts->sigaltstack_used.ss_sp =3D ss->ss_sp; + ts->sigaltstack_used.ss_size =3D ss->ss_size; return 0; } =20 @@ -1140,11 +1135,17 @@ abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulo= ng uoss_addr, =20 if (uss_addr) { target_stack_t *uss; + target_stack_t ss; =20 if (!lock_user_struct(VERIFY_READ, uss, uss_addr, 1)) { goto out; } - ret =3D target_restore_altstack(uss, env); + __get_user(ss.ss_sp, &uss->ss_sp); + __get_user(ss.ss_size, &uss->ss_size); + __get_user(ss.ss_flags, &uss->ss_flags); + unlock_user_struct(uss, uss_addr, 0); + + ret =3D target_restore_altstack(&ss, env); if (ret) { goto out; } --=20 2.51.0 From nobody Sun Mar 22 14:09:27 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1774101469; cv=none; d=zohomail.com; s=zohoarc; b=SAUic0xlFlBUR84Jp7znwCa1LeFCFseNKKGMfUXMHoc7E7/1BlgH+M16BTX4SxG82ssmmm6tgFTN3kuWdpbFvKusFz/qsURt8rqMvUglnhiDRmoeWf+BrUSKUZdStikkrZcTcs9svaR+pbqQTtLH8xEkjayFSgs/V+j7KMdVkL0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774101469; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=33bK0g5AvUfHWijJiI0bLgMdG2DgEQ/sawsGLjJgXd8=; b=Feal53UsINXmj07Gd+e39O4qXacBPl1sJVNK2Y39LRfg+8Pa5BIb1nrvk/vLN0AO4Ub20+Fo6p9WVlTfB4RHtK/7azQH65cvTuseWkX3+m1E6rDxIHc1PhKTgMHDiPGApQdcaYgKyHhnQsCwnqbLyUWo+IgcbTx8fcHmqt1vKv8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1774101469682189.98285666543313; Sat, 21 Mar 2026 06:57:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w3wox-0008SZ-SJ; Sat, 21 Mar 2026 09:56:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w3wow-0008SR-Oz for qemu-devel@nongnu.org; Sat, 21 Mar 2026 09:56:54 -0400 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1w3wov-0000Vp-4Z for qemu-devel@nongnu.org; Sat, 21 Mar 2026 09:56:54 -0400 Received: by mail-pl1-x62d.google.com with SMTP id d9443c01a7336-2adbfab4501so6355055ad.2 for ; Sat, 21 Mar 2026 06:56:52 -0700 (PDT) Received: from lima-default (103.95.112.190.qld.leaptel.network. [103.95.112.190]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b08354bce3sm66285675ad.32.2026.03.21.06.56.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Mar 2026 06:56:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1774101411; x=1774706211; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=33bK0g5AvUfHWijJiI0bLgMdG2DgEQ/sawsGLjJgXd8=; b=kAmUAsG2ATmIheurfLDKt++ncy3ogCjJe/0rylLEd2wytRyq0ecfMMxPg8oNjpvoMu oR+Ai5U4yR8TqStVWexZ5nWpHv01jE7GcC9FG7//yFl/TrpNVRl7Nvkw4I/4Vc2oXzcD ymxNuMSwhtKw+BnzlE7u9ZX+pMz5LIG7z7UkGPUe4TnuJHS55dXxwECSYouOcfKRI5Zm N3GMgLy9aUsPReQlO9N3xn2nu8Uqo6qbV1XscFXeBBwxfwAA/gmopHJzkWCgZ31ZHaS7 QYvhePoEcb1XzRqtBoLZwJHK5+/Baqtpf1YOPRiqv6JfZGFfu1sGoeFMtdrdJFJG76R3 TpbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774101411; x=1774706211; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=33bK0g5AvUfHWijJiI0bLgMdG2DgEQ/sawsGLjJgXd8=; b=prmYnK8zjXeJX39BUVBjC5eLPzer+49TMRqTkczpKdXNdG39RPc/Fv0DbsSLtUC1jW 3eXSDORQJvZKVHNhMOLLvBwUGbEpPRZjLLe6Zat4zgQAgZijrgVsCyacgNEUNkCT+IUL TaQtwRJ7TzXBiTevo0ixuT6k9GNcPTn33bAnDNuqV5MYRRdOADAm1IvihKm3XEnzmQLf 3n1eYB7SseNlmNW5UwxYeLIq6J6IZkGjV+FMIkVHqsV33lBnjsUXT0gFumcroSSEQanv chDXeUjR4oP+SJGOBA6qPBEsg8N+A5J582rPxQZKQRGK1KqfbAcNNtX/dVxvN4T1mRWB 6yAw== X-Gm-Message-State: AOJu0YzPYeQG71C5DgEfPNEkvO8qnWU2Y9/b9Icd3lnHQXwzwa4DOW// MDfFrU61qX1nHNi5ZcDbedrGZM5Ok5EIoD3iDUi0GuCpUFWOz+oEvwauuufdZg== X-Gm-Gg: ATEYQzxBXNAWtaV/cWxMChMeJNVQ+x1zK7KjQXsbYLHuRB0mm8YNSoxo3GkRzy2HXSA IfOqVGQBvvnR7/su0uYThAKGWCzbFsf7R1lzXAVcCM/6GgW3e9rcmU/DihQ+rHJGXXBF9z3vFKT uJy84wGd+YHUT/fAxV6focwiRSWM1sX4MU9F+UGBJIqJ4IE3LsDXzPH+WlnER14msO/2AEGTfRg deVLPfEALXF63LfG6Z93UQpHULDcep8CLrbltSJtDouzwymzWn0zZ58WO0u6BvKk4XPazYc2lTD w4OhfWVkFNxgCQd1Bc40v2Z7jBK8wgBJnUGNECyrsUy6erHIPp7Z+Dc9uGvgpkke/ypVMWoXz7L 00Aw71IGdE3i5IdXPgmX1p/bBCZvACo8u0Xl5TVxvfettoMQMKGj7fOe1Jr8mrmV4WgQf0IpCak dteFqpa23QngYMgf7oJh46mtECYB4lkyeLBExKQf2SiPLmJVxXEX+JPZPcP1zWAQ9jI/Luf+40M PZ+7r0= X-Received: by 2002:a17:902:ccd2:b0:2b0:5682:6973 with SMTP id d9443c01a7336-2b08273d0d4mr58134035ad.19.1774101411065; Sat, 21 Mar 2026 06:56:51 -0700 (PDT) From: Nicholas Piggin To: qemu-devel@nongnu.org Cc: Nicholas Piggin , Warner Losh , Kyle Evans , Laurent Vivier , Pierrick Bouvier , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Peter Maydell Subject: [PATCH 2/3] bsd-user, linux-user: signal: recursive signal delivery fix Date: Sat, 21 Mar 2026 23:56:22 +1000 Message-ID: <20260321135624.581398-3-npiggin@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260321135624.581398-1-npiggin@gmail.com> References: <20260321135624.581398-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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: pass client-ip=2607:f8b0:4864:20::62d; envelope-from=npiggin@gmail.com; helo=mail-pl1-x62d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1774101472848154100 Content-Type: text/plain; charset="utf-8" Synchronous signals must accommodate a synchronous signal being raised during delivery, as asynchronous ones do. For example badframe errors during delivery will cause SIGSEGV to be raised. Without this fix, cpu_loop() runs process_pending_signals() which delivers the first synchronous signal (e.g., SIGILL) which fails to set the handler and forces SIGSEGV, but that is not picked up. process_pending_signals() returns. Then cpu_loop() runs cpu_exec() again, which attempts to execute the same instruction, another SIGILL. Signed-off-by: Nicholas Piggin Reviewed-by: Warner Losh --- bsd-user/signal.c | 10 ++++++---- linux-user/signal.c | 9 ++++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/bsd-user/signal.c b/bsd-user/signal.c index dadcc037dc..3e5e41e1b1 100644 --- a/bsd-user/signal.c +++ b/bsd-user/signal.c @@ -998,7 +998,12 @@ void process_pending_signals(CPUArchState *env) sigdelset(&ts->signal_mask, target_to_host_signal(sig)); sigact_table[sig - 1]._sa_handler =3D TARGET_SIG_DFL; } + /* + * Restart scan from the beginning, as handle_pending_signal + * might have resulted in a new synchronous signal (eg SIGSEGV= ). + */ handle_pending_signal(env, sig, &ts->sync_signal); + goto restart_scan; } =20 k =3D ts->sigtab; @@ -1008,10 +1013,7 @@ void process_pending_signals(CPUArchState *env) if (k->pending && !sigismember(blocked_set, target_to_host_signal(sig))) { handle_pending_signal(env, sig, k); - /* - * Restart scan from the beginning, as handle_pending_sign= al - * might have resulted in a new synchronous signal (eg SIG= SEGV). - */ + /* Restart scan, explained above. */ goto restart_scan; } } diff --git a/linux-user/signal.c b/linux-user/signal.c index e4b8b28bfe..9d43e080ce 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -1385,6 +1385,11 @@ void process_pending_signals(CPUArchState *cpu_env) } =20 handle_pending_signal(cpu_env, sig, &ts->sync_signal); + /* + * Restart scan from the beginning, as handle_pending_signal + * might have resulted in a new synchronous signal (eg SIGSEGV= ). + */ + goto restart_scan; } =20 for (sig =3D 1; sig <=3D TARGET_NSIG; sig++) { @@ -1395,9 +1400,7 @@ void process_pending_signals(CPUArchState *cpu_env) (!sigismember(blocked_set, target_to_host_signal_table[sig]))) { handle_pending_signal(cpu_env, sig, &ts->sigtab[sig - 1]); - /* Restart scan from the beginning, as handle_pending_sign= al - * might have resulted in a new synchronous signal (eg SIG= SEGV). - */ + /* Restart scan, explained above. */ goto restart_scan; } } --=20 2.51.0 From nobody Sun Mar 22 14:09:27 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1774101463; cv=none; d=zohomail.com; s=zohoarc; b=EYf4j0hC0jo+xjw2DgOf/IhOIFzKNOziBorbVgYkcDCSwQM2ySAcmEg7WQclLeF3rEXnfM+sYAt504qpcgYIT2NqCSmPgTI88EZFsuknCUShZ7BbgMDYvM8CYVp0MtDbs70UIQrAYyomW6ZL9R03bUA2xDvaajlE5Cq2f987l6g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774101463; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=lIthGQhk0jMuFWhQ1BF4ILV2kWgl3q/gQbn7PvztXD8=; b=HShuLGS7Kr2KylOhUHFxygjKkplPerwJQhBtzFoAWVXR5l3tjJGIbgem/Uaeyud+xzqXfhwbdBcnlX7GvWBI2uzW7QC02qi+1tqjS2CO5vR+SyQFXCGr3JrwQMe9iwmOHwa0kgbnv5eBUKmaMTLoW8jdd/IGEBs2Fq6nsvZcMsw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1774101463681323.2059171194352; Sat, 21 Mar 2026 06:57:43 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w3wp3-0008Uy-DL; Sat, 21 Mar 2026 09:57:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w3wp2-0008Ub-C5 for qemu-devel@nongnu.org; Sat, 21 Mar 2026 09:57:00 -0400 Received: from mail-pl1-x62c.google.com ([2607:f8b0:4864:20::62c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1w3wp0-0000W5-KE for qemu-devel@nongnu.org; Sat, 21 Mar 2026 09:57:00 -0400 Received: by mail-pl1-x62c.google.com with SMTP id d9443c01a7336-2b0603ee486so19649295ad.0 for ; Sat, 21 Mar 2026 06:56:58 -0700 (PDT) Received: from lima-default (103.95.112.190.qld.leaptel.network. [103.95.112.190]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b08354bce3sm66285675ad.32.2026.03.21.06.56.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Mar 2026 06:56:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1774101416; x=1774706216; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lIthGQhk0jMuFWhQ1BF4ILV2kWgl3q/gQbn7PvztXD8=; b=SsCzNOPbPvxjt8qnrIKE1Cb4LHLPo4O+XXqGnFfTy+Ob8yvX5dYzL3cWjdJbr55970 0oRW5tK67g2Dr0dBl4nlKvktnVijntdBJJ6/rgv7ckgEYB8Q00o/zuVn8EUTZfU7pbM/ q32Ph610rgOUZTUainHq5jsfzzNY62+n14+wzfJrotQjYYc7Sdkp6ZVxL5HQtap2KeT6 kQ0C+PD2HUa2ShDBGDTxd/uLojDACarguJy1hN3wkTtWSZncZ1zii13yfkyDCx0p2hxj L2Pb8B+Dj2MSZPPjga9ndv9b1NYOf+V0aW6vyFkga48ZLQlRRQe8cK5OH+YTd8sfv797 kc9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774101416; x=1774706216; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=lIthGQhk0jMuFWhQ1BF4ILV2kWgl3q/gQbn7PvztXD8=; b=IzBa3VGcR5iE72QxYUKVsWQ0zj+xpsgh7xKlqq5sKK7TmDHij7FdbfYbiiHc+4vwXx KTjhCCjOyzppumF08LspTBE33lNSc466iZcZiEJLjUCyAyT6vlIKWOVjUY4GxyveVEw9 cjhUuhxfBPPVn0DIEkGFUnP0fMnVOHuCLCPBBot9AKUKF59SCDqHkg7RH4x6i96GvAvf WaVu0oNJW6DrgyG8EZmk4FQG6YMrK9aHIeIsLaD6NfeBQAfaX9mI6d+paeemikMfwfhp LWq0IB4Rl8wS5S2xywu10PXpTYK4uqeuh3P7C7UVk/ml6qKreqx2xBlmKUFJ9yBHXG3C UdlA== X-Gm-Message-State: AOJu0YwwHnwnCz7XHdFA6IoGhLFQmRRIqc7oJXkCTO62+nqSy/VZZ8Yu Nj4uRxF+JCsXPvadB6AgnKPmpH/+zUaeB4f0yXot6N2diTkOy7Yr6bAbt3B8jg== X-Gm-Gg: ATEYQzwTD28R9rBib3O0EEldDDOSdd8SqwuzTn1g80wyRdAs3s9jj2xIMowBMQ+EmTJ nEVjBUO3GCPAiZJeI7s0+fUc0DQCbBsyV/S8WO//gL+DwSLlaglfyRfFsCvliFfMLzHwMVeMfB/ cBMofxs+4g+icL/lgOLVqxaowqCIvKPCmoVMbYMtJEoxRSaBonqeZvA8NvwAvMziQ0n+kz9qc4w EGr4WvN+7gk0xMJVVbdjlDsqh9y1S7z7LTojzpvJoZ6ATeZ2UcWRVspC7O3L57QVjG5atvrPmcg 9r8nzAZdQ0o0xYC1nz6TPmSYDRvIDxNLDuCQWgXaytbTOdjiztwHIXa1ithrADcTh0ew7bePZ16 PMa5ETcBrqKw22OA8FYhNlQu4d2uUZqSlqQ2qqQziQkzp83b9GhT4ybOpQHbFBVTtwzaiAeTAI9 X/ZlnefEfOnK6XFb0kfc8z+kssM+O81qJfDo1llkjLNzs2+/V/q4BhKofXVEmrteyjlsXs X-Received: by 2002:a17:902:e811:b0:2b0:7b57:830f with SMTP id d9443c01a7336-2b082769cccmr56869405ad.33.1774101415916; Sat, 21 Mar 2026 06:56:55 -0700 (PDT) From: Nicholas Piggin To: qemu-devel@nongnu.org Cc: Nicholas Piggin , Warner Losh , Kyle Evans , Laurent Vivier , Pierrick Bouvier , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Peter Maydell Subject: [PATCH 3/3] tests/tcg: add recursive signal delivery tests Date: Sat, 21 Mar 2026 23:56:23 +1000 Message-ID: <20260321135624.581398-4-npiggin@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260321135624.581398-1-npiggin@gmail.com> References: <20260321135624.581398-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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: pass client-ip=2607:f8b0:4864:20::62c; envelope-from=npiggin@gmail.com; helo=mail-pl1-x62c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1774101465141158500 Content-Type: text/plain; charset="utf-8" Add tests which exercise a synchronous signal being raised in synchronous and asynchronous signal delivery paths. It does this by delivering them with an altstack that is made inaccessible, then catching the badframe SIGSEGV with a handler on the regular stack. Signed-off-by: Nicholas Piggin --- tests/tcg/multiarch/badsig.c | 226 +++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 tests/tcg/multiarch/badsig.c diff --git a/tests/tcg/multiarch/badsig.c b/tests/tcg/multiarch/badsig.c new file mode 100644 index 0000000000..0f346f4147 --- /dev/null +++ b/tests/tcg/multiarch/badsig.c @@ -0,0 +1,226 @@ +/* + * linux-user "badframe" signal handling tests. + * + * Copyright (c) 2026 Tenstorrent USA, Inc. + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Test "badframe" signal handling paths, which force a + * SIGSEGV signal from the signal handler setup code, + * which tests the recursive signal "restart_scan" logic + * in process_pending_signals(). + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#undef DEBUG +#ifdef DEBUG +#define dprintf(...) printf(__VA_ARGS__) +#else +#define dprintf(...) +#endif + +static void error1(const char *filename, int line, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d: ", filename, line); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); + exit(1); +} + +static int __chk_error(const char *filename, int line, int ret) +{ + if (ret < 0) { + error1(filename, line, "%m (ret=3D%d, errno=3D%d/%s)", + ret, errno, strerror(errno)); + } + return ret; +} + +#define error(fmt, ...) error1(__FILE__, __LINE__, fmt, ## __VA_ARGS__) + +#define chk_error(ret) __chk_error(__FILE__, __LINE__, (ret)) + +static bool do_siglongjmp; +static sigjmp_buf current_sigjmp_buf; + +static volatile int total_alarm_count; + +static void sig_alarm(int sig, siginfo_t *info, void *puc) +{ + if (sig !=3D SIGRTMIN) { + error("unexpected signal"); + } + dprintf("SIGRTMIN\n"); + total_alarm_count++; +} + +static volatile int total_segv_count; + +static void sig_segv(int sig, siginfo_t *info, void *puc) +{ + if (sig !=3D SIGSEGV) { + error("unexpected signal"); + } + dprintf("SIGSEGV\n"); + total_segv_count++; + if (do_siglongjmp) { + dprintf("siglongjmp()\n"); + siglongjmp(current_sigjmp_buf, 1); + } +} + +static volatile int total_trap_count; + +static void sig_trap(int sig, siginfo_t *info, void *puc) +{ + if (sig =3D=3D SIGTRAP) { + dprintf("SIGTRAP\n"); + } else if (sig =3D=3D SIGILL) { + dprintf("SIGILL\n"); + } else if (sig =3D=3D SIGABRT) { + dprintf("SIGABRT\n"); + } else { + error("unexpected signal"); + } + total_trap_count++; + if (do_siglongjmp) { + dprintf("siglongjmp()\n"); + siglongjmp(current_sigjmp_buf, 1); + } +} + +static void test_signals(void) +{ + struct sigaction act; + struct itimerspec it; + timer_t tid; + struct sigevent sev; + stack_t ss; + void *mem; + + /* Set up SEGV handler */ + act.sa_sigaction =3D sig_segv; + sigemptyset(&act.sa_mask); + act.sa_flags =3D SA_SIGINFO; + chk_error(sigaction(SIGSEGV, &act, NULL)); + + /* Set up an altstack */ + mem =3D mmap(NULL, SIGSTKSZ, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (mem =3D=3D MAP_FAILED) { + fprintf(stderr, "out of memory"); + exit(EXIT_FAILURE); + } + + ss.ss_sp =3D mem; + ss.ss_flags =3D 0; + ss.ss_size =3D SIGSTKSZ; + chk_error(sigaltstack(&ss, NULL)); + + /* Async signal test */ + + /* Set up RTMIN handler on alt stack */ + act.sa_sigaction =3D sig_alarm; + sigemptyset(&act.sa_mask); + act.sa_flags =3D SA_SIGINFO | SA_ONSTACK; + chk_error(sigaction(SIGRTMIN, &act, NULL)); + + /* Create POSIX timer */ + sev.sigev_notify =3D SIGEV_SIGNAL; + sev.sigev_signo =3D SIGRTMIN; + sev.sigev_value.sival_ptr =3D &tid; + chk_error(timer_create(CLOCK_REALTIME, &sev, &tid)); + + it.it_interval.tv_sec =3D 0; + it.it_interval.tv_nsec =3D 1000000; + it.it_value.tv_sec =3D 0; + it.it_value.tv_nsec =3D 1000000; + chk_error(timer_settime(tid, 0, &it, NULL)); + + while (total_alarm_count =3D=3D 0) { + usleep(1000); + } + total_alarm_count =3D 0; + + chk_error(timer_delete(tid)); + + assert(total_segv_count =3D=3D 0); + + /* Make the alt stack bad */ + chk_error(mprotect(mem, SIGSTKSZ, PROT_NONE)); + + chk_error(timer_create(CLOCK_REALTIME, &sev, &tid)); + chk_error(timer_settime(tid, 0, &it, NULL)); + + while (total_segv_count =3D=3D 0) { + usleep(1000); + } + total_segv_count =3D 0; + + chk_error(timer_delete(tid)); + + assert(total_alarm_count =3D=3D 0); + + /* Make the alt stack good */ + chk_error(mprotect(mem, SIGSTKSZ, PROT_READ | PROT_WRITE)); + + /* Bad sync signal test */ + + /* Set up SIGILL/TRAP/ABRT handler on alt stack */ + act.sa_sigaction =3D sig_trap; + sigemptyset(&act.sa_mask); + act.sa_flags =3D SA_SIGINFO | SA_ONSTACK; + chk_error(sigaction(SIGTRAP, &act, NULL)); + chk_error(sigaction(SIGILL, &act, NULL)); + chk_error(sigaction(SIGABRT, &act, NULL)); + + if (sigsetjmp(current_sigjmp_buf, 1) =3D=3D 0) { + do_siglongjmp =3D true; + /* Cause a synchronous signal */ + dprintf("__builtin_trap()\n"); + __builtin_trap(); + assert(0); + } + do_siglongjmp =3D false; + assert(total_trap_count =3D=3D 1); + total_trap_count =3D 0; + assert(total_segv_count =3D=3D 0); + + /* Make the alt stack bad */ + chk_error(mprotect(mem, SIGSTKSZ, PROT_NONE)); + + if (sigsetjmp(current_sigjmp_buf, 1) =3D=3D 0) { + do_siglongjmp =3D true; + /* Cause a synchronous signal */ + dprintf("__builtin_trap()\n"); + __builtin_trap(); + assert(0); + } + do_siglongjmp =3D false; + assert(total_segv_count =3D=3D 1); + total_segv_count =3D 0; + assert(total_trap_count =3D=3D 0); +} + +int main(int argc, char **argv) +{ + test_signals(); + return 0; +} --=20 2.51.0