From nobody Thu Dec 18 18:52:05 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 364C5C77B6E for ; Fri, 14 Apr 2023 15:26:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230263AbjDNP0d (ORCPT ); Fri, 14 Apr 2023 11:26:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46292 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229707AbjDNP0b (ORCPT ); Fri, 14 Apr 2023 11:26:31 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 5A3BCD312; Fri, 14 Apr 2023 08:26:03 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 9D5C44B3; Fri, 14 Apr 2023 08:25:58 -0700 (PDT) Received: from localhost.localdomain (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 52EE23F6C4; Fri, 14 Apr 2023 08:25:12 -0700 (PDT) From: Luca Vizzarro To: linux-kernel@vger.kernel.org Cc: Luca Vizzarro , Alexander Viro , Christian Brauner , Jeff Layton , Chuck Lever , Kevin Brodsky , Vincenzo Frascino , Szabolcs Nagy , "Theodore Ts'o" , David Laight , Mark Rutland , linux-fsdevel@vger.kernel.org, linux-morello@op-lists.linaro.org Subject: [PATCH v2 1/5] fcntl: Cast commands with int args explicitly Date: Fri, 14 Apr 2023 16:24:55 +0100 Message-Id: <20230414152459.816046-2-Luca.Vizzarro@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230414152459.816046-1-Luca.Vizzarro@arm.com> References: <20230414152459.816046-1-Luca.Vizzarro@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" According to the fcntl API specification commands that expect an integer, hence not a pointer, always take an int and not long. In order to avoid access to undefined bits, we should explicitly cast the argument to int. Cc: Alexander Viro Cc: Christian Brauner Cc: Jeff Layton Cc: Chuck Lever Cc: Kevin Brodsky Cc: Vincenzo Frascino Cc: Szabolcs Nagy Cc: "Theodore Ts'o" Cc: David Laight Cc: Mark Rutland Cc: linux-fsdevel@vger.kernel.org Cc: linux-morello@op-lists.linaro.org Signed-off-by: Luca Vizzarro --- fs/fcntl.c | 29 +++++++++++++++-------------- include/linux/fs.h | 2 +- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/fs/fcntl.c b/fs/fcntl.c index b622be119706..e871009f6c88 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c @@ -34,7 +34,7 @@ =20 #define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIM= E) =20 -static int setfl(int fd, struct file * filp, unsigned long arg) +static int setfl(int fd, struct file * filp, unsigned int arg) { struct inode * inode =3D file_inode(filp); int error =3D 0; @@ -112,11 +112,11 @@ void __f_setown(struct file *filp, struct pid *pid, e= num pid_type type, } EXPORT_SYMBOL(__f_setown); =20 -int f_setown(struct file *filp, unsigned long arg, int force) +int f_setown(struct file *filp, int who, int force) { enum pid_type type; struct pid *pid =3D NULL; - int who =3D arg, ret =3D 0; + int ret =3D 0; =20 type =3D PIDTYPE_TGID; if (who < 0) { @@ -317,28 +317,29 @@ static long do_fcntl(int fd, unsigned int cmd, unsign= ed long arg, struct file *filp) { void __user *argp =3D (void __user *)arg; + int argi =3D (int)arg; struct flock flock; long err =3D -EINVAL; =20 switch (cmd) { case F_DUPFD: - err =3D f_dupfd(arg, filp, 0); + err =3D f_dupfd(argi, filp, 0); break; case F_DUPFD_CLOEXEC: - err =3D f_dupfd(arg, filp, O_CLOEXEC); + err =3D f_dupfd(argi, filp, O_CLOEXEC); break; case F_GETFD: err =3D get_close_on_exec(fd) ? FD_CLOEXEC : 0; break; case F_SETFD: err =3D 0; - set_close_on_exec(fd, arg & FD_CLOEXEC); + set_close_on_exec(fd, argi & FD_CLOEXEC); break; case F_GETFL: err =3D filp->f_flags; break; case F_SETFL: - err =3D setfl(fd, filp, arg); + err =3D setfl(fd, filp, argi); break; #if BITS_PER_LONG !=3D 32 /* 32-bit arches must use fcntl64() */ @@ -375,7 +376,7 @@ static long do_fcntl(int fd, unsigned int cmd, unsigned= long arg, force_successful_syscall_return(); break; case F_SETOWN: - err =3D f_setown(filp, arg, 1); + err =3D f_setown(filp, argi, 1); break; case F_GETOWN_EX: err =3D f_getown_ex(filp, arg); @@ -391,28 +392,28 @@ static long do_fcntl(int fd, unsigned int cmd, unsign= ed long arg, break; case F_SETSIG: /* arg =3D=3D 0 restores default behaviour. */ - if (!valid_signal(arg)) { + if (!valid_signal(argi)) { break; } err =3D 0; - filp->f_owner.signum =3D arg; + filp->f_owner.signum =3D argi; break; case F_GETLEASE: err =3D fcntl_getlease(filp); break; case F_SETLEASE: - err =3D fcntl_setlease(fd, filp, arg); + err =3D fcntl_setlease(fd, filp, argi); break; case F_NOTIFY: - err =3D fcntl_dirnotify(fd, filp, arg); + err =3D fcntl_dirnotify(fd, filp, argi); break; case F_SETPIPE_SZ: case F_GETPIPE_SZ: - err =3D pipe_fcntl(filp, cmd, arg); + err =3D pipe_fcntl(filp, cmd, argi); break; case F_ADD_SEALS: case F_GET_SEALS: - err =3D memfd_fcntl(filp, cmd, arg); + err =3D memfd_fcntl(filp, cmd, argi); break; case F_GET_RW_HINT: case F_SET_RW_HINT: diff --git a/include/linux/fs.h b/include/linux/fs.h index c85916e9f7db..8da79822dbba 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1050,7 +1050,7 @@ extern void fasync_free(struct fasync_struct *); extern void kill_fasync(struct fasync_struct **, int, int); =20 extern void __f_setown(struct file *filp, struct pid *, enum pid_type, int= force); -extern int f_setown(struct file *filp, unsigned long arg, int force); +extern int f_setown(struct file *filp, int who, int force); extern void f_delown(struct file *filp); extern pid_t f_getown(struct file *filp); extern int send_sigurg(struct fown_struct *fown); --=20 2.34.1