diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2020-01-03 12:37:20 +0000 |
---|---|---|
committer | Laurent Bercot <ska-skaware@skarnet.org> | 2020-01-03 12:37:20 +0000 |
commit | 610a46dc7a2b7459929b20e4350b3544e67c0b09 (patch) | |
tree | 2689e13ba29ebbb6ece42817a26542964607244a /src | |
parent | 75d32e29d7af2c82c3036ff7c357b3eaea136934 (diff) | |
download | s6-frontend-610a46dc7a2b7459929b20e4350b3544e67c0b09.tar.gz s6-frontend-610a46dc7a2b7459929b20e4350b3544e67c0b09.tar.xz s6-frontend-610a46dc7a2b7459929b20e4350b3544e67c0b09.zip |
Nip multicall chroot problems in the bud; only support 1 envdir
Diffstat (limited to 'src')
-rw-r--r-- | src/alias/s6-frontend-alias-chpst.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/src/alias/s6-frontend-alias-chpst.c b/src/alias/s6-frontend-alias-chpst.c index 860654e..6611924 100644 --- a/src/alias/s6-frontend-alias-chpst.c +++ b/src/alias/s6-frontend-alias-chpst.c @@ -15,8 +15,6 @@ #include <skalibs/buffer.h> #include <skalibs/strerr2.h> #include <skalibs/stralloc.h> -#include <skalibs/genalloc.h> -#include <skalibs/env.h> #include <skalibs/djbunix.h> #include <execline/config.h> @@ -141,9 +139,9 @@ static inline size_t parseuggsym (char const *s, uint32_t *flags, uid_t *uid, gi int main (int argc, char const *const *argv, char const *const *envp) { static char const *valopt[6] = { "-m", "-d", "-o", "-p", "-f", "-c" } ; - genalloc envdirs = GENALLOC_ZERO ; /* char const * */ stralloc newroot = STRALLOC_ZERO ; unsigned int newargc = 0 ; + char const *edir = 0 ; char const *argv0 = 0 ; char const *lockfile = 0 ; char const *envug = 0 ; @@ -196,10 +194,7 @@ int main (int argc, char const *const *argv, char const *const *envp) if (envug[0] == ':') { flags |= 4096 ; envug++ ; newargc++ ; } else flags &= ~4096 ; if (strchr(envug, ':')) { flags |= 8192 ; newargc++ ; } else flags &= ~8192 ; break ; - case 'e' : - if (!genalloc_append(char const *, &envdirs, &l.arg)) dienomem() ; - newargc += 3 ; - break ; + case 'e' : edir = l.arg ; newargc += 3 ; break ; case '/' : newroot.len = 0 ; if (sarealpath(&newroot, l.arg) < 0 || !stralloc_0(&newroot)) dienomem() ; @@ -254,14 +249,11 @@ int main (int argc, char const *const *argv, char const *const *envp) newargv[m++] = "--" ; } - if (genalloc_len(char const *, &envdirs)) + if (edir) { - for (size_t i = 0 ; i < genalloc_len(char const *, &envdirs) ; i++) - { - newargv[m++] = S6_EXTBINPREFIX "s6-envdir" ; - newargv[m++] = "--" ; - newargv[m++] = genalloc_s(char const *, &envdirs)[i] ; - } + newargv[m++] = S6_EXTBINPREFIX "s6-envdir" ; + newargv[m++] = "--" ; + newargv[m++] = edir ; } if (lockfile) @@ -325,6 +317,12 @@ int main (int argc, char const *const *argv, char const *const *envp) newargv[m++] = "2" ; } + if (argv0 && newroot.s) + { + argv0 = 0 ; + strerr_warnw1x("the -b option is ineffective when the -/ option is also given") ; + } + if (argv0) { newargv[m++] = EXECLINE_BINPREFIX "exec" ; @@ -337,7 +335,6 @@ int main (int argc, char const *const *argv, char const *const *envp) { newargv[m++] = "chroot" ; newargv[m++] = newroot.s ; - if (argv0) strerr_warnw1x("the -b option is ineffective when the -/ option is also given") ; } for (int i = 0 ; i < argc+1 ; i++) newargv[m++] = argv[i] ; |