LCOV - code coverage report
Current view: top level - fs - fcntl.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 79 239 33.1 %
Date: 2014-02-18 Functions: 13 26 50.0 %
Branches: 38 190 20.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *  linux/fs/fcntl.c
       3                 :            :  *
       4                 :            :  *  Copyright (C) 1991, 1992  Linus Torvalds
       5                 :            :  */
       6                 :            : 
       7                 :            : #include <linux/syscalls.h>
       8                 :            : #include <linux/init.h>
       9                 :            : #include <linux/mm.h>
      10                 :            : #include <linux/fs.h>
      11                 :            : #include <linux/file.h>
      12                 :            : #include <linux/fdtable.h>
      13                 :            : #include <linux/capability.h>
      14                 :            : #include <linux/dnotify.h>
      15                 :            : #include <linux/slab.h>
      16                 :            : #include <linux/module.h>
      17                 :            : #include <linux/pipe_fs_i.h>
      18                 :            : #include <linux/security.h>
      19                 :            : #include <linux/ptrace.h>
      20                 :            : #include <linux/signal.h>
      21                 :            : #include <linux/rcupdate.h>
      22                 :            : #include <linux/pid_namespace.h>
      23                 :            : #include <linux/user_namespace.h>
      24                 :            : 
      25                 :            : #include <asm/poll.h>
      26                 :            : #include <asm/siginfo.h>
      27                 :            : #include <asm/uaccess.h>
      28                 :            : 
      29                 :            : #define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME)
      30                 :            : 
      31                 :          0 : static int setfl(int fd, struct file * filp, unsigned long arg)
      32                 :            : {
      33                 :            :         struct inode * inode = file_inode(filp);
      34                 :            :         int error = 0;
      35                 :            : 
      36                 :            :         /*
      37                 :            :          * O_APPEND cannot be cleared if the file is marked as append-only
      38                 :            :          * and the file is open for write.
      39                 :            :          */
      40    [ +  + ][ + ]:       6267 :         if (((arg ^ filp->f_flags) & O_APPEND) && IS_APPEND(inode))
      41                 :            :                 return -EPERM;
      42                 :            : 
      43                 :            :         /* O_NOATIME can only be set by the owner or superuser */
      44 [ -  + ][ #  # ]:      12534 :         if ((arg & O_NOATIME) && !(filp->f_flags & O_NOATIME))
      45         [ #  # ]:          0 :                 if (!inode_owner_or_capable(inode))
      46                 :            :                         return -EPERM;
      47                 :            : 
      48                 :            :         /* required for strict SunOS emulation */
      49                 :            :         if (O_NONBLOCK != O_NDELAY)
      50                 :            :                if (arg & O_NDELAY)
      51                 :            :                    arg |= O_NONBLOCK;
      52                 :            : 
      53         [ -  + ]:       6267 :         if (arg & O_DIRECT) {
      54 [ #  # ][ #  # ]:          0 :                 if (!filp->f_mapping || !filp->f_mapping->a_ops ||
                 [ #  # ]
      55                 :          0 :                         !filp->f_mapping->a_ops->direct_IO)
      56                 :            :                                 return -EINVAL;
      57                 :            :         }
      58                 :            : 
      59         [ -  + ]:       6267 :         if (filp->f_op->check_flags)
      60                 :          0 :                 error = filp->f_op->check_flags(arg);
      61         [ +  - ]:       6267 :         if (error)
      62                 :            :                 return error;
      63                 :            : 
      64                 :            :         /*
      65                 :            :          * ->fasync() is responsible for setting the FASYNC bit.
      66                 :            :          */
      67 [ -  + ][ #  # ]:       6267 :         if (((arg ^ filp->f_flags) & FASYNC) && filp->f_op->fasync) {
      68                 :          0 :                 error = filp->f_op->fasync(fd, filp, (arg & FASYNC) != 0);
      69         [ #  # ]:          0 :                 if (error < 0)
      70                 :            :                         goto out;
      71         [ #  # ]:          0 :                 if (error > 0)
      72                 :            :                         error = 0;
      73                 :            :         }
      74                 :            :         spin_lock(&filp->f_lock);
      75                 :       6267 :         filp->f_flags = (arg & SETFL_MASK) | (filp->f_flags & ~SETFL_MASK);
      76                 :            :         spin_unlock(&filp->f_lock);
      77                 :            : 
      78                 :            :  out:
      79                 :       6267 :         return error;
      80                 :            : }
      81                 :            : 
      82                 :          0 : static void f_modown(struct file *filp, struct pid *pid, enum pid_type type,
      83                 :            :                      int force)
      84                 :            : {
      85                 :         16 :         write_lock_irq(&filp->f_owner.lock);
      86 [ +  + ][ +  - ]:         16 :         if (force || !filp->f_owner.pid) {
      87                 :         16 :                 put_pid(filp->f_owner.pid);
      88                 :         16 :                 filp->f_owner.pid = get_pid(pid);
      89                 :         16 :                 filp->f_owner.pid_type = type;
      90                 :            : 
      91         [ +  + ]:         32 :                 if (pid) {
      92                 :          8 :                         const struct cred *cred = current_cred();
      93                 :          8 :                         filp->f_owner.uid = cred->uid;
      94                 :          8 :                         filp->f_owner.euid = cred->euid;
      95                 :            :                 }
      96                 :            :         }
      97                 :            :         write_unlock_irq(&filp->f_owner.lock);
      98                 :         16 : }
      99                 :            : 
     100                 :          0 : int __f_setown(struct file *filp, struct pid *pid, enum pid_type type,
     101                 :            :                 int force)
     102                 :            : {
     103                 :            :         int err;
     104                 :            : 
     105                 :          8 :         err = security_file_set_fowner(filp);
     106         [ +  - ]:          8 :         if (err)
     107                 :            :                 return err;
     108                 :            : 
     109                 :          8 :         f_modown(filp, pid, type, force);
     110                 :          8 :         return 0;
     111                 :            : }
     112                 :            : EXPORT_SYMBOL(__f_setown);
     113                 :            : 
     114                 :          0 : int f_setown(struct file *filp, unsigned long arg, int force)
     115                 :            : {
     116                 :            :         enum pid_type type;
     117                 :            :         struct pid *pid;
     118                 :          0 :         int who = arg;
     119                 :            :         int result;
     120                 :            :         type = PIDTYPE_PID;
     121         [ #  # ]:          0 :         if (who < 0) {
     122                 :            :                 type = PIDTYPE_PGID;
     123                 :          0 :                 who = -who;
     124                 :            :         }
     125                 :            :         rcu_read_lock();
     126                 :          0 :         pid = find_vpid(who);
     127                 :          0 :         result = __f_setown(filp, pid, type, force);
     128                 :            :         rcu_read_unlock();
     129                 :          0 :         return result;
     130                 :            : }
     131                 :            : EXPORT_SYMBOL(f_setown);
     132                 :            : 
     133                 :          0 : void f_delown(struct file *filp)
     134                 :            : {
     135                 :          8 :         f_modown(filp, NULL, PIDTYPE_PID, 1);
     136                 :          8 : }
     137                 :            : 
     138                 :          0 : pid_t f_getown(struct file *filp)
     139                 :            : {
     140                 :            :         pid_t pid;
     141                 :          0 :         read_lock(&filp->f_owner.lock);
     142                 :          0 :         pid = pid_vnr(filp->f_owner.pid);
     143         [ #  # ]:          0 :         if (filp->f_owner.pid_type == PIDTYPE_PGID)
     144                 :          0 :                 pid = -pid;
     145                 :            :         read_unlock(&filp->f_owner.lock);
     146                 :          0 :         return pid;
     147                 :            : }
     148                 :            : 
     149                 :          0 : static int f_setown_ex(struct file *filp, unsigned long arg)
     150                 :            : {
     151                 :          0 :         struct f_owner_ex __user *owner_p = (void __user *)arg;
     152                 :            :         struct f_owner_ex owner;
     153                 :            :         struct pid *pid;
     154                 :            :         int type;
     155                 :            :         int ret;
     156                 :            : 
     157                 :            :         ret = copy_from_user(&owner, owner_p, sizeof(owner));
     158         [ #  # ]:          0 :         if (ret)
     159                 :            :                 return -EFAULT;
     160                 :            : 
     161   [ #  #  #  # ]:          0 :         switch (owner.type) {
     162                 :            :         case F_OWNER_TID:
     163                 :            :                 type = PIDTYPE_MAX;
     164                 :            :                 break;
     165                 :            : 
     166                 :            :         case F_OWNER_PID:
     167                 :            :                 type = PIDTYPE_PID;
     168                 :          0 :                 break;
     169                 :            : 
     170                 :            :         case F_OWNER_PGRP:
     171                 :            :                 type = PIDTYPE_PGID;
     172                 :          0 :                 break;
     173                 :            : 
     174                 :            :         default:
     175                 :            :                 return -EINVAL;
     176                 :            :         }
     177                 :            : 
     178                 :            :         rcu_read_lock();
     179                 :          0 :         pid = find_vpid(owner.pid);
     180 [ #  # ][ #  # ]:          0 :         if (owner.pid && !pid)
     181                 :            :                 ret = -ESRCH;
     182                 :            :         else
     183                 :          0 :                 ret = __f_setown(filp, pid, type, 1);
     184                 :            :         rcu_read_unlock();
     185                 :            : 
     186                 :          0 :         return ret;
     187                 :            : }
     188                 :            : 
     189                 :          0 : static int f_getown_ex(struct file *filp, unsigned long arg)
     190                 :            : {
     191                 :          0 :         struct f_owner_ex __user *owner_p = (void __user *)arg;
     192                 :            :         struct f_owner_ex owner;
     193                 :            :         int ret = 0;
     194                 :            : 
     195                 :          0 :         read_lock(&filp->f_owner.lock);
     196                 :          0 :         owner.pid = pid_vnr(filp->f_owner.pid);
     197   [ #  #  #  # ]:          0 :         switch (filp->f_owner.pid_type) {
     198                 :            :         case PIDTYPE_MAX:
     199                 :          0 :                 owner.type = F_OWNER_TID;
     200                 :          0 :                 break;
     201                 :            : 
     202                 :            :         case PIDTYPE_PID:
     203                 :          0 :                 owner.type = F_OWNER_PID;
     204                 :          0 :                 break;
     205                 :            : 
     206                 :            :         case PIDTYPE_PGID:
     207                 :          0 :                 owner.type = F_OWNER_PGRP;
     208                 :          0 :                 break;
     209                 :            : 
     210                 :            :         default:
     211                 :          0 :                 WARN_ON(1);
     212                 :            :                 ret = -EINVAL;
     213                 :          0 :                 break;
     214                 :            :         }
     215                 :            :         read_unlock(&filp->f_owner.lock);
     216                 :            : 
     217         [ #  # ]:          0 :         if (!ret) {
     218                 :          0 :                 ret = copy_to_user(owner_p, &owner, sizeof(owner));
     219         [ #  # ]:          0 :                 if (ret)
     220                 :            :                         ret = -EFAULT;
     221                 :            :         }
     222                 :          0 :         return ret;
     223                 :            : }
     224                 :            : 
     225                 :            : #ifdef CONFIG_CHECKPOINT_RESTORE
     226                 :            : static int f_getowner_uids(struct file *filp, unsigned long arg)
     227                 :            : {
     228                 :            :         struct user_namespace *user_ns = current_user_ns();
     229                 :            :         uid_t __user *dst = (void __user *)arg;
     230                 :            :         uid_t src[2];
     231                 :            :         int err;
     232                 :            : 
     233                 :            :         read_lock(&filp->f_owner.lock);
     234                 :            :         src[0] = from_kuid(user_ns, filp->f_owner.uid);
     235                 :            :         src[1] = from_kuid(user_ns, filp->f_owner.euid);
     236                 :            :         read_unlock(&filp->f_owner.lock);
     237                 :            : 
     238                 :            :         err  = put_user(src[0], &dst[0]);
     239                 :            :         err |= put_user(src[1], &dst[1]);
     240                 :            : 
     241                 :            :         return err;
     242                 :            : }
     243                 :            : #else
     244                 :            : static int f_getowner_uids(struct file *filp, unsigned long arg)
     245                 :            : {
     246                 :            :         return -EINVAL;
     247                 :            : }
     248                 :            : #endif
     249                 :            : 
     250                 :          0 : static long do_fcntl(int fd, unsigned int cmd, unsigned long arg,
     251                 :            :                 struct file *filp)
     252                 :            : {
     253                 :            :         long err = -EINVAL;
     254                 :            : 
     255   [ +  -  +  +  :    2370119 :         switch (cmd) {
          +  +  +  +  -  
          -  -  -  -  -  
             +  +  -  +  
                      + ]
     256                 :            :         case F_DUPFD:
     257                 :      11637 :                 err = f_dupfd(arg, filp, 0);
     258                 :      11637 :                 break;
     259                 :            :         case F_DUPFD_CLOEXEC:
     260                 :          0 :                 err = f_dupfd(arg, filp, O_CLOEXEC);
     261                 :          0 :                 break;
     262                 :            :         case F_GETFD:
     263                 :     128621 :                 err = get_close_on_exec(fd) ? FD_CLOEXEC : 0;
     264                 :     128620 :                 break;
     265                 :            :         case F_SETFD:
     266                 :            :                 err = 0;
     267                 :     150611 :                 set_close_on_exec(fd, arg & FD_CLOEXEC);
     268                 :     150614 :                 break;
     269                 :            :         case F_GETFL:
     270                 :      26211 :                 err = filp->f_flags;
     271                 :      26211 :                 break;
     272                 :            :         case F_SETFL:
     273                 :       6267 :                 err = setfl(fd, filp, arg);
     274                 :       6267 :                 break;
     275                 :            :         case F_GETLK:
     276                 :        425 :                 err = fcntl_getlk(filp, (struct flock __user *) arg);
     277                 :        425 :                 break;
     278                 :            :         case F_SETLK:
     279                 :            :         case F_SETLKW:
     280                 :    2046276 :                 err = fcntl_setlk(fd, filp, cmd, (struct flock __user *) arg);
     281                 :    2046237 :                 break;
     282                 :            :         case F_GETOWN:
     283                 :            :                 /*
     284                 :            :                  * XXX If f_owner is a process group, the
     285                 :            :                  * negative return value will get converted
     286                 :            :                  * into an error.  Oops.  If we keep the
     287                 :            :                  * current syscall conventions, the only way
     288                 :            :                  * to fix this will be in libc.
     289                 :            :                  */
     290                 :          0 :                 err = f_getown(filp);
     291                 :            :                 force_successful_syscall_return();
     292                 :          0 :                 break;
     293                 :            :         case F_SETOWN:
     294                 :          0 :                 err = f_setown(filp, arg, 1);
     295                 :          0 :                 break;
     296                 :            :         case F_GETOWN_EX:
     297                 :          0 :                 err = f_getown_ex(filp, arg);
     298                 :          0 :                 break;
     299                 :            :         case F_SETOWN_EX:
     300                 :          0 :                 err = f_setown_ex(filp, arg);
     301                 :          0 :                 break;
     302                 :            :         case F_GETOWNER_UIDS:
     303                 :            :                 err = f_getowner_uids(filp, arg);
     304                 :            :                 break;
     305                 :            :         case F_GETSIG:
     306                 :          0 :                 err = filp->f_owner.signum;
     307                 :          0 :                 break;
     308                 :            :         case F_SETSIG:
     309                 :            :                 /* arg == 0 restores default behaviour. */
     310         [ #  # ]:          0 :                 if (!valid_signal(arg)) {
     311                 :            :                         break;
     312                 :            :                 }
     313                 :            :                 err = 0;
     314                 :          0 :                 filp->f_owner.signum = arg;
     315                 :          0 :                 break;
     316                 :            :         case F_GETLEASE:
     317                 :          8 :                 err = fcntl_getlease(filp);
     318                 :          8 :                 break;
     319                 :            :         case F_SETLEASE:
     320                 :         20 :                 err = fcntl_setlease(fd, filp, arg);
     321                 :         20 :                 break;
     322                 :            :         case F_NOTIFY:
     323                 :          0 :                 err = fcntl_dirnotify(fd, filp, arg);
     324                 :          0 :                 break;
     325                 :            :         case F_SETPIPE_SZ:
     326                 :            :         case F_GETPIPE_SZ:
     327                 :          2 :                 err = pipe_fcntl(filp, cmd, arg);
     328                 :          2 :                 break;
     329                 :            :         default:
     330                 :            :                 break;
     331                 :            :         }
     332                 :          0 :         return err;
     333                 :            : }
     334                 :            : 
     335                 :          0 : static int check_fcntl_cmd(unsigned cmd)
     336                 :            : {
     337         [ #  # ]:          0 :         switch (cmd) {
     338                 :            :         case F_DUPFD:
     339                 :            :         case F_DUPFD_CLOEXEC:
     340                 :            :         case F_GETFD:
     341                 :            :         case F_SETFD:
     342                 :            :         case F_GETFL:
     343                 :            :                 return 1;
     344                 :            :         }
     345                 :          0 :         return 0;
     346                 :            : }
     347                 :            : 
     348                 :          0 : SYSCALL_DEFINE3(fcntl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
     349                 :            : {       
     350                 :            :         struct fd f = fdget_raw(fd);
     351                 :            :         long err = -EBADF;
     352                 :            : 
     353         [ #  # ]:          0 :         if (!f.file)
     354                 :            :                 goto out;
     355                 :            : 
     356         [ #  # ]:          0 :         if (unlikely(f.file->f_mode & FMODE_PATH)) {
     357         [ #  # ]:          0 :                 if (!check_fcntl_cmd(cmd))
     358                 :            :                         goto out1;
     359                 :            :         }
     360                 :            : 
     361                 :          0 :         err = security_file_fcntl(f.file, cmd, arg);
     362         [ #  # ]:          0 :         if (!err)
     363                 :          0 :                 err = do_fcntl(fd, cmd, arg, f.file);
     364                 :            : 
     365                 :            : out1:
     366                 :            :         fdput(f);
     367                 :            : out:
     368                 :            :         return err;
     369                 :            : }
     370                 :            : 
     371                 :            : #if BITS_PER_LONG == 32
     372                 :          0 : SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd,
     373                 :            :                 unsigned long, arg)
     374                 :            : {       
     375                 :            :         struct fd f = fdget_raw(fd);
     376                 :            :         long err = -EBADF;
     377                 :            : 
     378         [ +  + ]:    2384722 :         if (!f.file)
     379                 :            :                 goto out;
     380                 :            : 
     381         [ -  + ]:    2381452 :         if (unlikely(f.file->f_mode & FMODE_PATH)) {
     382         [ #  # ]:          0 :                 if (!check_fcntl_cmd(cmd))
     383                 :            :                         goto out1;
     384                 :            :         }
     385                 :            : 
     386                 :    2381394 :         err = security_file_fcntl(f.file, cmd, arg);
     387            [ + ]:    2381359 :         if (err)
     388                 :            :                 goto out1;
     389                 :            :         
     390      [ +  +  + ]:    2381461 :         switch (cmd) {
     391                 :            :                 case F_GETLK64:
     392                 :        225 :                         err = fcntl_getlk64(f.file, (struct flock64 __user *) arg);
     393                 :            :                         break;
     394                 :            :                 case F_SETLK64:
     395                 :            :                 case F_SETLKW64:
     396                 :      11164 :                         err = fcntl_setlk64(fd, f.file, cmd,
     397                 :            :                                         (struct flock64 __user *) arg);
     398                 :            :                         break;
     399                 :            :                 default:
     400                 :    2370072 :                         err = do_fcntl(fd, cmd, arg, f.file);
     401                 :            :                         break;
     402                 :            :         }
     403                 :            : out1:
     404                 :            :         fdput(f);
     405                 :            : out:
     406                 :            :         return err;
     407                 :            : }
     408                 :            : #endif
     409                 :            : 
     410                 :            : /* Table to convert sigio signal codes into poll band bitmaps */
     411                 :            : 
     412                 :            : static const long band_table[NSIGPOLL] = {
     413                 :            :         POLLIN | POLLRDNORM,                    /* POLL_IN */
     414                 :            :         POLLOUT | POLLWRNORM | POLLWRBAND,      /* POLL_OUT */
     415                 :            :         POLLIN | POLLRDNORM | POLLMSG,          /* POLL_MSG */
     416                 :            :         POLLERR,                                /* POLL_ERR */
     417                 :            :         POLLPRI | POLLRDBAND,                   /* POLL_PRI */
     418                 :            :         POLLHUP | POLLERR                       /* POLL_HUP */
     419                 :            : };
     420                 :            : 
     421                 :            : static inline int sigio_perm(struct task_struct *p,
     422                 :            :                              struct fown_struct *fown, int sig)
     423                 :            : {
     424                 :            :         const struct cred *cred;
     425                 :            :         int ret;
     426                 :            : 
     427                 :            :         rcu_read_lock();
     428                 :          0 :         cred = __task_cred(p);
     429 [ #  # ][ #  # ]:          0 :         ret = ((uid_eq(fown->euid, GLOBAL_ROOT_UID) ||
     430 [ #  # ][ #  # ]:          0 :                 uid_eq(fown->euid, cred->suid) || uid_eq(fown->euid, cred->uid) ||
         [ #  # ][ #  # ]
     431         [ #  # ]:          0 :                 uid_eq(fown->uid,  cred->suid) || uid_eq(fown->uid,  cred->uid)) &&
           [ #  #  #  # ]
                 [ #  # ]
           [ #  #  #  # ]
     432                 :          0 :                !security_file_send_sigiotask(p, fown, sig));
     433                 :            :         rcu_read_unlock();
     434                 :            :         return ret;
     435                 :            : }
     436                 :            : 
     437                 :          0 : static void send_sigio_to_task(struct task_struct *p,
     438                 :            :                                struct fown_struct *fown,
     439                 :            :                                int fd, int reason, int group)
     440                 :            : {
     441                 :            :         /*
     442                 :            :          * F_SETSIG can change ->signum lockless in parallel, make
     443                 :            :          * sure we read it once and use the same value throughout.
     444                 :            :          */
     445                 :          0 :         int signum = ACCESS_ONCE(fown->signum);
     446                 :            : 
     447         [ #  # ]:          0 :         if (!sigio_perm(p, fown, signum))
     448                 :          0 :                 return;
     449                 :            : 
     450         [ #  # ]:          0 :         switch (signum) {
     451                 :            :                 siginfo_t si;
     452                 :            :                 default:
     453                 :            :                         /* Queue a rt signal with the appropriate fd as its
     454                 :            :                            value.  We use SI_SIGIO as the source, not 
     455                 :            :                            SI_KERNEL, since kernel signals always get 
     456                 :            :                            delivered even if we can't queue.  Failure to
     457                 :            :                            queue in this case _should_ be reported; we fall
     458                 :            :                            back to SIGIO in that case. --sct */
     459                 :          0 :                         si.si_signo = signum;
     460                 :          0 :                         si.si_errno = 0;
     461                 :          0 :                         si.si_code  = reason;
     462                 :            :                         /* Make sure we are called with one of the POLL_*
     463                 :            :                            reasons, otherwise we could leak kernel stack into
     464                 :            :                            userspace.  */
     465         [ #  # ]:          0 :                         BUG_ON((reason & __SI_MASK) != __SI_POLL);
     466         [ #  # ]:          0 :                         if (reason - POLL_IN >= NSIGPOLL)
     467                 :          0 :                                 si.si_band  = ~0L;
     468                 :            :                         else
     469                 :          0 :                                 si.si_band = band_table[reason - POLL_IN];
     470                 :          0 :                         si.si_fd    = fd;
     471         [ #  # ]:          0 :                         if (!do_send_sig_info(signum, &si, p, group))
     472                 :            :                                 break;
     473                 :            :                 /* fall-through: fall back on the old plain SIGIO signal */
     474                 :            :                 case 0:
     475                 :          0 :                         do_send_sig_info(SIGIO, SEND_SIG_PRIV, p, group);
     476                 :            :         }
     477                 :            : }
     478                 :            : 
     479                 :          0 : void send_sigio(struct fown_struct *fown, int fd, int band)
     480                 :            : {
     481                 :            :         struct task_struct *p;
     482                 :            :         enum pid_type type;
     483                 :            :         struct pid *pid;
     484                 :            :         int group = 1;
     485                 :            :         
     486                 :          0 :         read_lock(&fown->lock);
     487                 :            : 
     488                 :          0 :         type = fown->pid_type;
     489         [ #  # ]:          0 :         if (type == PIDTYPE_MAX) {
     490                 :            :                 group = 0;
     491                 :            :                 type = PIDTYPE_PID;
     492                 :            :         }
     493                 :            : 
     494                 :          0 :         pid = fown->pid;
     495         [ #  # ]:          0 :         if (!pid)
     496                 :            :                 goto out_unlock_fown;
     497                 :            :         
     498                 :          0 :         read_lock(&tasklist_lock);
     499 [ #  # ][ #  # ]:          0 :         do_each_pid_task(pid, type, p) {
         [ #  # ][ #  # ]
     500                 :          0 :                 send_sigio_to_task(p, fown, fd, band, group);
     501         [ #  # ]:          0 :         } while_each_pid_task(pid, type, p);
     502                 :            :         read_unlock(&tasklist_lock);
     503                 :            :  out_unlock_fown:
     504                 :            :         read_unlock(&fown->lock);
     505                 :          0 : }
     506                 :            : 
     507                 :          0 : static void send_sigurg_to_task(struct task_struct *p,
     508                 :            :                                 struct fown_struct *fown, int group)
     509                 :            : {
     510         [ #  # ]:          0 :         if (sigio_perm(p, fown, SIGURG))
     511                 :          0 :                 do_send_sig_info(SIGURG, SEND_SIG_PRIV, p, group);
     512                 :          0 : }
     513                 :            : 
     514                 :          0 : int send_sigurg(struct fown_struct *fown)
     515                 :            : {
     516                 :            :         struct task_struct *p;
     517                 :            :         enum pid_type type;
     518                 :            :         struct pid *pid;
     519                 :            :         int group = 1;
     520                 :            :         int ret = 0;
     521                 :            :         
     522                 :          0 :         read_lock(&fown->lock);
     523                 :            : 
     524                 :          0 :         type = fown->pid_type;
     525         [ #  # ]:          0 :         if (type == PIDTYPE_MAX) {
     526                 :            :                 group = 0;
     527                 :            :                 type = PIDTYPE_PID;
     528                 :            :         }
     529                 :            : 
     530                 :          0 :         pid = fown->pid;
     531         [ #  # ]:          0 :         if (!pid)
     532                 :            :                 goto out_unlock_fown;
     533                 :            : 
     534                 :            :         ret = 1;
     535                 :            :         
     536                 :          0 :         read_lock(&tasklist_lock);
     537 [ #  # ][ #  # ]:          0 :         do_each_pid_task(pid, type, p) {
         [ #  # ][ #  # ]
     538                 :          0 :                 send_sigurg_to_task(p, fown, group);
     539         [ #  # ]:          0 :         } while_each_pid_task(pid, type, p);
     540                 :            :         read_unlock(&tasklist_lock);
     541                 :            :  out_unlock_fown:
     542                 :            :         read_unlock(&fown->lock);
     543                 :          0 :         return ret;
     544                 :            : }
     545                 :            : 
     546                 :            : static DEFINE_SPINLOCK(fasync_lock);
     547                 :            : static struct kmem_cache *fasync_cache __read_mostly;
     548                 :            : 
     549                 :          0 : static void fasync_free_rcu(struct rcu_head *head)
     550                 :            : {
     551                 :          8 :         kmem_cache_free(fasync_cache,
     552                 :          8 :                         container_of(head, struct fasync_struct, fa_rcu));
     553                 :          8 : }
     554                 :            : 
     555                 :            : /*
     556                 :            :  * Remove a fasync entry. If successfully removed, return
     557                 :            :  * positive and clear the FASYNC flag. If no entry exists,
     558                 :            :  * do nothing and return 0.
     559                 :            :  *
     560                 :            :  * NOTE! It is very important that the FASYNC flag always
     561                 :            :  * match the state "is the filp on a fasync list".
     562                 :            :  *
     563                 :            :  */
     564                 :          0 : int fasync_remove_entry(struct file *filp, struct fasync_struct **fapp)
     565                 :            : {
     566                 :            :         struct fasync_struct *fa, **fp;
     567                 :            :         int result = 0;
     568                 :            : 
     569                 :            :         spin_lock(&filp->f_lock);
     570                 :            :         spin_lock(&fasync_lock);
     571         [ +  + ]:       2098 :         for (fp = fapp; (fa = *fp) != NULL; fp = &fa->fa_next) {
     572         [ -  + ]:          8 :                 if (fa->fa_file != filp)
     573                 :          0 :                         continue;
     574                 :            : 
     575                 :            :                 spin_lock_irq(&fa->fa_lock);
     576                 :          8 :                 fa->fa_file = NULL;
     577                 :            :                 spin_unlock_irq(&fa->fa_lock);
     578                 :            : 
     579                 :          8 :                 *fp = fa->fa_next;
     580                 :          8 :                 call_rcu(&fa->fa_rcu, fasync_free_rcu);
     581                 :          8 :                 filp->f_flags &= ~FASYNC;
     582                 :            :                 result = 1;
     583                 :          8 :                 break;
     584                 :            :         }
     585                 :            :         spin_unlock(&fasync_lock);
     586                 :            :         spin_unlock(&filp->f_lock);
     587                 :       2098 :         return result;
     588                 :            : }
     589                 :            : 
     590                 :          0 : struct fasync_struct *fasync_alloc(void)
     591                 :            : {
     592                 :         12 :         return kmem_cache_alloc(fasync_cache, GFP_KERNEL);
     593                 :            : }
     594                 :            : 
     595                 :            : /*
     596                 :            :  * NOTE! This can be used only for unused fasync entries:
     597                 :            :  * entries that actually got inserted on the fasync list
     598                 :            :  * need to be released by rcu - see fasync_remove_entry.
     599                 :            :  */
     600                 :          0 : void fasync_free(struct fasync_struct *new)
     601                 :            : {
     602                 :          4 :         kmem_cache_free(fasync_cache, new);
     603                 :          4 : }
     604                 :            : 
     605                 :            : /*
     606                 :            :  * Insert a new entry into the fasync list.  Return the pointer to the
     607                 :            :  * old one if we didn't use the new one.
     608                 :            :  *
     609                 :            :  * NOTE! It is very important that the FASYNC flag always
     610                 :            :  * match the state "is the filp on a fasync list".
     611                 :            :  */
     612                 :          0 : struct fasync_struct *fasync_insert_entry(int fd, struct file *filp, struct fasync_struct **fapp, struct fasync_struct *new)
     613                 :            : {
     614                 :            :         struct fasync_struct *fa, **fp;
     615                 :            : 
     616                 :            :         spin_lock(&filp->f_lock);
     617                 :            :         spin_lock(&fasync_lock);
     618         [ -  + ]:          8 :         for (fp = fapp; (fa = *fp) != NULL; fp = &fa->fa_next) {
     619         [ #  # ]:          0 :                 if (fa->fa_file != filp)
     620                 :          0 :                         continue;
     621                 :            : 
     622                 :            :                 spin_lock_irq(&fa->fa_lock);
     623                 :          0 :                 fa->fa_fd = fd;
     624                 :            :                 spin_unlock_irq(&fa->fa_lock);
     625                 :            :                 goto out;
     626                 :            :         }
     627                 :            : 
     628                 :          8 :         spin_lock_init(&new->fa_lock);
     629                 :          8 :         new->magic = FASYNC_MAGIC;
     630                 :          8 :         new->fa_file = filp;
     631                 :          8 :         new->fa_fd = fd;
     632                 :          8 :         new->fa_next = *fapp;
     633                 :          8 :         rcu_assign_pointer(*fapp, new);
     634                 :          8 :         filp->f_flags |= FASYNC;
     635                 :            : 
     636                 :            : out:
     637                 :            :         spin_unlock(&fasync_lock);
     638                 :            :         spin_unlock(&filp->f_lock);
     639                 :          8 :         return fa;
     640                 :            : }
     641                 :            : 
     642                 :            : /*
     643                 :            :  * Add a fasync entry. Return negative on error, positive if
     644                 :            :  * added, and zero if did nothing but change an existing one.
     645                 :            :  */
     646                 :          0 : static int fasync_add_entry(int fd, struct file *filp, struct fasync_struct **fapp)
     647                 :            : {
     648                 :            :         struct fasync_struct *new;
     649                 :            : 
     650                 :            :         new = fasync_alloc();
     651         [ #  # ]:          0 :         if (!new)
     652                 :            :                 return -ENOMEM;
     653                 :            : 
     654                 :            :         /*
     655                 :            :          * fasync_insert_entry() returns the old (update) entry if
     656                 :            :          * it existed.
     657                 :            :          *
     658                 :            :          * So free the (unused) new entry and return 0 to let the
     659                 :            :          * caller know that we didn't add any new fasync entries.
     660                 :            :          */
     661         [ #  # ]:          0 :         if (fasync_insert_entry(fd, filp, fapp, new)) {
     662                 :            :                 fasync_free(new);
     663                 :          0 :                 return 0;
     664                 :            :         }
     665                 :            : 
     666                 :            :         return 1;
     667                 :            : }
     668                 :            : 
     669                 :            : /*
     670                 :            :  * fasync_helper() is used by almost all character device drivers
     671                 :            :  * to set up the fasync queue, and for regular files by the file
     672                 :            :  * lease code. It returns negative on error, 0 if it did no changes
     673                 :            :  * and positive if it added/deleted the entry.
     674                 :            :  */
     675                 :          0 : int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fapp)
     676                 :            : {
     677         [ +  - ]:       2098 :         if (!on)
     678                 :       2098 :                 return fasync_remove_entry(filp, fapp);
     679                 :          0 :         return fasync_add_entry(fd, filp, fapp);
     680                 :            : }
     681                 :            : 
     682                 :            : EXPORT_SYMBOL(fasync_helper);
     683                 :            : 
     684                 :            : /*
     685                 :            :  * rcu_read_lock() is held
     686                 :            :  */
     687                 :          0 : static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band)
     688                 :            : {
     689         [ #  # ]:          0 :         while (fa) {
     690                 :            :                 struct fown_struct *fown;
     691                 :            :                 unsigned long flags;
     692                 :            : 
     693         [ #  # ]:          0 :                 if (fa->magic != FASYNC_MAGIC) {
     694                 :          0 :                         printk(KERN_ERR "kill_fasync: bad magic number in "
     695                 :            :                                "fasync_struct!\n");
     696                 :          0 :                         return;
     697                 :            :                 }
     698                 :          0 :                 spin_lock_irqsave(&fa->fa_lock, flags);
     699         [ #  # ]:          0 :                 if (fa->fa_file) {
     700                 :          0 :                         fown = &fa->fa_file->f_owner;
     701                 :            :                         /* Don't send SIGURG to processes which have not set a
     702                 :            :                            queued signum: SIGURG has its own default signalling
     703                 :            :                            mechanism. */
     704 [ #  # ][ #  # ]:          0 :                         if (!(sig == SIGURG && fown->signum == 0))
     705                 :          0 :                                 send_sigio(fown, fa->fa_fd, band);
     706                 :            :                 }
     707                 :            :                 spin_unlock_irqrestore(&fa->fa_lock, flags);
     708                 :          0 :                 fa = rcu_dereference(fa->fa_next);
     709                 :            :         }
     710                 :            : }
     711                 :            : 
     712                 :          0 : void kill_fasync(struct fasync_struct **fp, int sig, int band)
     713                 :            : {
     714                 :            :         /* First a quick test without locking: usually
     715                 :            :          * the list is empty.
     716                 :            :          */
     717         [ -  + ]:    1388763 :         if (*fp) {
     718                 :            :                 rcu_read_lock();
     719                 :          0 :                 kill_fasync_rcu(rcu_dereference(*fp), sig, band);
     720                 :            :                 rcu_read_unlock();
     721                 :            :         }
     722                 :          0 : }
     723                 :            : EXPORT_SYMBOL(kill_fasync);
     724                 :            : 
     725                 :          0 : static int __init fcntl_init(void)
     726                 :            : {
     727                 :            :         /*
     728                 :            :          * Please add new bits here to ensure allocation uniqueness.
     729                 :            :          * Exceptions: O_NONBLOCK is a two bit define on parisc; O_NDELAY
     730                 :            :          * is defined as O_NONBLOCK on some platforms and not on others.
     731                 :            :          */
     732                 :            :         BUILD_BUG_ON(20 - 1 /* for O_RDONLY being 0 */ != HWEIGHT32(
     733                 :            :                 O_RDONLY        | O_WRONLY      | O_RDWR        |
     734                 :            :                 O_CREAT         | O_EXCL        | O_NOCTTY      |
     735                 :            :                 O_TRUNC         | O_APPEND      | /* O_NONBLOCK | */
     736                 :            :                 __O_SYNC        | O_DSYNC       | FASYNC        |
     737                 :            :                 O_DIRECT        | O_LARGEFILE   | O_DIRECTORY   |
     738                 :            :                 O_NOFOLLOW      | O_NOATIME     | O_CLOEXEC     |
     739                 :            :                 __FMODE_EXEC    | O_PATH        | __O_TMPFILE
     740                 :            :                 ));
     741                 :            : 
     742                 :          0 :         fasync_cache = kmem_cache_create("fasync_cache",
     743                 :            :                 sizeof(struct fasync_struct), 0, SLAB_PANIC, NULL);
     744                 :          0 :         return 0;
     745                 :            : }
     746                 :            : 
     747                 :            : module_init(fcntl_init)

Generated by: LCOV version 1.9