| From 9c3e5de3240554c8ea1b29d52eeadee4840fefac Mon Sep 17 00:00:00 2001 |
| From: Kir Kolyshkin <kolyshkin@gmail.com> |
| Date: Tue, 29 May 2018 17:37:05 -0700 |
| Subject: [PATCH 1/3] Factor out and unify setting CLOEXEC |
| |
| Commit 7a7c31f5 ("Set FD_CLOEXEC on opened files before exec from |
| lua script is called") copied the code that sets CLOEXEC flag on all |
| possible file descriptors from lib/rpmscript.c to luaext/lposix.c, |
| essentially creating two copies of the same code (modulo comments |
| and the unused assignment). |
| |
| This commit moves the functionality into its own function, without |
| any code modifications, using the version from luaext/lposix.c. |
| |
| Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com> |
| Upstream-Status: Accepted [https://github.com/rpm-software-management/rpm/pull/444] |
| Signed-off-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> |
| --- |
| lib/rpmscript.c | 18 ++---------------- |
| luaext/lposix.c | 13 ++----------- |
| rpmio/rpmio.c | 16 ++++++++++++++++ |
| rpmio/rpmio_internal.h | 6 ++++++ |
| 4 files changed, 26 insertions(+), 27 deletions(-) |
| |
| diff --git a/lib/rpmscript.c b/lib/rpmscript.c |
| index 747385a5b..b4ccd3246 100644 |
| --- a/lib/rpmscript.c |
| +++ b/lib/rpmscript.c |
| @@ -3,7 +3,6 @@ |
| #include <sys/types.h> |
| #include <sys/wait.h> |
| #include <errno.h> |
| -#include <unistd.h> |
| |
| #include <rpm/rpmfileutil.h> |
| #include <rpm/rpmmacro.h> |
| @@ -14,6 +13,7 @@ |
| |
| #include "rpmio/rpmlua.h" |
| #include "lib/rpmscript.h" |
| +#include "rpmio/rpmio_internal.h" |
| |
| #include "lib/rpmplugins.h" /* rpm plugins hooks */ |
| |
| @@ -170,26 +170,12 @@ static const char * const SCRIPT_PATH = "PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr |
| static void doScriptExec(ARGV_const_t argv, ARGV_const_t prefixes, |
| FD_t scriptFd, FD_t out) |
| { |
| - int flag; |
| - int fdno; |
| int xx; |
| - int open_max; |
| |
| /* SIGPIPE is ignored in rpm, reset to default for the scriptlet */ |
| (void) signal(SIGPIPE, SIG_DFL); |
| |
| - /* XXX Force FD_CLOEXEC on all inherited fdno's. */ |
| - open_max = sysconf(_SC_OPEN_MAX); |
| - if (open_max == -1) { |
| - open_max = 1024; |
| - } |
| - for (fdno = 3; fdno < open_max; fdno++) { |
| - flag = fcntl(fdno, F_GETFD); |
| - if (flag == -1 || (flag & FD_CLOEXEC)) |
| - continue; |
| - xx = fcntl(fdno, F_SETFD, FD_CLOEXEC); |
| - /* XXX W2DO? debug msg for inheirited fdno w/o FD_CLOEXEC */ |
| - } |
| + rpmSetCloseOnExec(); |
| |
| if (scriptFd != NULL) { |
| int sfdno = Fileno(scriptFd); |
| diff --git a/luaext/lposix.c b/luaext/lposix.c |
| index 0a7c26c71..5d7ad3c87 100644 |
| --- a/luaext/lposix.c |
| +++ b/luaext/lposix.c |
| @@ -27,6 +27,7 @@ |
| #include <unistd.h> |
| #include <utime.h> |
| #include <rpm/rpmutil.h> |
| +#include "rpmio/rpmio_internal.h" |
| |
| #define MYNAME "posix" |
| #define MYVERSION MYNAME " library for " LUA_VERSION " / Nov 2003" |
| @@ -335,21 +336,11 @@ static int Pexec(lua_State *L) /** exec(path,[args]) */ |
| const char *path = luaL_checkstring(L, 1); |
| int i,n=lua_gettop(L); |
| char **argv; |
| - int flag, fdno, open_max; |
| |
| if (!have_forked) |
| return luaL_error(L, "exec not permitted in this context"); |
| |
| - open_max = sysconf(_SC_OPEN_MAX); |
| - if (open_max == -1) { |
| - open_max = 1024; |
| - } |
| - for (fdno = 3; fdno < open_max; fdno++) { |
| - flag = fcntl(fdno, F_GETFD); |
| - if (flag == -1 || (flag & FD_CLOEXEC)) |
| - continue; |
| - fcntl(fdno, F_SETFD, FD_CLOEXEC); |
| - } |
| + rpmSetCloseOnExec(); |
| |
| argv = malloc((n+1)*sizeof(char*)); |
| if (argv==NULL) return luaL_error(L,"not enough memory"); |
| diff --git a/rpmio/rpmio.c b/rpmio/rpmio.c |
| index c7cbc32aa..ea111d2ec 100644 |
| --- a/rpmio/rpmio.c |
| +++ b/rpmio/rpmio.c |
| @@ -1759,3 +1759,19 @@ DIGEST_CTX fdDupDigest(FD_t fd, int id) |
| |
| return ctx; |
| } |
| + |
| +void rpmSetCloseOnExec(void) |
| +{ |
| + int flag, fdno, open_max; |
| + |
| + open_max = sysconf(_SC_OPEN_MAX); |
| + if (open_max == -1) { |
| + open_max = 1024; |
| + } |
| + for (fdno = 3; fdno < open_max; fdno++) { |
| + flag = fcntl(fdno, F_GETFD); |
| + if (flag == -1 || (flag & FD_CLOEXEC)) |
| + continue; |
| + fcntl(fdno, F_SETFD, FD_CLOEXEC); |
| + } |
| +} |
| diff --git a/rpmio/rpmio_internal.h b/rpmio/rpmio_internal.h |
| index fbed183b0..370cbdc75 100644 |
| --- a/rpmio/rpmio_internal.h |
| +++ b/rpmio/rpmio_internal.h |
| @@ -41,6 +41,12 @@ DIGEST_CTX fdDupDigest(FD_t fd, int id); |
| int rpmioSlurp(const char * fn, |
| uint8_t ** bp, ssize_t * blenp); |
| |
| +/** |
| + * Set close-on-exec flag for all opened file descriptors, except |
| + * stdin/stdout/stderr. |
| + */ |
| +void rpmSetCloseOnExec(void); |
| + |
| #ifdef __cplusplus |
| } |
| #endif |