From patchwork Mon Oct 14 20:56:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 176341 Delivered-To: patch@linaro.org Received: by 2002:a92:7e96:0:0:0:0:0 with SMTP id q22csp5011992ill; Mon, 14 Oct 2019 13:58:13 -0700 (PDT) X-Google-Smtp-Source: APXvYqxOIafbrBxHCAzGfAHrrhP8Hh5UIG+PwcJbDTZep33S+N+5yQk48y+mxu/p9Gu3Rmwzy1DG X-Received: by 2002:a17:906:3c4:: with SMTP id c4mr11106959eja.302.1571086693153; Mon, 14 Oct 2019 13:58:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1571086693; cv=none; d=google.com; s=arc-20160816; b=sMo/WX1ZUwd70o1OqeqpFTYiqmiM5lQcRVoiy0maqrsXmlrIh594XTYR57vLqGSoHV pvOC3tIKdsvZ8Ql09aY6R/xQiot1Rph5zGf0IUKjN3oih9vI4LL2HV21MjVVqTqUyMlt fwP/lbCnVbpNwD1hVcSlnYnd6gvtrvuYxXe227+E7sQeRXcDkTNHNU3ls7XZQo6DOAYS QEDvBSmYlwMwNzBr63X9W76tgcNsP1HHlC1f9RK6DdTNzLMqj+tqHDz/w/Cp2c6K/g16 6mJI/sn2KO+tmXdKgEhgBdRHBokO+2QukTT/3e4j1E2azt+5rbCEtKykYPPDJsz3QX9v oKCw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from :dkim-signature:delivered-to:sender:list-help:list-post:list-archive :list-subscribe:list-unsubscribe:list-id:precedence:mailing-list :dkim-signature:domainkey-signature; bh=pyXldy314OGfNCQW6cs26lCwSB8A1xaHLx/dTbphUQk=; b=cEbjmCShFR+V9JDu0LR/w6Qcjm4XliotMjt2q6oK3pAaZQXRd39RH4lmLMluoZ/SR2 lvQJPSQTiP5f+yo0n1538GIR6Rxi71yQ76RWrm+9Bptw2BxxOkhATg7HhDw3qFJj8YVC MQlMk9P9LJQf6XE35iR7WBNc3rKV6/cdaCGXFAqyXEPPptYohuYCtxw3/sSkwksG5bCJ V/Y1o0J2iH8LUqGzbT0O2OmX9LDwd9op0oZrKBiKciLcn2nHd+MhKv+pYWUX2CJRd+OI UncAIJarMyODsIJOQZ6DdRVqm5fiY1dbCXsRSqeGK4Oi9XnE6250KiSVKVv0RJZXhCuA Rwyw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=nqUHV0ps; dkim=pass header.i=@linaro.org header.s=google header.b=ob+GoW4Q; spf=pass (google.com: domain of libc-alpha-return-105932-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom="libc-alpha-return-105932-patch=linaro.org@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id k24si12353121ejz.284.2019.10.14.13.58.12 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 14 Oct 2019 13:58:13 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-105932-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=nqUHV0ps; dkim=pass header.i=@linaro.org header.s=google header.b=ob+GoW4Q; spf=pass (google.com: domain of libc-alpha-return-105932-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom="libc-alpha-return-105932-patch=linaro.org@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=f92bkYsa1xMbbGyZtxOFRAUYbkp0cH5 G+BGUu247WxWY7NZ67JB+6486E/UrM6YWnfJlVn4DI6nTiAFHpYi0AQUYoD/t4wK dOICE31LiGOfU8BxXkLNgtvxAi50qCD/2svD/YsX0qC2hFpgK7BF4APJyOliU43t XmwlFt+RPWX8= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=Wm/2VyhDJnZDUOZ6lHjYPog/aOI=; b=nqUHV 0psIbaOqF/aJ2ROGtKLBMsXlhtN5258HmyjChBIPvH5bVo98VUcefdbzNXkrpTOL Ih7mgQtzCOp2QrWQ9wAlZLAVd6hZ/fuf/MfvZzcXAuIXtP5tcTHCcmWyznfJ9r0v 1d4KvOMKlONmBmtnoCNllZ9mL862cBMDjVuJpY= Received: (qmail 114479 invoked by alias); 14 Oct 2019 20:57:20 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 114364 invoked by uid 89); 14 Oct 2019 20:57:19 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.2 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=marks, accomplish X-HELO: mail-qk1-f196.google.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references; bh=pyXldy314OGfNCQW6cs26lCwSB8A1xaHLx/dTbphUQk=; b=ob+GoW4QhfwC0xFtyRXQdC4cmV9Cu5Ym48Go/e2gn+gi9lcmMXUXb0D/Us9jh/K+x+ byfLbdMfD+9ZQU8FHCEeTk6++XQw1I1g4c+gi9V3mMxZlc6fmfc6ohEZnv3AR9N9WZyq oj/UPY4A7DwrkDi+qLD/ltvnKISMDipskEK5FUcnTJTpDto8086G5FOrbScbmldpsm2k bFaAvpSPIMWWDpbCh07Uz8eZioLnz1Dh9sKUzxNjE0BdnwWaHTTLKUPkUO4Q5aX25AOR 0CmaMv53Jgy3NrK05KRfgQiNZ2KpEXw2jkwvDr4hXDPd2MoQYwBRYIIdLUjmrUYe0Ogg Ovvg== Return-Path: From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH v3 07/21] nptl: i386: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 14 Oct 2019 17:56:42 -0300 Message-Id: <20191014205656.29834-8-adhemerval.zanella@linaro.org> In-Reply-To: <20191014205656.29834-1-adhemerval.zanella@linaro.org> References: <20191014205656.29834-1-adhemerval.zanella@linaro.org> This patch adds the i386 modifications required for the BZ#12683 fix by adding the arch-specific cancellation syscall bridge. The syscall bridge uses the old int80 instruction because by using the optimized vDSO symbol the resulting PC value for an interrupted syscall points to an adress outside the expected markers in __syscall_cancel_arch. It has been discussed in LKML [1] on how kernel could help userland to accomplish it, but afaik discussion has stalled. Also, sysenter should not be used directly by libc since its calling convention is set by the kernel depending of the underlying x86 chip (check kernel commit 30bfa7b3488bfb1bb75c9f50a5fcac1832970c60). Checked on i686-linux-gnu. [1] https://lkml.org/lkml/2016/3/8/1105 --- sysdeps/unix/sysv/linux/i386/Makefile | 2 +- sysdeps/unix/sysv/linux/i386/syscall_cancel.S | 105 ++++++++++++++++++ 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 sysdeps/unix/sysv/linux/i386/syscall_cancel.S -- 2.17.1 diff --git a/sysdeps/unix/sysv/linux/i386/Makefile b/sysdeps/unix/sysv/linux/i386/Makefile index da716e2c1b..7928497a35 100644 --- a/sysdeps/unix/sysv/linux/i386/Makefile +++ b/sysdeps/unix/sysv/linux/i386/Makefile @@ -9,7 +9,7 @@ $(objpfx)tst-bz21269: $(shared-thread-library) endif ifeq ($(subdir),elf) -sysdep-dl-routines += libc-do-syscall +sysdep-rtld_routines += libc-do-syscall sysdep-others += lddlibc4 install-bin += lddlibc4 endif diff --git a/sysdeps/unix/sysv/linux/i386/syscall_cancel.S b/sysdeps/unix/sysv/linux/i386/syscall_cancel.S new file mode 100644 index 0000000000..cc8c43f84d --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/syscall_cancel.S @@ -0,0 +1,105 @@ +/* Cancellable syscall wrapper. Linux/i686 version. + Copyright (C) 2019 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +/* long int [eax] __syscall_cancel_arch (int *cancelhandling [SP], + long int nr [SP+4], + long int arg1 [SP+8], + long int arg2 [SP+12], + long int arg3 [SP+16], + long int arg4 [SP+20], + long int arg5 [SP+24], + long int arg6 [SP+28]) */ + +ENTRY (__syscall_cancel_arch) + pushl %ebp + cfi_def_cfa_offset (8) + cfi_offset (ebp, -8) + pushl %edi + cfi_def_cfa_offset (12) + cfi_offset (edi, -12) + pushl %esi + cfi_def_cfa_offset (16) + cfi_offset (esi, -16) + pushl %ebx + cfi_def_cfa_offset (20) + cfi_offset (ebx, -20) + + .global __syscall_cancel_arch_start + .type __syscall_cancel_arch_start, @function +__syscall_cancel_arch_start: + + /* if (*cancelhandling & CANCELED_BITMASK) + __syscall_do_cancel() */ + testb $4, (%eax) + jne 1f + + /* Issue a 6 argument syscall, the nr [%eax] being the syscall + number. */ + movl 24(%esp), %eax + movl 28(%esp), %ebx + movl 32(%esp), %ecx + movl 36(%esp), %edx + movl 40(%esp), %esi + movl 44(%esp), %edi + movl 48(%esp), %ebp + + /* We can not use the vDSO helper for syscall (__kernel_vsyscall) + because the returned PC from kernel will point to the vDSO page + instead of the expected __syscall_cancel_arch_{start,end} + marks. */ + int $128 + + .global __syscall_cancel_arch_end + .type __syscall_cancel_arch_end, @function +__syscall_cancel_arch_end: + + popl %ebx + cfi_restore (ebx) + cfi_def_cfa_offset (16) + popl %esi + cfi_restore (esi) + cfi_def_cfa_offset (12) + popl %edi + cfi_restore (edi) + cfi_def_cfa_offset (8) + popl %ebp + cfi_restore (ebp) + cfi_def_cfa_offset (4) + ret + +1: + /* Although the __syscall_do_cancel do not return, we need to stack + being set correctly for unwind. */ + popl %ebx + cfi_restore (ebx) + cfi_def_cfa_offset (16) + popl %esi + cfi_restore (esi) + cfi_def_cfa_offset (12) + popl %edi + cfi_restore (edi) + cfi_def_cfa_offset (8) + popl %ebp + cfi_restore (ebp) + cfi_def_cfa_offset (4) + jmp __syscall_do_cancel + +END (__syscall_cancel_arch) +libc_hidden_def (__syscall_cancel_arch)