Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

fcntl: Cast commands with int args explicitly

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 <viro@zeniv.linux.org.uk>
Cc: Christian Brauner <brauner@kernel.org>
Cc: Jeff Layton <jlayton@kernel.org>
Cc: Chuck Lever <chuck.lever@oracle.com>
Cc: Kevin Brodsky <Kevin.Brodsky@arm.com>
Cc: Vincenzo Frascino <Vincenzo.Frascino@arm.com>
Cc: Szabolcs Nagy <Szabolcs.Nagy@arm.com>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: David Laight <David.Laight@ACULAB.com>
Cc: Mark Rutland <Mark.Rutland@arm.com>
Cc: linux-fsdevel@vger.kernel.org
Cc: linux-morello@op-lists.linaro.org
Signed-off-by: Luca Vizzarro <Luca.Vizzarro@arm.com>
Message-Id: <20230414152459.816046-2-Luca.Vizzarro@arm.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

Luca Vizzarro and committed by
Christian Brauner
bccb5c39 576d498e

+16 -15
+15 -14
fs/fcntl.c
··· 34 34 35 35 #define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME) 36 36 37 - static int setfl(int fd, struct file * filp, unsigned long arg) 37 + static int setfl(int fd, struct file * filp, unsigned int arg) 38 38 { 39 39 struct inode * inode = file_inode(filp); 40 40 int error = 0; ··· 112 112 } 113 113 EXPORT_SYMBOL(__f_setown); 114 114 115 - int f_setown(struct file *filp, unsigned long arg, int force) 115 + int f_setown(struct file *filp, int who, int force) 116 116 { 117 117 enum pid_type type; 118 118 struct pid *pid = NULL; 119 - int who = arg, ret = 0; 119 + int ret = 0; 120 120 121 121 type = PIDTYPE_TGID; 122 122 if (who < 0) { ··· 317 317 struct file *filp) 318 318 { 319 319 void __user *argp = (void __user *)arg; 320 + int argi = (int)arg; 320 321 struct flock flock; 321 322 long err = -EINVAL; 322 323 323 324 switch (cmd) { 324 325 case F_DUPFD: 325 - err = f_dupfd(arg, filp, 0); 326 + err = f_dupfd(argi, filp, 0); 326 327 break; 327 328 case F_DUPFD_CLOEXEC: 328 - err = f_dupfd(arg, filp, O_CLOEXEC); 329 + err = f_dupfd(argi, filp, O_CLOEXEC); 329 330 break; 330 331 case F_GETFD: 331 332 err = get_close_on_exec(fd) ? FD_CLOEXEC : 0; 332 333 break; 333 334 case F_SETFD: 334 335 err = 0; 335 - set_close_on_exec(fd, arg & FD_CLOEXEC); 336 + set_close_on_exec(fd, argi & FD_CLOEXEC); 336 337 break; 337 338 case F_GETFL: 338 339 err = filp->f_flags; 339 340 break; 340 341 case F_SETFL: 341 - err = setfl(fd, filp, arg); 342 + err = setfl(fd, filp, argi); 342 343 break; 343 344 #if BITS_PER_LONG != 32 344 345 /* 32-bit arches must use fcntl64() */ ··· 376 375 force_successful_syscall_return(); 377 376 break; 378 377 case F_SETOWN: 379 - err = f_setown(filp, arg, 1); 378 + err = f_setown(filp, argi, 1); 380 379 break; 381 380 case F_GETOWN_EX: 382 381 err = f_getown_ex(filp, arg); ··· 392 391 break; 393 392 case F_SETSIG: 394 393 /* arg == 0 restores default behaviour. */ 395 - if (!valid_signal(arg)) { 394 + if (!valid_signal(argi)) { 396 395 break; 397 396 } 398 397 err = 0; 399 - filp->f_owner.signum = arg; 398 + filp->f_owner.signum = argi; 400 399 break; 401 400 case F_GETLEASE: 402 401 err = fcntl_getlease(filp); 403 402 break; 404 403 case F_SETLEASE: 405 - err = fcntl_setlease(fd, filp, arg); 404 + err = fcntl_setlease(fd, filp, argi); 406 405 break; 407 406 case F_NOTIFY: 408 - err = fcntl_dirnotify(fd, filp, arg); 407 + err = fcntl_dirnotify(fd, filp, argi); 409 408 break; 410 409 case F_SETPIPE_SZ: 411 410 case F_GETPIPE_SZ: 412 - err = pipe_fcntl(filp, cmd, arg); 411 + err = pipe_fcntl(filp, cmd, argi); 413 412 break; 414 413 case F_ADD_SEALS: 415 414 case F_GET_SEALS: 416 - err = memfd_fcntl(filp, cmd, arg); 415 + err = memfd_fcntl(filp, cmd, argi); 417 416 break; 418 417 case F_GET_RW_HINT: 419 418 case F_SET_RW_HINT:
+1 -1
include/linux/fs.h
··· 1069 1069 extern void kill_fasync(struct fasync_struct **, int, int); 1070 1070 1071 1071 extern void __f_setown(struct file *filp, struct pid *, enum pid_type, int force); 1072 - extern int f_setown(struct file *filp, unsigned long arg, int force); 1072 + extern int f_setown(struct file *filp, int who, int force); 1073 1073 extern void f_delown(struct file *filp); 1074 1074 extern pid_t f_getown(struct file *filp); 1075 1075 extern int send_sigurg(struct fown_struct *fown);