From bae02c39b6e25aa42f98470f1fbba7d471cbb454 Mon Sep 17 00:00:00 2001 From: Martijn Dekker Date: Fri, 8 Jan 2021 11:28:33 +0000 Subject: [PATCH] Fix for argv for setuid scripts (Solaris patch 115-CR6934836) This change is pulled from here: https://github.com/oracle/solaris-userland/blob/master/components/ksh93/patches/115-CR6934836.patch Unfortunately there is no publicly available documentation on what this does or why it was needed. We just have to assume the Solaris people knew what they were doing. ksh2020 upstreamed this too (as well as all the other Solaris patches applied here). --- src/cmd/ksh93/include/defs.h | 2 ++ src/cmd/ksh93/sh/init.c | 6 +++++- src/cmd/ksh93/sh/main.c | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/cmd/ksh93/include/defs.h b/src/cmd/ksh93/include/defs.h index 59d50e1e9..e641d9924 100644 --- a/src/cmd/ksh93/include/defs.h +++ b/src/cmd/ksh93/include/defs.h @@ -102,6 +102,8 @@ struct sh_scoped char **otrapcom; void *timetrap; struct Ufunction *real_fun; /* current 'function name' function */ + int repl_index; + char *repl_arg; }; struct limits diff --git a/src/cmd/ksh93/sh/init.c b/src/cmd/ksh93/sh/init.c index e99e0f8a1..99d388e2e 100644 --- a/src/cmd/ksh93/sh/init.c +++ b/src/cmd/ksh93/sh/init.c @@ -1339,6 +1339,7 @@ Shell_t *sh_init(register int argc,register char *argv[], Shinit_f userinit) sh_onoption(SH_MULTILINE); if(argc>0) { + int dolv_index; /* check for restricted shell */ if(type&SH_TYPE_RESTRICTED) sh_onoption(SH_RESTRICTED); @@ -1355,7 +1356,10 @@ Shell_t *sh_init(register int argc,register char *argv[], Shinit_f userinit) sh_done(shp,0); } opt_info.disc = 0; - shp->st.dolv=argv+(argc-1)-shp->st.dolc; + dolv_index = (argc - 1) - shp->st.dolc; + shp->st.dolv = argv + dolv_index; + shp->st.repl_index = dolv_index; + shp->st.repl_arg = argv[dolv_index]; shp->st.dolv[0] = argv[0]; if(shp->st.dolc < 1) { diff --git a/src/cmd/ksh93/sh/main.c b/src/cmd/ksh93/sh/main.c index 6c539e45f..7b6ab42c0 100644 --- a/src/cmd/ksh93/sh/main.c +++ b/src/cmd/ksh93/sh/main.c @@ -267,6 +267,8 @@ int sh_main(int ac, char *av[], Shinit_f userinit) * try to undo effect of solaris 2.5+ * change for argv for setuid scripts */ + if(shp->st.repl_index > 0) + av[shp->st.repl_index] = shp->st.repl_arg; if(((type = sh_type(cp = av[0])) & SH_TYPE_SH) && (name = nv_getval(L_ARGNOD)) && (!((type = sh_type(cp = name)) & SH_TYPE_SH))) { av[0] = (type & SH_TYPE_LOGIN) ? cp : path_basename(cp);