Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp835537yba; Wed, 24 Apr 2019 10:21:44 -0700 (PDT) X-Google-Smtp-Source: APXvYqyWk/Bf+w8gDY8KjUfW0hzFHWYLgCO0n2QN/NecljXRJNpCVMJfOGUl6qdTYCNPsKaFMEZN X-Received: by 2002:a62:480d:: with SMTP id v13mr35279446pfa.125.1556126503971; Wed, 24 Apr 2019 10:21:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1556126503; cv=none; d=google.com; s=arc-20160816; b=GTX1e7vCAJgS6YQPaLR2qtFhsg0lpsV32asLtmGd02Fnn7+Y2K7BW+dVjD1+koSt7E IIBQfLd298Iu+6gO7y5e6OdOwonE7oOSeFlvR2N1HlaH0X+XJYvEJ3qkzN8M5sTO/nG+ s0339qQGztP/UVeSA/s9887rQKtwv+ciRhEMYZYmNL2KISK0A9FxqAs7Y1y61JEfkQx1 hEOcoSuEuoAp926PCuDry4eHyWsInwegC7rY2aLmyEC9jcUgXI25KXYiBgapAQry7QJ1 3Hf6avu62/QjT0U1howEFkOvH6gXh8I1HqOAymLKlv0L3LHFl/7wuRBIKHAflnL+ThNa N9dg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=viN3qSZzjTDR2rkTUnJFUnsNyVBSppvKhbLd9NL5pAc=; b=t+cuRnYoxHqMORpaMkJvwH0mgGg1mzyKFuSrPRbp00eKs+4DcwFfSzU+pghk8Ncwoh iGTKcvgZuES0cPwXiG2Kw2bCbW/9hpemy4861VcFnqsTyaQ6Id4mCWl3iT+Ucg/9O8i9 x4gHSOhz+d6NFQtaFhQFdB489YV1ajb4hgoCLKRj9IhJJbPmzqmOgGOppOeaGrbZnK2y l9luLfpodq9KNg5m4yTenEfxG4JrthbNTCcLLAviuBrBWpCboh7Q0dc6f9pu36wM3Pad 6wuBvrS6cwkjIcBj4cJKedxA2OJrnzEgkqUIGWRrcWbsMofP6FbqrAU5Tbh5pQuAra0K GSlg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=TVeGwOgR; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o19si18677189pgh.409.2019.04.24.10.21.28; Wed, 24 Apr 2019 10:21:43 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=TVeGwOgR; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389083AbfDXRTw (ORCPT + 99 others); Wed, 24 Apr 2019 13:19:52 -0400 Received: from mail.kernel.org ([198.145.29.99]:45106 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389063AbfDXRTq (ORCPT ); Wed, 24 Apr 2019 13:19:46 -0400 Received: from localhost (62-193-50-229.as16211.net [62.193.50.229]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 35F7E21907; Wed, 24 Apr 2019 17:19:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1556126385; bh=XIb/dPGbMf3xTM6F0Lj6BscROZsl+N1zvbyhLojL0Ps=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TVeGwOgRl/RIUKfFr7ja+PXryTkNoUOCJvainx9Rc86DMbakljHmGizCX1h/Gm8Si NfP7uJvFGLuAIipDPV4JbSGhumV5ZJ9JZ0xuL3mEHxSDjWgdRGZxttD8LTaSL1v5FM 0Pv6sGJk7kKporYjO2+ut9+DxBxiOYQd8Gm2Y5GQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, stable@kernel.org, Will Deacon Subject: [PATCH 4.4 093/168] arm64: futex: Fix FUTEX_WAKE_OP atomic ops with non-zero result value Date: Wed, 24 Apr 2019 19:08:57 +0200 Message-Id: <20190424170929.223729470@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190424170923.452349382@linuxfoundation.org> References: <20190424170923.452349382@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Will Deacon commit 045afc24124d80c6998d9c770844c67912083506 upstream. Rather embarrassingly, our futex() FUTEX_WAKE_OP implementation doesn't explicitly set the return value on the non-faulting path and instead leaves it holding the result of the underlying atomic operation. This means that any FUTEX_WAKE_OP atomic operation which computes a non-zero value will be reported as having failed. Regrettably, I wrote the buggy code back in 2011 and it was upstreamed as part of the initial arm64 support in 2012. The reasons we appear to get away with this are: 1. FUTEX_WAKE_OP is rarely used and therefore doesn't appear to get exercised by futex() test applications 2. If the result of the atomic operation is zero, the system call behaves correctly 3. Prior to version 2.25, the only operation used by GLIBC set the futex to zero, and therefore worked as expected. From 2.25 onwards, FUTEX_WAKE_OP is not used by GLIBC at all. Fix the implementation by ensuring that the return value is either 0 to indicate that the atomic operation completed successfully, or -EFAULT if we encountered a fault when accessing the user mapping. Cc: Fixes: 6170a97460db ("arm64: Atomic operations") Signed-off-by: Will Deacon Signed-off-by: Greg Kroah-Hartman --- arch/arm64/include/asm/futex.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) --- a/arch/arm64/include/asm/futex.h +++ b/arch/arm64/include/asm/futex.h @@ -33,8 +33,8 @@ " prfm pstl1strm, %2\n" \ "1: ldxr %w1, %2\n" \ insn "\n" \ -"2: stlxr %w3, %w0, %2\n" \ -" cbnz %w3, 1b\n" \ +"2: stlxr %w0, %w3, %2\n" \ +" cbnz %w0, 1b\n" \ " dmb ish\n" \ "3:\n" \ " .pushsection .fixup,\"ax\"\n" \ @@ -55,29 +55,29 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr) { - int oldval = 0, ret, tmp; + int oldval, ret, tmp; pagefault_disable(); switch (op) { case FUTEX_OP_SET: - __futex_atomic_op("mov %w0, %w4", + __futex_atomic_op("mov %w3, %w4", ret, oldval, uaddr, tmp, oparg); break; case FUTEX_OP_ADD: - __futex_atomic_op("add %w0, %w1, %w4", + __futex_atomic_op("add %w3, %w1, %w4", ret, oldval, uaddr, tmp, oparg); break; case FUTEX_OP_OR: - __futex_atomic_op("orr %w0, %w1, %w4", + __futex_atomic_op("orr %w3, %w1, %w4", ret, oldval, uaddr, tmp, oparg); break; case FUTEX_OP_ANDN: - __futex_atomic_op("and %w0, %w1, %w4", + __futex_atomic_op("and %w3, %w1, %w4", ret, oldval, uaddr, tmp, ~oparg); break; case FUTEX_OP_XOR: - __futex_atomic_op("eor %w0, %w1, %w4", + __futex_atomic_op("eor %w3, %w1, %w4", ret, oldval, uaddr, tmp, oparg); break; default: