Coverage Report

Created: 2025-12-14 06:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/net-snmp/agent/netsnmp_close_fds.c
Line
Count
Source
1
#include <net-snmp/net-snmp-config.h>
2
3
#include <stdio.h>
4
#ifdef HAVE_DIRENT_H
5
#include <dirent.h>
6
#endif
7
#ifdef HAVE_LIMITS_H
8
#include <limits.h>
9
#endif
10
#ifdef HAVE_UNISTD_H
11
#include <unistd.h>
12
#endif
13
14
#include <net-snmp/agent/netsnmp_close_fds.h>
15
16
/**
17
 * Close all file descriptors larger than @fd.
18
 */
19
void netsnmp_close_fds(int fd)
20
0
{
21
0
#if defined(HAVE_FORK)
22
0
    DIR            *dir NETSNMP_ATTRIBUTE_UNUSED;
23
0
    struct dirent  *ent NETSNMP_ATTRIBUTE_UNUSED;
24
0
    int             i, largest_fd = -1;
25
26
0
    if (fd < -1)
27
0
        fd = -1;
28
29
0
#ifdef __linux__
30
#ifdef __NR_close_range
31
    if (syscall(__NR_close_range, fd + 1, UINT_MAX, 0) == 0)
32
        return;
33
#endif
34
35
0
    if ((dir = opendir("/proc/self/fd"))) {
36
0
        while ((ent = readdir(dir))) {
37
0
            if (sscanf(ent->d_name, "%d", &i) == 1) {
38
0
                if (i > largest_fd)
39
0
                    largest_fd = i;
40
0
            }
41
0
        }
42
0
        closedir(dir);
43
0
    }
44
#elif defined(__FreeBSD__) || defined(__OpenBSD__)
45
    if ((dir = opendir("/dev/fd"))) {
46
        while ((ent = readdir(dir))) {
47
            if (sscanf(ent->d_name, "%d", &i) == 1) {
48
                if (i > largest_fd)
49
                    largest_fd = i;
50
            }
51
        }
52
        closedir(dir);
53
    }
54
#endif
55
0
    if (largest_fd < 0) {
56
0
#ifdef HAVE_GETDTABLESIZE
57
0
        largest_fd = getdtablesize() - 1;
58
#else
59
        largest_fd = sysconf(_SC_OPEN_MAX);
60
#endif
61
0
    }
62
63
0
    for (i = largest_fd; i > fd && i >= 0; i--)
64
0
        close(i);
65
0
#endif /* defined(HAVE_FORK) */
66
0
}