LCOV - code coverage report
Current view: top level - fs - fcntl.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 73 459 15.9 %
Date: 2022-03-28 15:32:58 Functions: 8 35 22.9 %
Branches: 26 272 9.6 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0
       2                 :            : /*
       3                 :            :  *  linux/fs/fcntl.c
       4                 :            :  *
       5                 :            :  *  Copyright (C) 1991, 1992  Linus Torvalds
       6                 :            :  */
       7                 :            : 
       8                 :            : #include <linux/syscalls.h>
       9                 :            : #include <linux/init.h>
      10                 :            : #include <linux/mm.h>
      11                 :            : #include <linux/sched/task.h>
      12                 :            : #include <linux/fs.h>
      13                 :            : #include <linux/file.h>
      14                 :            : #include <linux/fdtable.h>
      15                 :            : #include <linux/capability.h>
      16                 :            : #include <linux/dnotify.h>
      17                 :            : #include <linux/slab.h>
      18                 :            : #include <linux/module.h>
      19                 :            : #include <linux/pipe_fs_i.h>
      20                 :            : #include <linux/security.h>
      21                 :            : #include <linux/ptrace.h>
      22                 :            : #include <linux/signal.h>
      23                 :            : #include <linux/rcupdate.h>
      24                 :            : #include <linux/pid_namespace.h>
      25                 :            : #include <linux/user_namespace.h>
      26                 :            : #include <linux/memfd.h>
      27                 :            : #include <linux/compat.h>
      28                 :            : 
      29                 :            : #include <linux/poll.h>
      30                 :            : #include <asm/siginfo.h>
      31                 :            : #include <linux/uaccess.h>
      32                 :            : 
      33                 :            : #define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME)
      34                 :            : 
      35                 :        448 : static int setfl(int fd, struct file * filp, unsigned long arg)
      36                 :            : {
      37         [ -  + ]:        448 :         struct inode * inode = file_inode(filp);
      38                 :        448 :         int error = 0;
      39                 :            : 
      40                 :            :         /*
      41                 :            :          * O_APPEND cannot be cleared if the file is marked as append-only
      42                 :            :          * and the file is open for write.
      43                 :            :          */
      44   [ -  +  -  - ]:        448 :         if (((arg ^ filp->f_flags) & O_APPEND) && IS_APPEND(inode))
      45                 :            :                 return -EPERM;
      46                 :            : 
      47                 :            :         /* O_NOATIME can only be set by the owner or superuser */
      48   [ -  +  -  - ]:        448 :         if ((arg & O_NOATIME) && !(filp->f_flags & O_NOATIME))
      49         [ #  # ]:          0 :                 if (!inode_owner_or_capable(inode))
      50                 :            :                         return -EPERM;
      51                 :            : 
      52                 :            :         /* required for strict SunOS emulation */
      53                 :        448 :         if (O_NONBLOCK != O_NDELAY)
      54                 :            :                if (arg & O_NDELAY)
      55                 :            :                    arg |= O_NONBLOCK;
      56                 :            : 
      57                 :            :         /* Pipe packetized mode is controlled by O_DIRECT flag */
      58   [ +  +  -  + ]:        448 :         if (!S_ISFIFO(inode->i_mode) && (arg & O_DIRECT)) {
      59   [ #  #  #  # ]:          0 :                 if (!filp->f_mapping || !filp->f_mapping->a_ops ||
      60         [ #  # ]:          0 :                         !filp->f_mapping->a_ops->direct_IO)
      61                 :            :                                 return -EINVAL;
      62                 :            :         }
      63                 :            : 
      64         [ -  + ]:        448 :         if (filp->f_op->check_flags)
      65                 :          0 :                 error = filp->f_op->check_flags(arg);
      66         [ #  # ]:          0 :         if (error)
      67                 :            :                 return error;
      68                 :            : 
      69                 :            :         /*
      70                 :            :          * ->fasync() is responsible for setting the FASYNC bit.
      71                 :            :          */
      72   [ -  +  -  - ]:        448 :         if (((arg ^ filp->f_flags) & FASYNC) && filp->f_op->fasync) {
      73                 :          0 :                 error = filp->f_op->fasync(fd, filp, (arg & FASYNC) != 0);
      74         [ #  # ]:          0 :                 if (error < 0)
      75                 :          0 :                         goto out;
      76         [ #  # ]:          0 :                 if (error > 0)
      77                 :          0 :                         error = 0;
      78                 :            :         }
      79                 :        448 :         spin_lock(&filp->f_lock);
      80                 :        448 :         filp->f_flags = (arg & SETFL_MASK) | (filp->f_flags & ~SETFL_MASK);
      81                 :        448 :         spin_unlock(&filp->f_lock);
      82                 :            : 
      83                 :            :  out:
      84                 :            :         return error;
      85                 :            : }
      86                 :            : 
      87                 :          0 : static void f_modown(struct file *filp, struct pid *pid, enum pid_type type,
      88                 :            :                      int force)
      89                 :            : {
      90                 :          0 :         write_lock_irq(&filp->f_owner.lock);
      91   [ #  #  #  # ]:          0 :         if (force || !filp->f_owner.pid) {
      92                 :          0 :                 put_pid(filp->f_owner.pid);
      93         [ #  # ]:          0 :                 filp->f_owner.pid = get_pid(pid);
      94                 :          0 :                 filp->f_owner.pid_type = type;
      95                 :            : 
      96         [ #  # ]:          0 :                 if (pid) {
      97                 :          0 :                         const struct cred *cred = current_cred();
      98                 :          0 :                         filp->f_owner.uid = cred->uid;
      99                 :          0 :                         filp->f_owner.euid = cred->euid;
     100                 :            :                 }
     101                 :            :         }
     102                 :          0 :         write_unlock_irq(&filp->f_owner.lock);
     103                 :          0 : }
     104                 :            : 
     105                 :          0 : void __f_setown(struct file *filp, struct pid *pid, enum pid_type type,
     106                 :            :                 int force)
     107                 :            : {
     108                 :          0 :         security_file_set_fowner(filp);
     109                 :          0 :         f_modown(filp, pid, type, force);
     110                 :          0 : }
     111                 :            : EXPORT_SYMBOL(__f_setown);
     112                 :            : 
     113                 :          0 : int f_setown(struct file *filp, unsigned long arg, int force)
     114                 :            : {
     115                 :          0 :         enum pid_type type;
     116                 :          0 :         struct pid *pid = NULL;
     117                 :          0 :         int who = arg, ret = 0;
     118                 :            : 
     119                 :          0 :         type = PIDTYPE_TGID;
     120         [ #  # ]:          0 :         if (who < 0) {
     121                 :            :                 /* avoid overflow below */
     122         [ #  # ]:          0 :                 if (who == INT_MIN)
     123                 :            :                         return -EINVAL;
     124                 :            : 
     125                 :          0 :                 type = PIDTYPE_PGID;
     126                 :          0 :                 who = -who;
     127                 :            :         }
     128                 :            : 
     129                 :          0 :         rcu_read_lock();
     130         [ #  # ]:          0 :         if (who) {
     131                 :          0 :                 pid = find_vpid(who);
     132         [ #  # ]:          0 :                 if (!pid)
     133                 :            :                         ret = -ESRCH;
     134                 :            :         }
     135                 :            : 
     136                 :            :         if (!ret)
     137                 :          0 :                 __f_setown(filp, pid, type, force);
     138                 :          0 :         rcu_read_unlock();
     139                 :            : 
     140                 :          0 :         return ret;
     141                 :            : }
     142                 :            : EXPORT_SYMBOL(f_setown);
     143                 :            : 
     144                 :          0 : void f_delown(struct file *filp)
     145                 :            : {
     146                 :          0 :         f_modown(filp, NULL, PIDTYPE_TGID, 1);
     147                 :          0 : }
     148                 :            : 
     149                 :          0 : pid_t f_getown(struct file *filp)
     150                 :            : {
     151                 :          0 :         pid_t pid;
     152                 :          0 :         read_lock(&filp->f_owner.lock);
     153                 :          0 :         pid = pid_vnr(filp->f_owner.pid);
     154         [ #  # ]:          0 :         if (filp->f_owner.pid_type == PIDTYPE_PGID)
     155                 :          0 :                 pid = -pid;
     156                 :          0 :         read_unlock(&filp->f_owner.lock);
     157                 :          0 :         return pid;
     158                 :            : }
     159                 :            : 
     160                 :          0 : static int f_setown_ex(struct file *filp, unsigned long arg)
     161                 :            : {
     162                 :          0 :         struct f_owner_ex __user *owner_p = (void __user *)arg;
     163                 :          0 :         struct f_owner_ex owner;
     164                 :          0 :         struct pid *pid;
     165                 :          0 :         int type;
     166                 :          0 :         int ret;
     167                 :            : 
     168                 :          0 :         ret = copy_from_user(&owner, owner_p, sizeof(owner));
     169         [ #  # ]:          0 :         if (ret)
     170                 :            :                 return -EFAULT;
     171                 :            : 
     172         [ #  # ]:          0 :         switch (owner.type) {
     173                 :            :         case F_OWNER_TID:
     174                 :            :                 type = PIDTYPE_PID;
     175                 :            :                 break;
     176                 :            : 
     177                 :            :         case F_OWNER_PID:
     178                 :            :                 type = PIDTYPE_TGID;
     179                 :            :                 break;
     180                 :            : 
     181                 :            :         case F_OWNER_PGRP:
     182                 :            :                 type = PIDTYPE_PGID;
     183                 :            :                 break;
     184                 :            : 
     185                 :            :         default:
     186                 :            :                 return -EINVAL;
     187                 :            :         }
     188                 :            : 
     189                 :          0 :         rcu_read_lock();
     190                 :          0 :         pid = find_vpid(owner.pid);
     191   [ #  #  #  # ]:          0 :         if (owner.pid && !pid)
     192                 :            :                 ret = -ESRCH;
     193                 :            :         else
     194                 :          0 :                  __f_setown(filp, pid, type, 1);
     195                 :          0 :         rcu_read_unlock();
     196                 :            : 
     197                 :          0 :         return ret;
     198                 :            : }
     199                 :            : 
     200                 :          0 : static int f_getown_ex(struct file *filp, unsigned long arg)
     201                 :            : {
     202                 :          0 :         struct f_owner_ex __user *owner_p = (void __user *)arg;
     203                 :          0 :         struct f_owner_ex owner;
     204                 :          0 :         int ret = 0;
     205                 :            : 
     206                 :          0 :         read_lock(&filp->f_owner.lock);
     207                 :          0 :         owner.pid = pid_vnr(filp->f_owner.pid);
     208   [ #  #  #  # ]:          0 :         switch (filp->f_owner.pid_type) {
     209                 :          0 :         case PIDTYPE_PID:
     210                 :          0 :                 owner.type = F_OWNER_TID;
     211                 :          0 :                 break;
     212                 :            : 
     213                 :          0 :         case PIDTYPE_TGID:
     214                 :          0 :                 owner.type = F_OWNER_PID;
     215                 :          0 :                 break;
     216                 :            : 
     217                 :          0 :         case PIDTYPE_PGID:
     218                 :          0 :                 owner.type = F_OWNER_PGRP;
     219                 :          0 :                 break;
     220                 :            : 
     221                 :            :         default:
     222                 :          0 :                 WARN_ON(1);
     223                 :          0 :                 ret = -EINVAL;
     224                 :          0 :                 break;
     225                 :            :         }
     226                 :          0 :         read_unlock(&filp->f_owner.lock);
     227                 :            : 
     228         [ #  # ]:          0 :         if (!ret) {
     229                 :          0 :                 ret = copy_to_user(owner_p, &owner, sizeof(owner));
     230         [ #  # ]:          0 :                 if (ret)
     231                 :          0 :                         ret = -EFAULT;
     232                 :            :         }
     233                 :          0 :         return ret;
     234                 :            : }
     235                 :            : 
     236                 :            : #ifdef CONFIG_CHECKPOINT_RESTORE
     237                 :            : static int f_getowner_uids(struct file *filp, unsigned long arg)
     238                 :            : {
     239                 :            :         struct user_namespace *user_ns = current_user_ns();
     240                 :            :         uid_t __user *dst = (void __user *)arg;
     241                 :            :         uid_t src[2];
     242                 :            :         int err;
     243                 :            : 
     244                 :            :         read_lock(&filp->f_owner.lock);
     245                 :            :         src[0] = from_kuid(user_ns, filp->f_owner.uid);
     246                 :            :         src[1] = from_kuid(user_ns, filp->f_owner.euid);
     247                 :            :         read_unlock(&filp->f_owner.lock);
     248                 :            : 
     249                 :            :         err  = put_user(src[0], &dst[0]);
     250                 :            :         err |= put_user(src[1], &dst[1]);
     251                 :            : 
     252                 :            :         return err;
     253                 :            : }
     254                 :            : #else
     255                 :            : static int f_getowner_uids(struct file *filp, unsigned long arg)
     256                 :            : {
     257                 :            :         return -EINVAL;
     258                 :            : }
     259                 :            : #endif
     260                 :            : 
     261                 :          0 : static bool rw_hint_valid(enum rw_hint hint)
     262                 :            : {
     263                 :          0 :         switch (hint) {
     264                 :            :         case RWH_WRITE_LIFE_NOT_SET:
     265                 :            :         case RWH_WRITE_LIFE_NONE:
     266                 :            :         case RWH_WRITE_LIFE_SHORT:
     267                 :            :         case RWH_WRITE_LIFE_MEDIUM:
     268                 :            :         case RWH_WRITE_LIFE_LONG:
     269                 :            :         case RWH_WRITE_LIFE_EXTREME:
     270                 :            :                 return true;
     271                 :            :         default:
     272                 :            :                 return false;
     273                 :            :         }
     274                 :            : }
     275                 :            : 
     276                 :          0 : static long fcntl_rw_hint(struct file *file, unsigned int cmd,
     277                 :            :                           unsigned long arg)
     278                 :            : {
     279   [ #  #  #  #  :          0 :         struct inode *inode = file_inode(file);
                      # ]
     280                 :          0 :         u64 __user *argp = (u64 __user *)arg;
     281                 :          0 :         enum rw_hint hint;
     282                 :          0 :         u64 h;
     283                 :            : 
     284   [ #  #  #  #  :          0 :         switch (cmd) {
                      # ]
     285                 :            :         case F_GET_FILE_RW_HINT:
     286         [ #  # ]:          0 :                 h = file_write_hint(file);
     287         [ #  # ]:          0 :                 if (copy_to_user(argp, &h, sizeof(*argp)))
     288                 :          0 :                         return -EFAULT;
     289                 :            :                 return 0;
     290                 :            :         case F_SET_FILE_RW_HINT:
     291         [ #  # ]:          0 :                 if (copy_from_user(&h, argp, sizeof(h)))
     292                 :            :                         return -EFAULT;
     293                 :          0 :                 hint = (enum rw_hint) h;
     294         [ #  # ]:          0 :                 if (!rw_hint_valid(hint))
     295                 :            :                         return -EINVAL;
     296                 :            : 
     297                 :          0 :                 spin_lock(&file->f_lock);
     298                 :          0 :                 file->f_write_hint = hint;
     299                 :          0 :                 spin_unlock(&file->f_lock);
     300                 :          0 :                 return 0;
     301                 :          0 :         case F_GET_RW_HINT:
     302                 :          0 :                 h = inode->i_write_hint;
     303         [ #  # ]:          0 :                 if (copy_to_user(argp, &h, sizeof(*argp)))
     304                 :          0 :                         return -EFAULT;
     305                 :            :                 return 0;
     306                 :            :         case F_SET_RW_HINT:
     307         [ #  # ]:          0 :                 if (copy_from_user(&h, argp, sizeof(h)))
     308                 :            :                         return -EFAULT;
     309                 :          0 :                 hint = (enum rw_hint) h;
     310         [ #  # ]:          0 :                 if (!rw_hint_valid(hint))
     311                 :            :                         return -EINVAL;
     312                 :            : 
     313                 :          0 :                 inode_lock(inode);
     314                 :          0 :                 inode->i_write_hint = hint;
     315                 :          0 :                 inode_unlock(inode);
     316                 :          0 :                 return 0;
     317                 :            :         default:
     318                 :            :                 return -EINVAL;
     319                 :            :         }
     320                 :            : }
     321                 :            : 
     322                 :     104270 : static long do_fcntl(int fd, unsigned int cmd, unsigned long arg,
     323                 :            :                 struct file *filp)
     324                 :            : {
     325                 :     104270 :         void __user *argp = (void __user *)arg;
     326                 :     104270 :         struct flock flock;
     327                 :     104270 :         long err = -EINVAL;
     328                 :            : 
     329   [ +  +  +  +  :     104270 :         switch (cmd) {
          +  +  -  +  -  
          -  -  -  -  -  
          -  -  -  -  -  
                   -  - ]
     330                 :      16380 :         case F_DUPFD:
     331                 :      16380 :                 err = f_dupfd(arg, filp, 0);
     332                 :      16380 :                 break;
     333                 :      21896 :         case F_DUPFD_CLOEXEC:
     334                 :      21896 :                 err = f_dupfd(arg, filp, O_CLOEXEC);
     335                 :      21896 :                 break;
     336                 :        756 :         case F_GETFD:
     337                 :        756 :                 err = get_close_on_exec(fd) ? FD_CLOEXEC : 0;
     338                 :        756 :                 break;
     339                 :      25788 :         case F_SETFD:
     340                 :      25788 :                 err = 0;
     341                 :      25788 :                 set_close_on_exec(fd, arg & FD_CLOEXEC);
     342                 :      25788 :                 break;
     343                 :      38778 :         case F_GETFL:
     344                 :      38778 :                 err = filp->f_flags;
     345                 :      38778 :                 break;
     346                 :        448 :         case F_SETFL:
     347                 :        448 :                 err = setfl(fd, filp, arg);
     348                 :        448 :                 break;
     349                 :            : #if BITS_PER_LONG != 32
     350                 :            :         /* 32-bit arches must use fcntl64() */
     351                 :            :         case F_OFD_GETLK:
     352                 :            : #endif
     353                 :            :         case F_GETLK:
     354         [ #  # ]:          0 :                 if (copy_from_user(&flock, argp, sizeof(flock)))
     355                 :            :                         return -EFAULT;
     356                 :          0 :                 err = fcntl_getlk(filp, cmd, &flock);
     357   [ #  #  #  # ]:          0 :                 if (!err && copy_to_user(argp, &flock, sizeof(flock)))
     358                 :          0 :                         return -EFAULT;
     359                 :            :                 break;
     360                 :            : #if BITS_PER_LONG != 32
     361                 :            :         /* 32-bit arches must use fcntl64() */
     362                 :            :         case F_OFD_SETLK:
     363                 :            :         case F_OFD_SETLKW:
     364                 :            : #endif
     365                 :            :                 /* Fallthrough */
     366                 :            :         case F_SETLK:
     367                 :            :         case F_SETLKW:
     368         [ +  - ]:        224 :                 if (copy_from_user(&flock, argp, sizeof(flock)))
     369                 :            :                         return -EFAULT;
     370                 :        224 :                 err = fcntl_setlk(fd, filp, cmd, &flock);
     371                 :        224 :                 break;
     372                 :          0 :         case F_GETOWN:
     373                 :            :                 /*
     374                 :            :                  * XXX If f_owner is a process group, the
     375                 :            :                  * negative return value will get converted
     376                 :            :                  * into an error.  Oops.  If we keep the
     377                 :            :                  * current syscall conventions, the only way
     378                 :            :                  * to fix this will be in libc.
     379                 :            :                  */
     380                 :          0 :                 err = f_getown(filp);
     381                 :          0 :                 force_successful_syscall_return();
     382                 :          0 :                 break;
     383                 :          0 :         case F_SETOWN:
     384                 :          0 :                 err = f_setown(filp, arg, 1);
     385                 :          0 :                 break;
     386                 :          0 :         case F_GETOWN_EX:
     387                 :          0 :                 err = f_getown_ex(filp, arg);
     388                 :          0 :                 break;
     389                 :          0 :         case F_SETOWN_EX:
     390                 :          0 :                 err = f_setown_ex(filp, arg);
     391                 :          0 :                 break;
     392                 :            :         case F_GETOWNER_UIDS:
     393                 :            :                 err = f_getowner_uids(filp, arg);
     394                 :            :                 break;
     395                 :          0 :         case F_GETSIG:
     396                 :          0 :                 err = filp->f_owner.signum;
     397                 :          0 :                 break;
     398                 :            :         case F_SETSIG:
     399                 :            :                 /* arg == 0 restores default behaviour. */
     400         [ #  # ]:          0 :                 if (!valid_signal(arg)) {
     401                 :            :                         break;
     402                 :            :                 }
     403                 :          0 :                 err = 0;
     404                 :          0 :                 filp->f_owner.signum = arg;
     405                 :          0 :                 break;
     406                 :          0 :         case F_GETLEASE:
     407                 :          0 :                 err = fcntl_getlease(filp);
     408                 :          0 :                 break;
     409                 :          0 :         case F_SETLEASE:
     410                 :          0 :                 err = fcntl_setlease(fd, filp, arg);
     411                 :          0 :                 break;
     412                 :          0 :         case F_NOTIFY:
     413                 :          0 :                 err = fcntl_dirnotify(fd, filp, arg);
     414                 :          0 :                 break;
     415                 :          0 :         case F_SETPIPE_SZ:
     416                 :            :         case F_GETPIPE_SZ:
     417                 :          0 :                 err = pipe_fcntl(filp, cmd, arg);
     418                 :          0 :                 break;
     419                 :          0 :         case F_ADD_SEALS:
     420                 :            :         case F_GET_SEALS:
     421                 :          0 :                 err = memfd_fcntl(filp, cmd, arg);
     422                 :          0 :                 break;
     423                 :          0 :         case F_GET_RW_HINT:
     424                 :            :         case F_SET_RW_HINT:
     425                 :            :         case F_GET_FILE_RW_HINT:
     426                 :            :         case F_SET_FILE_RW_HINT:
     427                 :          0 :                 err = fcntl_rw_hint(filp, cmd, arg);
     428                 :          0 :                 break;
     429                 :            :         default:
     430                 :            :                 break;
     431                 :            :         }
     432                 :          0 :         return err;
     433                 :            : }
     434                 :            : 
     435                 :         28 : static int check_fcntl_cmd(unsigned cmd)
     436                 :            : {
     437                 :         28 :         switch (cmd) {
     438                 :            :         case F_DUPFD:
     439                 :            :         case F_DUPFD_CLOEXEC:
     440                 :            :         case F_GETFD:
     441                 :            :         case F_SETFD:
     442                 :            :         case F_GETFL:
     443                 :            :                 return 1;
     444                 :            :         }
     445                 :          0 :         return 0;
     446                 :            : }
     447                 :            : 
     448                 :     208820 : SYSCALL_DEFINE3(fcntl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
     449                 :            : {       
     450                 :     104410 :         struct fd f = fdget_raw(fd);
     451                 :     104410 :         long err = -EBADF;
     452                 :            : 
     453         [ +  + ]:     104410 :         if (!f.file)
     454                 :        140 :                 goto out;
     455                 :            : 
     456         [ +  + ]:     104270 :         if (unlikely(f.file->f_mode & FMODE_PATH)) {
     457         [ -  + ]:         28 :                 if (!check_fcntl_cmd(cmd))
     458                 :          0 :                         goto out1;
     459                 :            :         }
     460                 :            : 
     461                 :     104270 :         err = security_file_fcntl(f.file, cmd, arg);
     462         [ -  + ]:     104270 :         if (!err)
     463                 :     104270 :                 err = do_fcntl(fd, cmd, arg, f.file);
     464                 :            : 
     465                 :          0 : out1:
     466         [ -  + ]:     104270 :         fdput(f);
     467                 :     104410 : out:
     468                 :     104410 :         return err;
     469                 :            : }
     470                 :            : 
     471                 :            : #if BITS_PER_LONG == 32
     472                 :            : SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd,
     473                 :            :                 unsigned long, arg)
     474                 :            : {       
     475                 :            :         void __user *argp = (void __user *)arg;
     476                 :            :         struct fd f = fdget_raw(fd);
     477                 :            :         struct flock64 flock;
     478                 :            :         long err = -EBADF;
     479                 :            : 
     480                 :            :         if (!f.file)
     481                 :            :                 goto out;
     482                 :            : 
     483                 :            :         if (unlikely(f.file->f_mode & FMODE_PATH)) {
     484                 :            :                 if (!check_fcntl_cmd(cmd))
     485                 :            :                         goto out1;
     486                 :            :         }
     487                 :            : 
     488                 :            :         err = security_file_fcntl(f.file, cmd, arg);
     489                 :            :         if (err)
     490                 :            :                 goto out1;
     491                 :            :         
     492                 :            :         switch (cmd) {
     493                 :            :         case F_GETLK64:
     494                 :            :         case F_OFD_GETLK:
     495                 :            :                 err = -EFAULT;
     496                 :            :                 if (copy_from_user(&flock, argp, sizeof(flock)))
     497                 :            :                         break;
     498                 :            :                 err = fcntl_getlk64(f.file, cmd, &flock);
     499                 :            :                 if (!err && copy_to_user(argp, &flock, sizeof(flock)))
     500                 :            :                         err = -EFAULT;
     501                 :            :                 break;
     502                 :            :         case F_SETLK64:
     503                 :            :         case F_SETLKW64:
     504                 :            :         case F_OFD_SETLK:
     505                 :            :         case F_OFD_SETLKW:
     506                 :            :                 err = -EFAULT;
     507                 :            :                 if (copy_from_user(&flock, argp, sizeof(flock)))
     508                 :            :                         break;
     509                 :            :                 err = fcntl_setlk64(fd, f.file, cmd, &flock);
     510                 :            :                 break;
     511                 :            :         default:
     512                 :            :                 err = do_fcntl(fd, cmd, arg, f.file);
     513                 :            :                 break;
     514                 :            :         }
     515                 :            : out1:
     516                 :            :         fdput(f);
     517                 :            : out:
     518                 :            :         return err;
     519                 :            : }
     520                 :            : #endif
     521                 :            : 
     522                 :            : #ifdef CONFIG_COMPAT
     523                 :            : /* careful - don't use anywhere else */
     524                 :            : #define copy_flock_fields(dst, src)             \
     525                 :            :         (dst)->l_type = (src)->l_type;            \
     526                 :            :         (dst)->l_whence = (src)->l_whence;        \
     527                 :            :         (dst)->l_start = (src)->l_start;  \
     528                 :            :         (dst)->l_len = (src)->l_len;              \
     529                 :            :         (dst)->l_pid = (src)->l_pid;
     530                 :            : 
     531                 :          0 : static int get_compat_flock(struct flock *kfl, const struct compat_flock __user *ufl)
     532                 :            : {
     533                 :          0 :         struct compat_flock fl;
     534                 :            : 
     535         [ #  # ]:          0 :         if (copy_from_user(&fl, ufl, sizeof(struct compat_flock)))
     536                 :            :                 return -EFAULT;
     537                 :          0 :         copy_flock_fields(kfl, &fl);
     538                 :          0 :         return 0;
     539                 :            : }
     540                 :            : 
     541                 :          0 : static int get_compat_flock64(struct flock *kfl, const struct compat_flock64 __user *ufl)
     542                 :            : {
     543                 :          0 :         struct compat_flock64 fl;
     544                 :            : 
     545         [ #  # ]:          0 :         if (copy_from_user(&fl, ufl, sizeof(struct compat_flock64)))
     546                 :            :                 return -EFAULT;
     547                 :          0 :         copy_flock_fields(kfl, &fl);
     548                 :          0 :         return 0;
     549                 :            : }
     550                 :            : 
     551                 :          0 : static int put_compat_flock(const struct flock *kfl, struct compat_flock __user *ufl)
     552                 :            : {
     553                 :          0 :         struct compat_flock fl;
     554                 :            : 
     555                 :          0 :         memset(&fl, 0, sizeof(struct compat_flock));
     556                 :          0 :         copy_flock_fields(&fl, kfl);
     557         [ #  # ]:          0 :         if (copy_to_user(ufl, &fl, sizeof(struct compat_flock)))
     558                 :          0 :                 return -EFAULT;
     559                 :            :         return 0;
     560                 :            : }
     561                 :            : 
     562                 :          0 : static int put_compat_flock64(const struct flock *kfl, struct compat_flock64 __user *ufl)
     563                 :            : {
     564                 :          0 :         struct compat_flock64 fl;
     565                 :            : 
     566                 :          0 :         BUILD_BUG_ON(sizeof(kfl->l_start) > sizeof(ufl->l_start));
     567                 :          0 :         BUILD_BUG_ON(sizeof(kfl->l_len) > sizeof(ufl->l_len));
     568                 :            : 
     569                 :          0 :         memset(&fl, 0, sizeof(struct compat_flock64));
     570                 :          0 :         copy_flock_fields(&fl, kfl);
     571         [ #  # ]:          0 :         if (copy_to_user(ufl, &fl, sizeof(struct compat_flock64)))
     572                 :          0 :                 return -EFAULT;
     573                 :            :         return 0;
     574                 :            : }
     575                 :            : #undef copy_flock_fields
     576                 :            : 
     577                 :            : static unsigned int
     578                 :          0 : convert_fcntl_cmd(unsigned int cmd)
     579                 :            : {
     580                 :          0 :         switch (cmd) {
     581                 :            :         case F_GETLK64:
     582                 :            :                 return F_GETLK;
     583                 :            :         case F_SETLK64:
     584                 :            :                 return F_SETLK;
     585                 :            :         case F_SETLKW64:
     586                 :            :                 return F_SETLKW;
     587                 :            :         }
     588                 :            : 
     589                 :            :         return cmd;
     590                 :            : }
     591                 :            : 
     592                 :            : /*
     593                 :            :  * GETLK was successful and we need to return the data, but it needs to fit in
     594                 :            :  * the compat structure.
     595                 :            :  * l_start shouldn't be too big, unless the original start + end is greater than
     596                 :            :  * COMPAT_OFF_T_MAX, in which case the app was asking for trouble, so we return
     597                 :            :  * -EOVERFLOW in that case.  l_len could be too big, in which case we just
     598                 :            :  * truncate it, and only allow the app to see that part of the conflicting lock
     599                 :            :  * that might make sense to it anyway
     600                 :            :  */
     601                 :          0 : static int fixup_compat_flock(struct flock *flock)
     602                 :            : {
     603                 :          0 :         if (flock->l_start > COMPAT_OFF_T_MAX)
     604                 :            :                 return -EOVERFLOW;
     605         [ #  # ]:          0 :         if (flock->l_len > COMPAT_OFF_T_MAX)
     606                 :          0 :                 flock->l_len = COMPAT_OFF_T_MAX;
     607                 :            :         return 0;
     608                 :            : }
     609                 :            : 
     610                 :          0 : static long do_compat_fcntl64(unsigned int fd, unsigned int cmd,
     611                 :            :                              compat_ulong_t arg)
     612                 :            : {
     613                 :          0 :         struct fd f = fdget_raw(fd);
     614                 :          0 :         struct flock flock;
     615                 :          0 :         long err = -EBADF;
     616                 :            : 
     617         [ #  # ]:          0 :         if (!f.file)
     618                 :            :                 return err;
     619                 :            : 
     620         [ #  # ]:          0 :         if (unlikely(f.file->f_mode & FMODE_PATH)) {
     621         [ #  # ]:          0 :                 if (!check_fcntl_cmd(cmd))
     622                 :          0 :                         goto out_put;
     623                 :            :         }
     624                 :            : 
     625                 :          0 :         err = security_file_fcntl(f.file, cmd, arg);
     626         [ #  # ]:          0 :         if (err)
     627                 :          0 :                 goto out_put;
     628                 :            : 
     629   [ #  #  #  #  :          0 :         switch (cmd) {
                      # ]
     630                 :            :         case F_GETLK:
     631                 :          0 :                 err = get_compat_flock(&flock, compat_ptr(arg));
     632         [ #  # ]:          0 :                 if (err)
     633                 :            :                         break;
     634         [ #  # ]:          0 :                 err = fcntl_getlk(f.file, convert_fcntl_cmd(cmd), &flock);
     635         [ #  # ]:          0 :                 if (err)
     636                 :            :                         break;
     637         [ #  # ]:          0 :                 err = fixup_compat_flock(&flock);
     638         [ #  # ]:          0 :                 if (!err)
     639                 :          0 :                         err = put_compat_flock(&flock, compat_ptr(arg));
     640                 :            :                 break;
     641                 :            :         case F_GETLK64:
     642                 :            :         case F_OFD_GETLK:
     643                 :          0 :                 err = get_compat_flock64(&flock, compat_ptr(arg));
     644         [ #  # ]:          0 :                 if (err)
     645                 :            :                         break;
     646         [ #  # ]:          0 :                 err = fcntl_getlk(f.file, convert_fcntl_cmd(cmd), &flock);
     647         [ #  # ]:          0 :                 if (!err)
     648                 :          0 :                         err = put_compat_flock64(&flock, compat_ptr(arg));
     649                 :            :                 break;
     650                 :            :         case F_SETLK:
     651                 :            :         case F_SETLKW:
     652                 :          0 :                 err = get_compat_flock(&flock, compat_ptr(arg));
     653         [ #  # ]:          0 :                 if (err)
     654                 :            :                         break;
     655         [ #  # ]:          0 :                 err = fcntl_setlk(fd, f.file, convert_fcntl_cmd(cmd), &flock);
     656                 :          0 :                 break;
     657                 :            :         case F_SETLK64:
     658                 :            :         case F_SETLKW64:
     659                 :            :         case F_OFD_SETLK:
     660                 :            :         case F_OFD_SETLKW:
     661                 :          0 :                 err = get_compat_flock64(&flock, compat_ptr(arg));
     662         [ #  # ]:          0 :                 if (err)
     663                 :            :                         break;
     664         [ #  # ]:          0 :                 err = fcntl_setlk(fd, f.file, convert_fcntl_cmd(cmd), &flock);
     665                 :          0 :                 break;
     666                 :          0 :         default:
     667                 :          0 :                 err = do_fcntl(fd, cmd, arg, f.file);
     668                 :          0 :                 break;
     669                 :            :         }
     670                 :          0 : out_put:
     671         [ #  # ]:          0 :         fdput(f);
     672                 :            :         return err;
     673                 :            : }
     674                 :            : 
     675                 :          0 : COMPAT_SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd,
     676                 :            :                        compat_ulong_t, arg)
     677                 :            : {
     678                 :          0 :         return do_compat_fcntl64(fd, cmd, arg);
     679                 :            : }
     680                 :            : 
     681                 :          0 : COMPAT_SYSCALL_DEFINE3(fcntl, unsigned int, fd, unsigned int, cmd,
     682                 :            :                        compat_ulong_t, arg)
     683                 :            : {
     684         [ #  # ]:          0 :         switch (cmd) {
     685                 :            :         case F_GETLK64:
     686                 :            :         case F_SETLK64:
     687                 :            :         case F_SETLKW64:
     688                 :            :         case F_OFD_GETLK:
     689                 :            :         case F_OFD_SETLK:
     690                 :            :         case F_OFD_SETLKW:
     691                 :            :                 return -EINVAL;
     692                 :            :         }
     693                 :          0 :         return do_compat_fcntl64(fd, cmd, arg);
     694                 :            : }
     695                 :            : #endif
     696                 :            : 
     697                 :            : /* Table to convert sigio signal codes into poll band bitmaps */
     698                 :            : 
     699                 :            : static const __poll_t band_table[NSIGPOLL] = {
     700                 :            :         EPOLLIN | EPOLLRDNORM,                  /* POLL_IN */
     701                 :            :         EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND,   /* POLL_OUT */
     702                 :            :         EPOLLIN | EPOLLRDNORM | EPOLLMSG,               /* POLL_MSG */
     703                 :            :         EPOLLERR,                               /* POLL_ERR */
     704                 :            :         EPOLLPRI | EPOLLRDBAND,                 /* POLL_PRI */
     705                 :            :         EPOLLHUP | EPOLLERR                     /* POLL_HUP */
     706                 :            : };
     707                 :            : 
     708                 :          0 : static inline int sigio_perm(struct task_struct *p,
     709                 :            :                              struct fown_struct *fown, int sig)
     710                 :            : {
     711                 :          0 :         const struct cred *cred;
     712                 :          0 :         int ret;
     713                 :            : 
     714                 :          0 :         rcu_read_lock();
     715         [ #  # ]:          0 :         cred = __task_cred(p);
     716   [ #  #  #  # ]:          0 :         ret = ((uid_eq(fown->euid, GLOBAL_ROOT_UID) ||
     717   [ #  #  #  # ]:          0 :                 uid_eq(fown->euid, cred->suid) || uid_eq(fown->euid, cred->uid) ||
     718   [ #  #  #  #  :          0 :                 uid_eq(fown->uid,  cred->suid) || uid_eq(fown->uid,  cred->uid)) &&
                   #  # ]
     719                 :          0 :                !security_file_send_sigiotask(p, fown, sig));
     720                 :          0 :         rcu_read_unlock();
     721                 :          0 :         return ret;
     722                 :            : }
     723                 :            : 
     724                 :          0 : static void send_sigio_to_task(struct task_struct *p,
     725                 :            :                                struct fown_struct *fown,
     726                 :            :                                int fd, int reason, enum pid_type type)
     727                 :            : {
     728                 :            :         /*
     729                 :            :          * F_SETSIG can change ->signum lockless in parallel, make
     730                 :            :          * sure we read it once and use the same value throughout.
     731                 :            :          */
     732                 :          0 :         int signum = READ_ONCE(fown->signum);
     733                 :            : 
     734         [ #  # ]:          0 :         if (!sigio_perm(p, fown, signum))
     735                 :            :                 return;
     736                 :            : 
     737         [ #  # ]:          0 :         switch (signum) {
     738                 :            :                 default: {
     739                 :          0 :                         kernel_siginfo_t si;
     740                 :            : 
     741                 :            :                         /* Queue a rt signal with the appropriate fd as its
     742                 :            :                            value.  We use SI_SIGIO as the source, not 
     743                 :            :                            SI_KERNEL, since kernel signals always get 
     744                 :            :                            delivered even if we can't queue.  Failure to
     745                 :            :                            queue in this case _should_ be reported; we fall
     746                 :            :                            back to SIGIO in that case. --sct */
     747         [ #  # ]:          0 :                         clear_siginfo(&si);
     748                 :          0 :                         si.si_signo = signum;
     749                 :          0 :                         si.si_errno = 0;
     750                 :          0 :                         si.si_code  = reason;
     751                 :            :                         /*
     752                 :            :                          * Posix definies POLL_IN and friends to be signal
     753                 :            :                          * specific si_codes for SIG_POLL.  Linux extended
     754                 :            :                          * these si_codes to other signals in a way that is
     755                 :            :                          * ambiguous if other signals also have signal
     756                 :            :                          * specific si_codes.  In that case use SI_SIGIO instead
     757                 :            :                          * to remove the ambiguity.
     758                 :            :                          */
     759   [ #  #  #  #  :          0 :                         if ((signum != SIGPOLL) && sig_specific_sicodes(signum))
                   #  # ]
     760                 :          0 :                                 si.si_code = SI_SIGIO;
     761                 :            : 
     762                 :            :                         /* Make sure we are called with one of the POLL_*
     763                 :            :                            reasons, otherwise we could leak kernel stack into
     764                 :            :                            userspace.  */
     765   [ #  #  #  # ]:          0 :                         BUG_ON((reason < POLL_IN) || ((reason - POLL_IN) >= NSIGPOLL));
     766         [ #  # ]:          0 :                         if (reason - POLL_IN >= NSIGPOLL)
     767                 :          0 :                                 si.si_band  = ~0L;
     768                 :            :                         else
     769                 :          0 :                                 si.si_band = mangle_poll(band_table[reason - POLL_IN]);
     770                 :          0 :                         si.si_fd    = fd;
     771         [ #  # ]:          0 :                         if (!do_send_sig_info(signum, &si, p, type))
     772                 :            :                                 break;
     773                 :            :                 }
     774                 :            :                 /* fall-through - fall back on the old plain SIGIO signal */
     775                 :            :                 case 0:
     776                 :          0 :                         do_send_sig_info(SIGIO, SEND_SIG_PRIV, p, type);
     777                 :            :         }
     778                 :            : }
     779                 :            : 
     780                 :          0 : void send_sigio(struct fown_struct *fown, int fd, int band)
     781                 :            : {
     782                 :          0 :         struct task_struct *p;
     783                 :          0 :         enum pid_type type;
     784                 :          0 :         struct pid *pid;
     785                 :            :         
     786                 :          0 :         read_lock(&fown->lock);
     787                 :            : 
     788                 :          0 :         type = fown->pid_type;
     789                 :          0 :         pid = fown->pid;
     790         [ #  # ]:          0 :         if (!pid)
     791                 :          0 :                 goto out_unlock_fown;
     792                 :            : 
     793         [ #  # ]:          0 :         if (type <= PIDTYPE_TGID) {
     794                 :          0 :                 rcu_read_lock();
     795                 :          0 :                 p = pid_task(pid, PIDTYPE_PID);
     796         [ #  # ]:          0 :                 if (p)
     797                 :          0 :                         send_sigio_to_task(p, fown, fd, band, type);
     798                 :          0 :                 rcu_read_unlock();
     799                 :            :         } else {
     800                 :          0 :                 read_lock(&tasklist_lock);
     801   [ #  #  #  # ]:          0 :                 do_each_pid_task(pid, type, p) {
     802                 :          0 :                         send_sigio_to_task(p, fown, fd, band, type);
     803         [ #  # ]:          0 :                 } while_each_pid_task(pid, type, p);
     804                 :          0 :                 read_unlock(&tasklist_lock);
     805                 :            :         }
     806                 :          0 :  out_unlock_fown:
     807                 :          0 :         read_unlock(&fown->lock);
     808                 :          0 : }
     809                 :            : 
     810                 :          0 : static void send_sigurg_to_task(struct task_struct *p,
     811                 :            :                                 struct fown_struct *fown, enum pid_type type)
     812                 :            : {
     813         [ #  # ]:          0 :         if (sigio_perm(p, fown, SIGURG))
     814                 :          0 :                 do_send_sig_info(SIGURG, SEND_SIG_PRIV, p, type);
     815                 :          0 : }
     816                 :            : 
     817                 :          0 : int send_sigurg(struct fown_struct *fown)
     818                 :            : {
     819                 :          0 :         struct task_struct *p;
     820                 :          0 :         enum pid_type type;
     821                 :          0 :         struct pid *pid;
     822                 :          0 :         int ret = 0;
     823                 :            :         
     824                 :          0 :         read_lock(&fown->lock);
     825                 :            : 
     826                 :          0 :         type = fown->pid_type;
     827                 :          0 :         pid = fown->pid;
     828         [ #  # ]:          0 :         if (!pid)
     829                 :          0 :                 goto out_unlock_fown;
     830                 :            : 
     831                 :          0 :         ret = 1;
     832                 :            : 
     833         [ #  # ]:          0 :         if (type <= PIDTYPE_TGID) {
     834                 :          0 :                 rcu_read_lock();
     835                 :          0 :                 p = pid_task(pid, PIDTYPE_PID);
     836         [ #  # ]:          0 :                 if (p)
     837                 :          0 :                         send_sigurg_to_task(p, fown, type);
     838                 :          0 :                 rcu_read_unlock();
     839                 :            :         } else {
     840                 :          0 :                 read_lock(&tasklist_lock);
     841   [ #  #  #  # ]:          0 :                 do_each_pid_task(pid, type, p) {
     842                 :          0 :                         send_sigurg_to_task(p, fown, type);
     843         [ #  # ]:          0 :                 } while_each_pid_task(pid, type, p);
     844                 :          0 :                 read_unlock(&tasklist_lock);
     845                 :            :         }
     846                 :          0 :  out_unlock_fown:
     847                 :          0 :         read_unlock(&fown->lock);
     848                 :          0 :         return ret;
     849                 :            : }
     850                 :            : 
     851                 :            : static DEFINE_SPINLOCK(fasync_lock);
     852                 :            : static struct kmem_cache *fasync_cache __read_mostly;
     853                 :            : 
     854                 :          0 : static void fasync_free_rcu(struct rcu_head *head)
     855                 :            : {
     856                 :          0 :         kmem_cache_free(fasync_cache,
     857                 :          0 :                         container_of(head, struct fasync_struct, fa_rcu));
     858                 :          0 : }
     859                 :            : 
     860                 :            : /*
     861                 :            :  * Remove a fasync entry. If successfully removed, return
     862                 :            :  * positive and clear the FASYNC flag. If no entry exists,
     863                 :            :  * do nothing and return 0.
     864                 :            :  *
     865                 :            :  * NOTE! It is very important that the FASYNC flag always
     866                 :            :  * match the state "is the filp on a fasync list".
     867                 :            :  *
     868                 :            :  */
     869                 :       2576 : int fasync_remove_entry(struct file *filp, struct fasync_struct **fapp)
     870                 :            : {
     871                 :       2576 :         struct fasync_struct *fa, **fp;
     872                 :       2576 :         int result = 0;
     873                 :            : 
     874                 :       2576 :         spin_lock(&filp->f_lock);
     875                 :       2576 :         spin_lock(&fasync_lock);
     876         [ -  + ]:       5152 :         for (fp = fapp; (fa = *fp) != NULL; fp = &fa->fa_next) {
     877         [ #  # ]:          0 :                 if (fa->fa_file != filp)
     878                 :          0 :                         continue;
     879                 :            : 
     880                 :          0 :                 write_lock_irq(&fa->fa_lock);
     881                 :          0 :                 fa->fa_file = NULL;
     882                 :          0 :                 write_unlock_irq(&fa->fa_lock);
     883                 :            : 
     884                 :          0 :                 *fp = fa->fa_next;
     885                 :          0 :                 call_rcu(&fa->fa_rcu, fasync_free_rcu);
     886                 :          0 :                 filp->f_flags &= ~FASYNC;
     887                 :          0 :                 result = 1;
     888                 :          0 :                 break;
     889                 :            :         }
     890                 :       2576 :         spin_unlock(&fasync_lock);
     891                 :       2576 :         spin_unlock(&filp->f_lock);
     892                 :       2576 :         return result;
     893                 :            : }
     894                 :            : 
     895                 :          0 : struct fasync_struct *fasync_alloc(void)
     896                 :            : {
     897                 :          0 :         return kmem_cache_alloc(fasync_cache, GFP_KERNEL);
     898                 :            : }
     899                 :            : 
     900                 :            : /*
     901                 :            :  * NOTE! This can be used only for unused fasync entries:
     902                 :            :  * entries that actually got inserted on the fasync list
     903                 :            :  * need to be released by rcu - see fasync_remove_entry.
     904                 :            :  */
     905                 :          0 : void fasync_free(struct fasync_struct *new)
     906                 :            : {
     907                 :          0 :         kmem_cache_free(fasync_cache, new);
     908                 :          0 : }
     909                 :            : 
     910                 :            : /*
     911                 :            :  * Insert a new entry into the fasync list.  Return the pointer to the
     912                 :            :  * old one if we didn't use the new one.
     913                 :            :  *
     914                 :            :  * NOTE! It is very important that the FASYNC flag always
     915                 :            :  * match the state "is the filp on a fasync list".
     916                 :            :  */
     917                 :          0 : struct fasync_struct *fasync_insert_entry(int fd, struct file *filp, struct fasync_struct **fapp, struct fasync_struct *new)
     918                 :            : {
     919                 :          0 :         struct fasync_struct *fa, **fp;
     920                 :            : 
     921                 :          0 :         spin_lock(&filp->f_lock);
     922                 :          0 :         spin_lock(&fasync_lock);
     923         [ #  # ]:          0 :         for (fp = fapp; (fa = *fp) != NULL; fp = &fa->fa_next) {
     924         [ #  # ]:          0 :                 if (fa->fa_file != filp)
     925                 :          0 :                         continue;
     926                 :            : 
     927                 :          0 :                 write_lock_irq(&fa->fa_lock);
     928                 :          0 :                 fa->fa_fd = fd;
     929                 :          0 :                 write_unlock_irq(&fa->fa_lock);
     930                 :          0 :                 goto out;
     931                 :            :         }
     932                 :            : 
     933                 :          0 :         rwlock_init(&new->fa_lock);
     934                 :          0 :         new->magic = FASYNC_MAGIC;
     935                 :          0 :         new->fa_file = filp;
     936                 :          0 :         new->fa_fd = fd;
     937                 :          0 :         new->fa_next = *fapp;
     938                 :          0 :         rcu_assign_pointer(*fapp, new);
     939                 :          0 :         filp->f_flags |= FASYNC;
     940                 :            : 
     941                 :          0 : out:
     942                 :          0 :         spin_unlock(&fasync_lock);
     943                 :          0 :         spin_unlock(&filp->f_lock);
     944                 :          0 :         return fa;
     945                 :            : }
     946                 :            : 
     947                 :            : /*
     948                 :            :  * Add a fasync entry. Return negative on error, positive if
     949                 :            :  * added, and zero if did nothing but change an existing one.
     950                 :            :  */
     951                 :          0 : static int fasync_add_entry(int fd, struct file *filp, struct fasync_struct **fapp)
     952                 :            : {
     953                 :          0 :         struct fasync_struct *new;
     954                 :            : 
     955                 :          0 :         new = fasync_alloc();
     956         [ #  # ]:          0 :         if (!new)
     957                 :            :                 return -ENOMEM;
     958                 :            : 
     959                 :            :         /*
     960                 :            :          * fasync_insert_entry() returns the old (update) entry if
     961                 :            :          * it existed.
     962                 :            :          *
     963                 :            :          * So free the (unused) new entry and return 0 to let the
     964                 :            :          * caller know that we didn't add any new fasync entries.
     965                 :            :          */
     966         [ #  # ]:          0 :         if (fasync_insert_entry(fd, filp, fapp, new)) {
     967                 :          0 :                 fasync_free(new);
     968                 :          0 :                 return 0;
     969                 :            :         }
     970                 :            : 
     971                 :            :         return 1;
     972                 :            : }
     973                 :            : 
     974                 :            : /*
     975                 :            :  * fasync_helper() is used by almost all character device drivers
     976                 :            :  * to set up the fasync queue, and for regular files by the file
     977                 :            :  * lease code. It returns negative on error, 0 if it did no changes
     978                 :            :  * and positive if it added/deleted the entry.
     979                 :            :  */
     980                 :       2576 : int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fapp)
     981                 :            : {
     982         [ +  - ]:       2576 :         if (!on)
     983                 :       2576 :                 return fasync_remove_entry(filp, fapp);
     984                 :          0 :         return fasync_add_entry(fd, filp, fapp);
     985                 :            : }
     986                 :            : 
     987                 :            : EXPORT_SYMBOL(fasync_helper);
     988                 :            : 
     989                 :            : /*
     990                 :            :  * rcu_read_lock() is held
     991                 :            :  */
     992                 :          0 : static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band)
     993                 :            : {
     994         [ #  # ]:          0 :         while (fa) {
     995                 :          0 :                 struct fown_struct *fown;
     996                 :            : 
     997         [ #  # ]:          0 :                 if (fa->magic != FASYNC_MAGIC) {
     998                 :          0 :                         printk(KERN_ERR "kill_fasync: bad magic number in "
     999                 :            :                                "fasync_struct!\n");
    1000                 :          0 :                         return;
    1001                 :            :                 }
    1002                 :          0 :                 read_lock(&fa->fa_lock);
    1003         [ #  # ]:          0 :                 if (fa->fa_file) {
    1004                 :          0 :                         fown = &fa->fa_file->f_owner;
    1005                 :            :                         /* Don't send SIGURG to processes which have not set a
    1006                 :            :                            queued signum: SIGURG has its own default signalling
    1007                 :            :                            mechanism. */
    1008   [ #  #  #  # ]:          0 :                         if (!(sig == SIGURG && fown->signum == 0))
    1009                 :          0 :                                 send_sigio(fown, fa->fa_fd, band);
    1010                 :            :                 }
    1011                 :          0 :                 read_unlock(&fa->fa_lock);
    1012                 :          0 :                 fa = rcu_dereference(fa->fa_next);
    1013                 :            :         }
    1014                 :            : }
    1015                 :            : 
    1016                 :       3849 : void kill_fasync(struct fasync_struct **fp, int sig, int band)
    1017                 :            : {
    1018                 :            :         /* First a quick test without locking: usually
    1019                 :            :          * the list is empty.
    1020                 :            :          */
    1021         [ -  + ]:       3849 :         if (*fp) {
    1022                 :          0 :                 rcu_read_lock();
    1023                 :          0 :                 kill_fasync_rcu(rcu_dereference(*fp), sig, band);
    1024                 :          0 :                 rcu_read_unlock();
    1025                 :            :         }
    1026                 :       3849 : }
    1027                 :            : EXPORT_SYMBOL(kill_fasync);
    1028                 :            : 
    1029                 :         28 : static int __init fcntl_init(void)
    1030                 :            : {
    1031                 :            :         /*
    1032                 :            :          * Please add new bits here to ensure allocation uniqueness.
    1033                 :            :          * Exceptions: O_NONBLOCK is a two bit define on parisc; O_NDELAY
    1034                 :            :          * is defined as O_NONBLOCK on some platforms and not on others.
    1035                 :            :          */
    1036                 :         28 :         BUILD_BUG_ON(21 - 1 /* for O_RDONLY being 0 */ !=
    1037                 :            :                 HWEIGHT32(
    1038                 :            :                         (VALID_OPEN_FLAGS & ~(O_NONBLOCK | O_NDELAY)) |
    1039                 :            :                         __FMODE_EXEC | __FMODE_NONOTIFY));
    1040                 :            : 
    1041                 :         28 :         fasync_cache = kmem_cache_create("fasync_cache",
    1042                 :            :                 sizeof(struct fasync_struct), 0, SLAB_PANIC, NULL);
    1043                 :         28 :         return 0;
    1044                 :            : }
    1045                 :            : 
    1046                 :            : module_init(fcntl_init)

Generated by: LCOV version 1.14