diff options
-rw-r--r-- | Makefile.am | 6 | ||||
-rw-r--r-- | src/sss_client/nss_mc_common.c | 19 | ||||
-rw-r--r-- | src/tools/files.c | 70 | ||||
-rw-r--r-- | src/util/io.c | 90 | ||||
-rw-r--r-- | src/util/util.h | 3 |
5 files changed, 103 insertions, 85 deletions
diff --git a/Makefile.am b/Makefile.am index 0554a367..e0756ea3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -537,7 +537,8 @@ libsss_util_la_SOURCES = \ src/util/sss_selinux.c \ src/util/domain_info_utils.c \ src/util/util_lock.c \ - src/util/util_errors.c + src/util/util_errors.c \ + src/util/io.c libsss_util_la_LIBADD = \ $(SSSD_LIBS) \ $(UNICODE_LIBS) \ @@ -931,7 +932,8 @@ files_tests_CFLAGS = \ files_tests_LDADD = \ libsss_debug.la \ $(FILES_TESTS_LIBS) \ - libsss_test_common.la + libsss_test_common.la \ + libsss_util.la SSSD_RESOLV_TESTS_OBJ = \ $(SSSD_RESOLV_OBJ) diff --git a/src/sss_client/nss_mc_common.c b/src/sss_client/nss_mc_common.c index 78490bef..66442b71 100644 --- a/src/sss_client/nss_mc_common.c +++ b/src/sss_client/nss_mc_common.c @@ -31,6 +31,7 @@ #include <string.h> #include <stdlib.h> #include "nss_mc.h" +#include "util/util.h" /* FIXME: hook up to library destructor to avoid leaks */ /* FIXME: temporarily open passwd file on our own, later we will probably @@ -100,12 +101,6 @@ errno_t sss_nss_check_header(struct sss_cli_mc_ctx *ctx) return 0; } -#ifdef O_CLOEXEC -#define SSS_MC_OPEN_FLAGS O_RDONLY|O_CLOEXEC -#else -#define SSS_MC_OPEN_FLAGS O_RDONLY -#endif - errno_t sss_nss_mc_get_ctx(const char *name, struct sss_cli_mc_ctx *ctx) { struct stat fdstat; @@ -129,19 +124,9 @@ errno_t sss_nss_mc_get_ctx(const char *name, struct sss_cli_mc_ctx *ctx) goto done; } - ctx->fd = open(file, SSS_MC_OPEN_FLAGS); + ctx->fd = sss_open_cloexec(file, O_RDONLY, &ret); if (ctx->fd == -1) { - ret = EIO; goto done; -#ifndef O_CLOEXEC - } else { - int v; - - v = fcntl(ctx->fd, F_GETFD, 0); - /* we ignore an error, it's not fatal and there is nothing we - * can do about it anyways */ - (void)fcntl(ctx->fd, F_SETFD, v | FD_CLOEXEC); -#endif } ret = fstat(ctx->fd, &fdstat); diff --git a/src/tools/files.c b/src/tools/files.c index 57261729..10fd6fe4 100644 --- a/src/tools/files.c +++ b/src/tools/files.c @@ -75,68 +75,6 @@ struct copy_ctx { gid_t gid; }; -static int open_cloexec(const char *pathname, int flags, int *ret) -{ - int fd; - int oflags; - - oflags = flags; -#ifdef O_CLOEXEC - oflags |= O_CLOEXEC; -#endif - - errno = 0; - fd = open(pathname, oflags); - if (fd == -1) { - if (ret) { - *ret = errno; - } - return -1; - } - -#ifndef O_CLOEXEC - int v; - - v = fcntl(fd, F_GETFD, 0); - /* we ignore an error, it's not fatal and there is nothing we - * can do about it anyways */ - (void)fcntl(fd, F_SETFD, v | FD_CLOEXEC); -#endif - - return fd; -} - -static int openat_cloexec(int dir_fd, const char *pathname, int flags, int *ret) -{ - int fd; - int oflags; - - oflags = flags; -#ifdef O_CLOEXEC - oflags |= O_CLOEXEC; -#endif - - errno = 0; - fd = openat(dir_fd, pathname, oflags); - if (fd == -1) { - if (ret) { - *ret = errno; - } - return -1; - } - -#ifndef O_CLOEXEC - int v; - - v = fcntl(fd, F_GETFD, 0); - /* we ignore an error, it's not fatal and there is nothing we - * can do about it anyways */ - (void)fcntl(fd, F_SETFD, v | FD_CLOEXEC); -#endif - - return fd; -} - static int sss_timeat_set(int dir_fd, const char *path, const struct stat *statp, int flags) @@ -232,7 +170,7 @@ static int remove_tree_with_ctx(TALLOC_CTX *mem_ctx, int ret, err; int dir_fd; - dir_fd = openat_cloexec(parent_fd, dir_name, + dir_fd = sss_openat_cloexec(parent_fd, dir_name, O_RDONLY | O_DIRECTORY | O_NOFOLLOW, &ret); if (dir_fd == -1) { ret = errno; @@ -607,7 +545,7 @@ copy_entry(struct copy_ctx *cctx, * us against FIFOs and perhaps side-effects of the open() of a * device file if there ever was one here, and doesn't matter * for regular files or directories. */ - ifd = openat_cloexec(src_dir_fd, ent_name, + ifd = sss_openat_cloexec(src_dir_fd, ent_name, O_RDONLY | O_NOFOLLOW | O_NONBLOCK, &ret); if (ifd == -1 && ret != ELOOP) { /* openat error */ @@ -721,7 +659,7 @@ copy_dir(struct copy_ctx *cctx, goto done; } - dest_dir_fd = openat_cloexec(dest_parent_fd, dest_dir_name, + dest_dir_fd = sss_openat_cloexec(dest_parent_fd, dest_dir_name, O_RDONLY | O_DIRECTORY | O_NOFOLLOW, &ret); if (dest_dir_fd == -1) { ret = errno; @@ -807,7 +745,7 @@ int copy_tree(const char *src_root, const char *dst_root, int fd = -1; struct stat s_src; - fd = open_cloexec(src_root, O_RDONLY | O_DIRECTORY, &ret); + fd = sss_open_cloexec(src_root, O_RDONLY | O_DIRECTORY, &ret); if (fd == -1) { goto fail; } diff --git a/src/util/io.c b/src/util/io.c new file mode 100644 index 00000000..e07a18c5 --- /dev/null +++ b/src/util/io.c @@ -0,0 +1,90 @@ +/* + SSSD + + compact.c + + Authors: + Lukas Slebodnik <lslebodn@redhat.com> + + Copyright (C) 2012 Red Hat + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <unistd.h> +#include <fcntl.h> + +#include "util/util.h" + +int sss_open_cloexec(const char *pathname, int flags, int *ret) +{ + int fd; + int oflags; + + oflags = flags; +#ifdef O_CLOEXEC + oflags |= O_CLOEXEC; +#endif + + errno = 0; + fd = open(pathname, oflags); + if (fd == -1) { + if (ret) { + *ret = errno; + } + return -1; + } + +#ifndef O_CLOEXEC + int v; + + v = fcntl(fd, F_GETFD, 0); + /* we ignore an error, it's not fatal and there is nothing we + * can do about it anyways */ + (void)fcntl(fd, F_SETFD, v | FD_CLOEXEC); +#endif + + return fd; +} + +int sss_openat_cloexec(int dir_fd, const char *pathname, int flags, int *ret) +{ + int fd; + int oflags; + + oflags = flags; +#ifdef O_CLOEXEC + oflags |= O_CLOEXEC; +#endif + + errno = 0; + fd = openat(dir_fd, pathname, oflags); + if (fd == -1) { + if (ret) { + *ret = errno; + } + return -1; + } + +#ifndef O_CLOEXEC + int v; + + v = fcntl(fd, F_GETFD, 0); + /* we ignore an error, it's not fatal and there is nothing we + * can do about it anyways */ + (void)fcntl(fd, F_SETFD, v | FD_CLOEXEC); +#endif + + return fd; +} diff --git a/src/util/util.h b/src/util/util.h index 8afb3bc9..d5ff9bb0 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -584,6 +584,9 @@ errno_t sssd_domain_init(TALLOC_CTX *mem_ctx, /* from util_lock.c */ errno_t sss_br_lock_file(int fd, size_t start, size_t len, int num_tries, useconds_t wait); +/* from io.c */ +int sss_open_cloexec(const char *pathname, int flags, int *ret); +int sss_openat_cloexec(int dir_fd, const char *pathname, int flags, int *ret); /* Endianness-compatibility for systems running older versions of glibc */ |