From nobody Tue Feb 10 19:49:57 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 ARC-Seal: i=1; a=rsa-sha256; t=1621316630; cv=none; d=zohomail.com; s=zohoarc; b=MMyYRzhfrZ7A0GgYHHRL9s7Ji/jwULVPl93wVs6mv9A5qwF+FFEjCkHYbIdxGVPElmohRYtacX94bETDcVRkLS9MNjq9NLqNz+DkmGisGPPM+xGFcX/0+299ExToSyklHaFTVN9p/hxcSsnwY8AT+KY5szfBid/TIIZZXURn3pM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1621316630; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=wZoLARSpdvqVLNjjpLNZp9I6FDFZTQJ9G7VRoh3dCdc=; b=h664mtYQwAYXhnhxoV7lSsFKtQFyyfBsWOhkI3G3GS5Dhkbnn/coA1IDn6vIZRmhEVjuzWOAVXs2CEv0c/fjJtWVS52vFvs9R3dtMQi8DV3X4Ly411Z3NP2ilYEhtWXRgkEpFHIc/LUrVDhLFAOd1zz8tuWIBEhi3pqdSu9DqM4= ARC-Authentication-Results: i=1; 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 1621316630078612.3594141861255; Mon, 17 May 2021 22:43:50 -0700 (PDT) Received: from localhost ([::1]:49718 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lisWC-0007Tv-Vi for importer@patchew.org; Tue, 18 May 2021 01:43:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:38342) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lisKV-0006rH-98 for qemu-devel@nongnu.org; Tue, 18 May 2021 01:31:43 -0400 Received: from mout.kundenserver.de ([212.227.17.13]:50897) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lisKQ-0006sZ-Lg for qemu-devel@nongnu.org; Tue, 18 May 2021 01:31:42 -0400 Received: from quad ([82.142.31.78]) by mrelayeu.kundenserver.de (mreue106 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MS4ab-1lt1c319gZ-00TUiw; Tue, 18 May 2021 07:31:36 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Subject: [PULL 08/59] linux-user: Split out target_restore_altstack Date: Tue, 18 May 2021 07:30:40 +0200 Message-Id: <20210518053131.87212-9-laurent@vivier.eu> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210518053131.87212-1-laurent@vivier.eu> References: <20210518053131.87212-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:TyP3aaOU60R0iEsbpHWQwOBOwhTaHmDdeKiaPCaIRcpfJbf2gUj yfi1kX2KEgVQcSe25TNbPfBKLZEI19xb+vykmW4KlcSuzVSPtah138iMZ9PsY0SI+s0zjBZ Bj/pC4I8XNAp0VSvI/UrHwJUNdyQSKPYR+Z5XslbNiRnG8wQBm758WKWMDkOR0saivs43EQ +69YqfuIc2sUVi9DqOLkg== X-UI-Out-Filterresults: notjunk:1;V03:K0:QzHqGHPNqh4=:eU5UW7lC9JSaEkWbsW1Ryf pm/YI5uIYw42do2+MxIJuxDtEPtG1hSvtpRO9LCrhjldz3w4osDRWkhfCm1uWIY3q6o4iaoDp yI2sY7H9LOzo/w0l+V66qbBZdzfqe0VvEVQuPbdWMG0I72FHL58hmTGOABWj21T7sWbXusvM0 jiW81GQMzh6d4LuyHz96ngaCiP8LOCwZUHSrFccqK0EuKIy/uDzWPIOThRFB+Dc6CGEEkrW0A lBedx7C08azbblqBw58BsauPdFAmSp4S72eDo4aGSGUdFXUsgpIWu47H5z2/DVtd3zYvijPPS UHHcLi+0YCfRNu9qf1zjSKO64QTR4HIqf4gBfvW2a5OjNSLOnlKdpBYDTcX4uimqPd9Hpg3o2 Y7gHY26cGD6ghEmSFuq8un25nG5vU6Y9jZStHw0pBtxRCPPFZoS5fd/4CdPByXrsAv4VpGIIT 6wimN9JLWCd6fRyEudi84bCwDUzOVeue8xgaducAr7giMTRX4f27K8iISSrq34Qfib6tsKL2Y 8wjm83T1x1m+uY1Fl1sIFg= 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.17.13; 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, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 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" Content-Type: text/plain; charset="utf-8" From: Richard Henderson Create a function to match target_save_altstack. Fix some style and unlock issues in do_sigaltstack. Signed-off-by: Richard Henderson Message-Id: <20210426025334.1168495-2-richard.henderson@linaro.org> Signed-off-by: Laurent Vivier --- linux-user/signal-common.h | 1 + linux-user/signal.c | 115 +++++++++++++++++++++---------------- 2 files changed, 66 insertions(+), 50 deletions(-) diff --git a/linux-user/signal-common.h b/linux-user/signal-common.h index 1df1068552fb..34b963af9abc 100644 --- a/linux-user/signal-common.h +++ b/linux-user/signal-common.h @@ -24,6 +24,7 @@ int on_sig_stack(unsigned long sp); int sas_ss_flags(unsigned long sp); abi_ulong target_sigsp(abi_ulong sp, struct target_sigaction *ka); void target_save_altstack(target_stack_t *uss, CPUArchState *env); +abi_long target_restore_altstack(target_stack_t *uss, abi_ulong sp); =20 static inline void target_sigemptyset(target_sigset_t *set) { diff --git a/linux-user/signal.c b/linux-user/signal.c index 7eecec46c407..9daa89eac5db 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -297,6 +297,50 @@ void target_save_altstack(target_stack_t *uss, CPUArch= State *env) __put_user(ts->sigaltstack_used.ss_size, &uss->ss_size); } =20 +abi_long target_restore_altstack(target_stack_t *uss, abi_ulong sp) +{ + TaskState *ts =3D (TaskState *)thread_cpu->opaque; + size_t minstacksize =3D TARGET_MINSIGSTKSZ; + target_stack_t ss; + +#if defined(TARGET_PPC64) + /* ELF V2 for PPC64 has a 4K minimum stack size for signal handlers */ + struct image_info *image =3D ts->info; + if (get_ppc64_abi(image) > 1) { + minstacksize =3D 4096; + } +#endif + + __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(sp)) { + return -TARGET_EPERM; + } + + switch (ss.ss_flags) { + default: + return -TARGET_EINVAL; + + case TARGET_SS_DISABLE: + ss.ss_size =3D 0; + ss.ss_sp =3D 0; + break; + + case TARGET_SS_ONSTACK: + case 0: + if (ss.ss_size < minstacksize) { + return -TARGET_ENOMEM; + } + break; + } + + ts->sigaltstack_used.ss_sp =3D ss.ss_sp; + ts->sigaltstack_used.ss_size =3D ss.ss_size; + return 0; +} + /* siginfo conversion */ =20 static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo, @@ -758,73 +802,44 @@ static void host_signal_handler(int host_signum, sigi= nfo_t *info, /* compare linux/kernel/signal.c:do_sigaltstack() */ abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong= sp) { - int ret; - struct target_sigaltstack oss; - TaskState *ts =3D (TaskState *)thread_cpu->opaque; + target_stack_t oss, *uoss =3D NULL; + abi_long ret =3D -TARGET_EFAULT; + + if (uoss_addr) { + TaskState *ts =3D (TaskState *)thread_cpu->opaque; =20 - /* XXX: test errors */ - if(uoss_addr) - { + /* Verify writability now, but do not alter user memory yet. */ + if (!lock_user_struct(VERIFY_WRITE, uoss, uoss_addr, 0)) { + goto out; + } __put_user(ts->sigaltstack_used.ss_sp, &oss.ss_sp); __put_user(ts->sigaltstack_used.ss_size, &oss.ss_size); __put_user(sas_ss_flags(sp), &oss.ss_flags); } =20 - if(uss_addr) - { - struct target_sigaltstack *uss; - struct target_sigaltstack ss; - size_t minstacksize =3D TARGET_MINSIGSTKSZ; + if (uss_addr) { + target_stack_t *uss; =20 -#if defined(TARGET_PPC64) - /* ELF V2 for PPC64 has a 4K minimum stack size for signal handler= s */ - struct image_info *image =3D ((TaskState *)thread_cpu->opaque)->in= fo; - if (get_ppc64_abi(image) > 1) { - minstacksize =3D 4096; - } -#endif - - ret =3D -TARGET_EFAULT; if (!lock_user_struct(VERIFY_READ, uss, uss_addr, 1)) { goto out; } - __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_EPERM; - if (on_sig_stack(sp)) + ret =3D target_restore_altstack(uss, sp); + if (ret) { goto out; - - ret =3D -TARGET_EINVAL; - if (ss.ss_flags !=3D TARGET_SS_DISABLE - && ss.ss_flags !=3D TARGET_SS_ONSTACK - && ss.ss_flags !=3D 0) - goto out; - - if (ss.ss_flags =3D=3D TARGET_SS_DISABLE) { - ss.ss_size =3D 0; - ss.ss_sp =3D 0; - } else { - ret =3D -TARGET_ENOMEM; - if (ss.ss_size < minstacksize) { - goto out; - } } - - ts->sigaltstack_used.ss_sp =3D ss.ss_sp; - ts->sigaltstack_used.ss_size =3D ss.ss_size; } =20 if (uoss_addr) { - ret =3D -TARGET_EFAULT; - if (copy_to_user(uoss_addr, &oss, sizeof(oss))) - goto out; + memcpy(uoss, &oss, sizeof(oss)); + unlock_user_struct(uoss, uoss_addr, 1); + uoss =3D NULL; } - ret =3D 0; -out: + + out: + if (uoss) { + unlock_user_struct(uoss, uoss_addr, 0); + } return ret; } =20 --=20 2.31.1