/* * Unix SMB/CIFS implementation. * Samba utility functions * Copyright (C) Volker Lendecke 2016 * * ** NOTE! The following LGPL license applies to the replace * ** library. This does NOT imply that all of Samba is released * ** under the LGPL * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see . */ #include "replace.h" #include #include #include static int closefrom_sysconf(int lower) { long max_files, fd; max_files = sysconf(_SC_OPEN_MAX); if (max_files == -1) { max_files = 65536; } for (fd=lower; fdd_name, &endptr, 10); if ((fd == 0) && (errno == EINVAL)) { continue; } if ((fd == ULLONG_MAX) && (errno == ERANGE)) { continue; } if (*endptr != '\0') { continue; } if (fd == dir_fd) { continue; } if (fd > INT_MAX) { continue; } if (fd < lower) { continue; } if (num_fds >= (fd_array_size / sizeof(int))) { void *tmp; if (fd_array_size == 0) { fd_array_size = 16 * sizeof(int); } else { if (fd_array_size + fd_array_size < fd_array_size) { /* overflow */ goto fail; } fd_array_size = fd_array_size + fd_array_size; } tmp = realloc(fds, fd_array_size); if (tmp == NULL) { goto fail; } fds = tmp; } fds[num_fds++] = fd; } for (i=0; i