From e73696fd87db1a556db36cdba1856c967894021b Mon Sep 17 00:00:00 2001 From: Lev Kujawski <77709387+lev105@users.noreply.github.com> Date: Sat, 23 Jan 2021 14:31:47 -0700 Subject: [PATCH] Reenable the clobber method on UnixWare. (#160) UnixWare's ps prefers to read psinfo (from the proc structure in kernel memory) within /proc as an anti-Trojan horse measure. Updates to argv[0] are still reflected within /proc/$pid/cmdline, which is useful for diagnostic purposes. src/cmd/ksh93/sh/main.c: - Remove __USLC__ from the list of platforms excluded from the fixargs method. src/cmd/ksh93/tests/basic.sh: - Read /proc/$pid/cmdline instead of ps on UnixWare. --- src/cmd/ksh93/sh/main.c | 2 +- src/cmd/ksh93/tests/basic.sh | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/cmd/ksh93/sh/main.c b/src/cmd/ksh93/sh/main.c index 9077c60fc..021da552d 100644 --- a/src/cmd/ksh93/sh/main.c +++ b/src/cmd/ksh93/sh/main.c @@ -53,7 +53,7 @@ /* These routines are referenced by this module */ static void exfile(Shell_t*, Sfio_t*,int); static void chkmail(Shell_t *shp, char*); -#if defined(_lib_fork) && !defined(_NEXT_SOURCE) && !defined(__USLC__) && !defined(__sun) +#if defined(_lib_fork) && !defined(_NEXT_SOURCE) && !defined(__sun) static void fixargs(char**,int); #else # define fixargs(a,b) diff --git a/src/cmd/ksh93/tests/basic.sh b/src/cmd/ksh93/tests/basic.sh index f917c8b81..a70cb2f19 100755 --- a/src/cmd/ksh93/tests/basic.sh +++ b/src/cmd/ksh93/tests/basic.sh @@ -712,19 +712,28 @@ getPsOutput() { while [[ $actual == [[:space:]]* ]]; do actual=${actual#?}; done while [[ $actual == *[[:space:]] ]]; do actual=${actual%?}; done } -if [[ ! $(uname -s) =~ ^(SunOS|UnixWare)$ ]] && +getCmdline() { + if [[ $(uname -s) =~ ^UnixWare$ ]]; then + # UnixWare's ps does not trust the value stored in argv[0] as a + # security measure. It is still accessible within cmdline. + actual=$(< "/proc/${1}/cmdline") + else + getPsOutput "$1" + fi +} +if [[ ! $(uname -s) =~ ^SunOS$ ]] && getPsOutput "$$" && [[ "$SHELL $0" == "$actual"* ]] # "$SHELL $0" is how shtests invokes this script then expect='./atest 1 2' echo 'sleep 10; exit 0' >atest chmod 755 atest ./atest 1 2 & - getPsOutput "$!" + getCmdline "$!" kill "$!" [[ $actual == "$expect" ]] || err_exit "ksh didn't rewrite argv correctly" \ "(expected $(printf %q "$expect"), got $(printf %q "$actual"))" fi -unset -f getPsOutput +unset -f getPsOutput getCmdline # ====== # https://bugzilla.redhat.com/1241013