LCOV - code coverage report
Current view: top level - openssh-6.6p1/openbsd-compat - bsd-closefrom.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 10 15 66.7 %
Date: 2014-08-01 Functions: 1 1 100.0 %
Branches: 12 20 60.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright (c) 2004-2005 Todd C. Miller <Todd.Miller@courtesan.com>
       3                 :            :  *
       4                 :            :  * Permission to use, copy, modify, and distribute this software for any
       5                 :            :  * purpose with or without fee is hereby granted, provided that the above
       6                 :            :  * copyright notice and this permission notice appear in all copies.
       7                 :            :  *
       8                 :            :  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
       9                 :            :  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
      10                 :            :  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
      11                 :            :  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
      12                 :            :  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
      13                 :            :  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
      14                 :            :  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      15                 :            :  */
      16                 :            : 
      17                 :            : #include "includes.h"
      18                 :            : 
      19                 :            : #ifndef HAVE_CLOSEFROM
      20                 :            : 
      21                 :            : #include <sys/types.h>
      22                 :            : #include <sys/param.h>
      23                 :            : #include <unistd.h>
      24                 :            : #include <stdio.h>
      25                 :            : #ifdef HAVE_FCNTL_H
      26                 :            : # include <fcntl.h>
      27                 :            : #endif
      28                 :            : #include <limits.h>
      29                 :            : #include <stdlib.h>
      30                 :            : #include <stddef.h>
      31                 :            : #include <string.h>
      32                 :            : #include <unistd.h>
      33                 :            : #ifdef HAVE_DIRENT_H
      34                 :            : # include <dirent.h>
      35                 :            : # define NAMLEN(dirent) strlen((dirent)->d_name)
      36                 :            : #else
      37                 :            : # define dirent direct
      38                 :            : # define NAMLEN(dirent) (dirent)->d_namlen
      39                 :            : # ifdef HAVE_SYS_NDIR_H
      40                 :            : #  include <sys/ndir.h>
      41                 :            : # endif
      42                 :            : # ifdef HAVE_SYS_DIR_H
      43                 :            : #  include <sys/dir.h>
      44                 :            : # endif
      45                 :            : # ifdef HAVE_NDIR_H
      46                 :            : #  include <ndir.h>
      47                 :            : # endif
      48                 :            : #endif
      49                 :            : 
      50                 :            : #ifndef OPEN_MAX
      51                 :            : # define OPEN_MAX       256
      52                 :            : #endif
      53                 :            : 
      54                 :            : #if 0
      55                 :            : __unused static const char rcsid[] = "$Sudo: closefrom.c,v 1.11 2006/08/17 15:26:54 millert Exp $";
      56                 :            : #endif /* lint */
      57                 :            : 
      58                 :            : /*
      59                 :            :  * Close all file descriptors greater than or equal to lowfd.
      60                 :            :  */
      61                 :            : #ifdef HAVE_FCNTL_CLOSEM
      62                 :            : void
      63                 :            : closefrom(int lowfd)
      64                 :            : {
      65                 :            :     (void) fcntl(lowfd, F_CLOSEM, 0);
      66                 :            : }
      67                 :            : #else
      68                 :            : void
      69                 :       4891 : closefrom(int lowfd)
      70                 :            : {
      71                 :            :     long fd, maxfd;
      72                 :            : #if defined(HAVE_DIRFD) && defined(HAVE_PROC_PID)
      73                 :            :     char fdpath[PATH_MAX], *endp;
      74                 :            :     struct dirent *dent;
      75                 :            :     DIR *dirp;
      76                 :            :     int len;
      77                 :            : 
      78                 :            :     /* Check for a /proc/$$/fd directory. */
      79                 :       4891 :     len = snprintf(fdpath, sizeof(fdpath), "/proc/%ld/fd", (long)getpid());
      80 [ +  - ][ +  - ]:       4891 :     if (len > 0 && (size_t)len <= sizeof(fdpath) && (dirp = opendir(fdpath))) {
      81         [ +  + ]:      38770 :         while ((dent = readdir(dirp)) != NULL) {
      82                 :      33879 :             fd = strtol(dent->d_name, &endp, 10);
      83 [ +  + ][ +  - ]:      33879 :             if (dent->d_name != endp && *endp == '\0' &&
      84 [ +  - ][ +  + ]:      24097 :                 fd >= 0 && fd < INT_MAX && fd >= lowfd && fd != dirfd(dirp))
                 [ +  + ]
      85                 :      33879 :                 (void) close((int) fd);
      86                 :            :         }
      87                 :       4891 :         (void) closedir(dirp);
      88                 :            :     } else
      89                 :            : #endif
      90                 :            :     {
      91                 :            :         /*
      92                 :            :          * Fall back on sysconf() or getdtablesize().  We avoid checking
      93                 :            :          * resource limits since it is possible to open a file descriptor
      94                 :            :          * and then drop the rlimit such that it is below the open fd.
      95                 :            :          */
      96                 :            : #ifdef HAVE_SYSCONF
      97                 :          0 :         maxfd = sysconf(_SC_OPEN_MAX);
      98                 :            : #else
      99                 :            :         maxfd = getdtablesize();
     100                 :            : #endif /* HAVE_SYSCONF */
     101         [ #  # ]:          0 :         if (maxfd < 0)
     102                 :          0 :             maxfd = OPEN_MAX;
     103                 :            : 
     104         [ #  # ]:          0 :         for (fd = lowfd; fd < maxfd; fd++)
     105                 :          0 :             (void) close((int) fd);
     106                 :            :     }
     107                 :       4891 : }
     108                 :            : #endif /* !HAVE_FCNTL_CLOSEM */
     109                 :            : #endif /* HAVE_CLOSEFROM */

Generated by: LCOV version 1.9