Received: by 2002:a05:6a10:6744:0:0:0:0 with SMTP id w4csp506979pxu; Wed, 7 Oct 2020 08:38:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwK+OS6bIsVRmlfppqjKonSqulFkyd6cUHZRT5eMi8FnGw7GC/mCI3NUsDG5N/xVsp1qO+w X-Received: by 2002:a17:906:4b10:: with SMTP id y16mr4011764eju.395.1602085098840; Wed, 07 Oct 2020 08:38:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1602085098; cv=none; d=google.com; s=arc-20160816; b=nQduPJrDTNBlHcHiq+v5Raa1kB8taFMPkqdbJt2ccwjgjFFnzTPTscS3/Ii7q7lE98 7Jn2g/aZFJNY+NyfwLStlbicg437Ba/TGqlSxEuQLxv+/UcwE9tG5+teOAFCka10HrIn 8nufj4XPrtula16OWU0iCn2qiy5y2Ic4NeMfdIEArabr7/pL1U53Z2bSZfcoCO3EdiZv eSG2xqTPdmwOKs9FtDKUtMkRtRNIebQsRpIgSQHcrXMUnBhfs6Gd9Dk94iMcEy3P/vNm FiBy+EXVTb1zUQr8bgGo6dYfcLo2hgkfJeQvDsjLs7oJvrU1lV1+9iABRsaREaBH7j8M ka0g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=9CgQcMiEmcoXX3oXlcbVIjb+/O6HwDix1e31TI+ppV0=; b=vSNeLu6Dg8jwfrMptNHwdnrdgT30PFvttfnO87MLy46aEMP0YFhrcopfzDrmuFWhPb K9eOozouy59x6HOMzollUAVseE5WRM015k1aNSuYqF2Ok2cb7PB+iwJhrWFEk+oqbynM z1+RpS/NDARGn52kVRGAcdRG/OANInED3TDme5NZ5MsrmNnC7f2rpkqo35ycYHt42gSR G+DBhorgN/vvpRQW407KnsSYhDzMs3vkdibvnccf1huUQ4HKcSlRUKBSF+xosLPO+jbN dQqT9ef6+/kfmswFctHl3c/TqQY/d5JxN3coBkU0tfqcDKygYzyNbDQG3L8R0RbiU9Fh w3Wg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id j4si1728651ejv.394.2020.10.07.08.37.46; Wed, 07 Oct 2020 08:38:18 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728049AbgJGKgn (ORCPT + 99 others); Wed, 7 Oct 2020 06:36:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52118 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727773AbgJGKgn (ORCPT ); Wed, 7 Oct 2020 06:36:43 -0400 Received: from mout-p-103.mailbox.org (mout-p-103.mailbox.org [IPv6:2001:67c:2050::465:103]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1315AC061755; Wed, 7 Oct 2020 03:36:43 -0700 (PDT) Received: from smtp1.mailbox.org (smtp1.mailbox.org [IPv6:2001:67c:2050:105:465:1:1:0]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-103.mailbox.org (Postfix) with ESMTPS id 4C5rNk6tpzzKmh1; Wed, 7 Oct 2020 12:36:38 +0200 (CEST) X-Virus-Scanned: amavisd-new at heinlein-support.de Received: from smtp1.mailbox.org ([80.241.60.240]) by spamfilter04.heinlein-hosting.de (spamfilter04.heinlein-hosting.de [80.241.56.122]) (amavisd-new, port 10030) with ESMTP id GCodGCpHNCIN; Wed, 7 Oct 2020 12:36:32 +0200 (CEST) From: Aleksa Sarai To: Alexander Viro , Shuah Khan Cc: Aleksa Sarai , stable@vger.kernel.org, Christian Brauner , containers@lists.linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] openat2: reject RESOLVE_BENEATH|RESOLVE_IN_ROOT Date: Wed, 7 Oct 2020 21:36:08 +1100 Message-Id: <20201007103608.17349-1-cyphar@cyphar.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-MBO-SPAM-Probability: X-Rspamd-Score: -7.86 / 15.00 / 15.00 X-Rspamd-Queue-Id: 94FA014AF X-Rspamd-UID: 962eff Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This was an oversight in the original implementation, as it makes no sense to specify both scoping flags to the same openat2(2) invocation (before this patch, the result of such an invocation was equivalent to RESOLVE_IN_ROOT being ignored). This is a userspace-visible ABI change, but the only user of openat2(2) at the moment is LXC which doesn't specify both flags and so no userspace programs will break as a result. Cc: # v5.6+ Fixes: fddb5d430ad9 ("open: introduce openat2(2) syscall") Acked-by: Christian Brauner Signed-off-by: Aleksa Sarai --- fs/open.c | 4 ++++ tools/testing/selftests/openat2/openat2_test.c | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/fs/open.c b/fs/open.c index 9af548fb841b..4d7537ae59df 100644 --- a/fs/open.c +++ b/fs/open.c @@ -1010,6 +1010,10 @@ inline int build_open_flags(const struct open_how *how, struct open_flags *op) if (how->resolve & ~VALID_RESOLVE_FLAGS) return -EINVAL; + /* Scoping flags are mutually exclusive. */ + if ((how->resolve & RESOLVE_BENEATH) && (how->resolve & RESOLVE_IN_ROOT)) + return -EINVAL; + /* Deal with the mode. */ if (WILL_CREATE(flags)) { if (how->mode & ~S_IALLUGO) diff --git a/tools/testing/selftests/openat2/openat2_test.c b/tools/testing/selftests/openat2/openat2_test.c index b386367c606b..381d874cce99 100644 --- a/tools/testing/selftests/openat2/openat2_test.c +++ b/tools/testing/selftests/openat2/openat2_test.c @@ -155,7 +155,7 @@ struct flag_test { int err; }; -#define NUM_OPENAT2_FLAG_TESTS 23 +#define NUM_OPENAT2_FLAG_TESTS 24 void test_openat2_flags(void) { @@ -210,6 +210,12 @@ void test_openat2_flags(void) .how.flags = O_TMPFILE | O_RDWR, .how.mode = 0x0000A00000000000ULL, .err = -EINVAL }, + /* ->resolve flags must not conflict. */ + { .name = "incompatible resolve flags (BENEATH | IN_ROOT)", + .how.flags = O_RDONLY, + .how.resolve = RESOLVE_BENEATH | RESOLVE_IN_ROOT, + .err = -EINVAL }, + /* ->resolve must only contain RESOLVE_* flags. */ { .name = "invalid how.resolve and O_RDONLY", .how.flags = O_RDONLY, -- 2.28.0