Received: by 2002:a05:7412:ba23:b0:fa:4c10:6cad with SMTP id jp35csp1602781rdb; Sat, 20 Jan 2024 05:57:59 -0800 (PST) X-Google-Smtp-Source: AGHT+IECjGZjQHmTKFIMRxaq9fZJ94QLPlZQJr+Z8g1jX/i+yUDpAqK5mOZUMi687Ul2ht+NRqw0 X-Received: by 2002:aa7:d495:0:b0:559:6d70:c47b with SMTP id b21-20020aa7d495000000b005596d70c47bmr1457112edr.14.1705759079245; Sat, 20 Jan 2024 05:57:59 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705759079; cv=pass; d=google.com; s=arc-20160816; b=MqCaehrVnybcHyAltN0DN+9UehLsHGuJDptBRstaJ4SEFfd/SmWxfCyeKe51c48+CI AGxAJGQVOXKATTpEN3CLoy5b76cyHnlKL2ACvuhA8whky0nUHJWzBI1NncVYyXfjBRxj 2/Bv8dS157MPN97FGkACfRHpu8XVsVtI+barX2/MMgKF6jCaCaQ3ZzRDUmcldB4gcwER KTdSzslYgFdKxGbwx6n3kB2slRdr5Q/qCH2UdFHI/n9WVChAqNAC74SI/wVHe8PtpTpI 2tShOa/Lx8L8ac86DW6nPqGdL83B18cCdjWhTLksODiU+zHPHJ52LrXz+05xQerX9Ggs vueQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:user-agent:references:in-reply-to :message-id:date:cc:to:from:subject:dkim-signature; bh=vN4PGRlbpK+OR/MIwyCPmFwCH0QGJeB4TyfzXgQtcsM=; fh=2siRyBxAXyNSUOYAb8qux/YS52dXqrDIuoViDmsYvgE=; b=fWrnXijHHywFt0UJAQ+D1LWyi3h91cDYF10L35hTZPpHmWh/dNWWW50VIVqxL77HnG y3nk1jdtLo6zf7NduQhybC3S2AhQOtSGfzZVNZ1f8kWhXcfSrk5WBfR6QTBOLYOUvDDz hn8SpOYriGfg2QNgOXwzAiC6e0HjuSV5oKji0I0J0r9BG6mGOaBkmb3QPdr0IdGM5x+I 7hpEIANbNUetRZ/mZzo7IVvQX0dV6F07eW96mViCVgS4TLWtnwMpUvvAauW8dd2wIB8O fOHZjec5foJblQj4nArViqmGkrvt4t/GJU9YclHaUFWVdt+WwRe8x/OQP53yDMH25Vdf qukA== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=E2kVm46p; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-nfs+bounces-1209-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-nfs+bounces-1209-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id l18-20020a50d6d2000000b00558df3df779si7793969edj.492.2024.01.20.05.57.59 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jan 2024 05:57:59 -0800 (PST) Received-SPF: pass (google.com: domain of linux-nfs+bounces-1209-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=E2kVm46p; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-nfs+bounces-1209-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-nfs+bounces-1209-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id A9AB11F22561 for ; Sat, 20 Jan 2024 13:57:58 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 08A53FBEB; Sat, 20 Jan 2024 13:57:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="E2kVm46p" X-Original-To: linux-nfs@vger.kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D271EFBE8; Sat, 20 Jan 2024 13:57:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705759076; cv=none; b=BH2DrvIgqiQpuyviocH63R1nkILyDPRJPfN+R3hfndaKFOsevVfSyqtd0YBBKdJaKUorgnVoNt5DnK3y2ArPd5hMoPThJNHBv4wOV9ZX85Q2fTJeLcbTMWGpiaUYqWMa9xl8Q31Jc6jAylH+ciysxckiAZfuRyuYeZkSfUUwwII= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705759076; c=relaxed/simple; bh=nUcUjCnWlSTXF8Wr/JGV6vWcMzXAjhzjR0l/hIz7G9o=; h=Subject:From:To:Cc:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=aby2b63LztRcDL8B3AzbgXgePy4JHlTEIKAzSFg13j0jGEEa4miun94G/U/kvTMn7L7yaDlTlKDlwfu6cbx163Fvk1En3CoXL7E6UTzlCF2vO4F2hr4/5h1ihrnA5SiGGl5u6vuUAPuNWSWgzD/DUm42SUPI4+0ipZkAVpsoV2M= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=E2kVm46p; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id BFE31C433F1; Sat, 20 Jan 2024 13:57:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1705759076; bh=nUcUjCnWlSTXF8Wr/JGV6vWcMzXAjhzjR0l/hIz7G9o=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=E2kVm46pb0xEJ24CurL7o4mpkHwjMF9bqq2nBrV8NmNDzwWjUefxBkV7cnRCdMj6Y EoMTzs6iEEVVAZIVnz8LMB9kt3/jLk+azIhJGvLrtu63kg1F2+j9ngtgRJOTDl3b7/ gX2B3Vs+S/GS6trEpUTnCbZ0dtJuOg9dH07Yi/X4gISabepl7UVrGUrcqCe3AQzUKj JDfeFtW5iSLw4BhIstBslZy1GoYXZJ4kiyeKJMPOOr+3CMZce7dR0IYQJR9V0G47Ce FGc8Cj27KIb+DswRVgqZYBoVVBTf3brL7V5l4GE2QCafkDlzsiNgkNfBRROQc6N2zS Xi7fS+duNHwTw== Subject: [PATCH v5 2/2] fs: Create a generic is_dot_dotdot() utility From: Chuck Lever To: jlayton@redhat.com, amir73il@gmail.com Cc: trondmy@hammerspace.com, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, viro@zeniv.linux.org.uk, brauner@kernel.org Date: Sat, 20 Jan 2024 08:57:54 -0500 Message-ID: <170575907468.22911.10976023123447238559.stgit@klimt.1015granger.net> In-Reply-To: <170575895658.22911.11462120546862746092.stgit@klimt.1015granger.net> References: <170575895658.22911.11462120546862746092.stgit@klimt.1015granger.net> User-Agent: StGit/1.5 Precedence: bulk X-Mailing-List: linux-nfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit From: Chuck Lever De-duplicate the same functionality in several places by hoisting the is_dot_dotdot() utility function into linux/fs.h. Suggested-by: Amir Goldstein Reviewed-by: Jeff Layton Reviewed-by: Amir Goldstein Signed-off-by: Chuck Lever --- fs/crypto/fname.c | 8 +------- fs/ecryptfs/crypto.c | 10 ---------- fs/exportfs/expfs.c | 10 ---------- fs/f2fs/f2fs.h | 11 ----------- fs/namei.c | 6 ++---- include/linux/fs.h | 11 +++++++++++ 6 files changed, 14 insertions(+), 42 deletions(-) diff --git a/fs/crypto/fname.c b/fs/crypto/fname.c index 7b3fc189593a..0ad52fbe51c9 100644 --- a/fs/crypto/fname.c +++ b/fs/crypto/fname.c @@ -74,13 +74,7 @@ struct fscrypt_nokey_name { static inline bool fscrypt_is_dot_dotdot(const struct qstr *str) { - if (str->len == 1 && str->name[0] == '.') - return true; - - if (str->len == 2 && str->name[0] == '.' && str->name[1] == '.') - return true; - - return false; + return is_dot_dotdot(str->name, str->len); } /** diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index 03bd55069d86..2fe0f3af1a08 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c @@ -1949,16 +1949,6 @@ int ecryptfs_encrypt_and_encode_filename( return rc; } -static bool is_dot_dotdot(const char *name, size_t name_size) -{ - if (name_size == 1 && name[0] == '.') - return true; - else if (name_size == 2 && name[0] == '.' && name[1] == '.') - return true; - - return false; -} - /** * ecryptfs_decode_and_decrypt_filename - converts the encoded cipher text name to decoded plaintext * @plaintext_name: The plaintext name diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c index dcf7d86c2ce4..07ea3d62b298 100644 --- a/fs/exportfs/expfs.c +++ b/fs/exportfs/expfs.c @@ -244,16 +244,6 @@ struct getdents_callback { int sequence; /* sequence counter */ }; -/* Copied from lookup_one_common() */ -static inline bool is_dot_dotdot(const char *name, size_t len) -{ - if (unlikely(name[0] == '.')) { - if (len < 2 || (len == 2 && name[1] == '.')) - return true; - } - return false; -} - /* * A rather strange filldir function to capture * the name matching the specified inode number. diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 9043cedfa12b..322a3b8a3533 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -3368,17 +3368,6 @@ static inline bool f2fs_cp_error(struct f2fs_sb_info *sbi) return is_set_ckpt_flags(sbi, CP_ERROR_FLAG); } -static inline bool is_dot_dotdot(const u8 *name, size_t len) -{ - if (len == 1 && name[0] == '.') - return true; - - if (len == 2 && name[0] == '.' && name[1] == '.') - return true; - - return false; -} - static inline void *f2fs_kmalloc(struct f2fs_sb_info *sbi, size_t size, gfp_t flags) { diff --git a/fs/namei.c b/fs/namei.c index 71c13b2990b4..2386a70667fa 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -2667,10 +2667,8 @@ static int lookup_one_common(struct mnt_idmap *idmap, if (!len) return -EACCES; - if (unlikely(name[0] == '.')) { - if (len < 2 || (len == 2 && name[1] == '.')) - return -EACCES; - } + if (is_dot_dotdot(name, len)) + return -EACCES; while (len--) { unsigned int c = *(const unsigned char *)name++; diff --git a/include/linux/fs.h b/include/linux/fs.h index 98b7a7a8c42e..baa64344a308 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2846,6 +2846,17 @@ extern bool path_is_under(const struct path *, const struct path *); extern char *file_path(struct file *, char *, int); +/** + * is_dot_dotdot - returns true only if @name is "." or ".." + * @name: file name to check + * @len: length of file name, in bytes + */ +static inline bool is_dot_dotdot(const char *name, size_t len) +{ + return len && unlikely(name[0] == '.') && + (len == 1 || (len == 2 && name[1] == '.')); +} + #include /* needed for stackable file system support */