[lxc-devel] [PATCH 3/6] Add fopen_cloexec function to emulate 'e' mode
Serge Hallyn
serge.hallyn at ubuntu.com
Tue Sep 10 03:37:50 UTC 2013
Quoting Christian Seiler (christian at iwakd.de):
> Newer glibc versions (that we can't require) allow for an additional
> letter 'e' in the fopen mode that will cause the file to be opened with
> the O_CLOEXEC flag, so that it will be closed if the program exec()s
> away. This is important because if liblxc is used in a multithreaded
> program, another thread might want to run a program. This options
> prevents the leakage of file descriptors from LXC. This patch adds an
> emulation for that that uses the open(2) syscall and fdopen(3). At some
> later point in time, it may be dropped against fopen(..., "...e").
>
> This commit also converts all fopen() calls in utils.c (where the
> function is added) to fopen_cloexec(). Subsequently, other calls to
> fopen() and open() should also be adapted.
>
> Signed-off-by: Christian Seiler <christian at iwakd.de>
Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
Though the special case for calling open() without a mode arg seems
unnecessary since when called without O_CREAT, mode is supposed to be
ignored.
> ---
> src/lxc/utils.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++--
> src/lxc/utils.h | 3 +++
> 2 files changed, 51 insertions(+), 2 deletions(-)
>
> diff --git a/src/lxc/utils.c b/src/lxc/utils.c
> index 36d80b9..b188c47 100644
> --- a/src/lxc/utils.c
> +++ b/src/lxc/utils.c
> @@ -245,7 +245,7 @@ const char *lxc_global_config_value(const char *option_name)
> if (values[i])
> return values[i];
>
> - fin = fopen(LXC_GLOBAL_CONF, "r");
> + fin = fopen_cloexec(LXC_GLOBAL_CONF, "r");
> if (fin) {
> while (fgets(buf, 1024, fin)) {
> if (buf[0] == '#')
> @@ -391,7 +391,7 @@ int sha1sum_file(char *fnam, unsigned char *digest)
>
> if (!fnam)
> return -1;
> - if ((f = fopen(fnam, "r")) < 0) {
> + if ((f = fopen_cloexec(fnam, "r")) < 0) {
> SYSERROR("Error opening template");
> return -1;
> }
> @@ -477,3 +477,49 @@ const char** lxc_va_arg_list_to_argv_const(va_list ap, size_t skip)
> {
> return (const char**)lxc_va_arg_list_to_argv(ap, skip, 0);
> }
> +
> +FILE *fopen_cloexec(const char *path, const char *mode)
> +{
> + int open_mode = 0;
> + int step = 0;
> + int fd;
> + int saved_errno = 0;
> + FILE *ret;
> +
> + if (!strncmp(mode, "r+", 2)) {
> + open_mode = O_RDWR;
> + step = 2;
> + } else if (!strncmp(mode, "r", 1)) {
> + open_mode = O_RDONLY;
> + step = 1;
> + } else if (!strncmp(mode, "w+", 2)) {
> + open_mode = O_RDWR | O_TRUNC | O_CREAT;
> + step = 2;
> + } else if (!strncmp(mode, "w", 1)) {
> + open_mode = O_WRONLY | O_TRUNC | O_CREAT;
> + step = 1;
> + } else if (!strncmp(mode, "a+", 2)) {
> + open_mode = O_RDWR | O_CREAT | O_APPEND;
> + step = 2;
> + } else if (!strncmp(mode, "a", 1)) {
> + open_mode = O_WRONLY | O_CREAT | O_APPEND;
> + step = 1;
> + }
> + for (; mode[step]; step++)
> + if (mode[step] == 'x')
> + open_mode |= O_EXCL;
> + open_mode |= O_CLOEXEC;
> +
> + fd = (open_mode & O_CREAT) ?
> + open(path, open_mode, 0666) :
> + open(path, open_mode);
> + if (fd < 0)
> + return NULL;
> +
> + ret = fdopen(fd, mode);
> + saved_errno = errno;
> + if (!ret)
> + close(fd);
> + errno = saved_errno;
> + return ret;
> +}
> diff --git a/src/lxc/utils.h b/src/lxc/utils.h
> index 0ad9505..b79be44 100644
> --- a/src/lxc/utils.h
> +++ b/src/lxc/utils.h
> @@ -148,6 +148,9 @@ static inline int signalfd(int fd, const sigset_t *mask, int flags)
> }
> #endif
>
> +/* open a file with O_CLOEXEC */
> +FILE *fopen_cloexec(const char *path, const char *mode);
> +
>
> /**
> * BUILD_BUG_ON - break compile if a condition is true.
> --
> 1.7.10.4
>
>
> ------------------------------------------------------------------------------
> Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
> Discover the easy way to master current and previous Microsoft technologies
> and advance your career. Get an incredible 1,500+ hours of step-by-step
> tutorial videos with LearnDevNow. Subscribe today and save!
> http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk
> _______________________________________________
> Lxc-devel mailing list
> Lxc-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel
More information about the lxc-devel
mailing list