From 2f21e12af8aa5c057fc1a92d77a59f130efb5750 Mon Sep 17 00:00:00 2001 From: Tim Cutts Date: Thu, 26 Mar 2026 11:11:54 +0000 Subject: [PATCH 1/4] fix insecure quoting and path expasions --- src/psij/launchers/scripts/aprun_launch.sh | 6 ++-- src/psij/launchers/scripts/jsrun_launch.sh | 6 ++-- src/psij/launchers/scripts/launcher_lib.sh | 34 ++++++++++++++++----- src/psij/launchers/scripts/mpi_launch.sh | 14 ++++----- src/psij/launchers/scripts/multi_launch.sh | 6 ++-- src/psij/launchers/scripts/single_launch.sh | 4 +-- src/psij/launchers/scripts/srun_launch.sh | 4 +-- tests/plugins1/_batch_test/test/launcher.sh | 14 ++++----- 8 files changed, 54 insertions(+), 34 deletions(-) diff --git a/src/psij/launchers/scripts/aprun_launch.sh b/src/psij/launchers/scripts/aprun_launch.sh index bd586ade..6f3e5dbf 100644 --- a/src/psij/launchers/scripts/aprun_launch.sh +++ b/src/psij/launchers/scripts/aprun_launch.sh @@ -1,6 +1,6 @@ #!/bin/bash -source $(dirname "$0")/launcher_lib.sh +source "${0%/*}/launcher_lib.sh" _PSI_J_PROCESS_COUNT="$1" shift @@ -8,7 +8,7 @@ shift pre_launch set +e -aprun -n $_PSI_J_PROCESS_COUNT "$@" 1>$_PSI_J_STDOUT 2>$_PSI_J_STDERR <$_PSI_J_STDIN +aprun -n "$_PSI_J_PROCESS_COUNT" "$@" 1>"$_PSI_J_STDOUT" 2>"$_PSI_J_STDERR" <"$_PSI_J_STDIN" _PSI_J_EC=$? set -e @@ -16,4 +16,4 @@ log "Command done: $_PSI_J_EC" post_launch -exit $_PSI_J_EC +exit "$_PSI_J_EC" diff --git a/src/psij/launchers/scripts/jsrun_launch.sh b/src/psij/launchers/scripts/jsrun_launch.sh index 80fdcff4..4aca56ec 100755 --- a/src/psij/launchers/scripts/jsrun_launch.sh +++ b/src/psij/launchers/scripts/jsrun_launch.sh @@ -1,6 +1,6 @@ #!/bin/bash -source $(dirname "$0")/launcher_lib.sh +source "${0%/*}/launcher_lib.sh" _PSI_J_PROCESS_COUNT="$1" shift @@ -8,7 +8,7 @@ shift pre_launch set +e -jsrun -p $_PSI_J_PROCESS_COUNT --np 1 "$@" 1>$_PSI_J_STDOUT 2>$_PSI_J_STDERR <$_PSI_J_STDIN +jsrun -p "$_PSI_J_PROCESS_COUNT" --np 1 "$@" 1>"$_PSI_J_STDOUT" 2>"$_PSI_J_STDERR" <"$_PSI_J_STDIN" _PSI_J_EC=$? set -e @@ -16,4 +16,4 @@ log "Command done: $_PSI_J_EC" post_launch -exit $_PSI_J_EC +exit "$_PSI_J_EC" diff --git a/src/psij/launchers/scripts/launcher_lib.sh b/src/psij/launchers/scripts/launcher_lib.sh index ac83cd5b..9b46e378 100755 --- a/src/psij/launchers/scripts/launcher_lib.sh +++ b/src/psij/launchers/scripts/launcher_lib.sh @@ -1,12 +1,32 @@ set -e +# abspath Source - https://stackoverflow.com/a/23002317 +# Posted by Alexander Klimetschek, modified by community. See post 'Timeline' for change history +# Retrieved 2026-03-26, License - CC BY-SA 3.0 + +function _psi_j_abspath() { + if [ -d "$1" ]; then + # dir + (cd "$1"; pwd) + elif [ -f "$1" ]; then + # file + if [[ $1 = /* ]]; then + echo "$1" + elif [[ $1 == */* ]]; then + echo "$(cd "${1%/*}"; pwd)/${1##*/}" + else + echo "$(pwd)/$1" + fi + fi +} + _PSI_J_JOB_ID="$1" -_PSI_J_LOG_FILE="$2" -_PSI_J_PRE_LAUNCH="$3" -_PSI_J_POST_LAUNCH="$4" -_PSI_J_STDIN="$5" -_PSI_J_STDOUT="$6" -_PSI_J_STDERR="$7" +_PSI_J_LOG_FILE=$(_psi_j_abspath "$2") +_PSI_J_PRE_LAUNCH=$(_psi_j_abspath "$3") +_PSI_J_POST_LAUNCH=$(_psi_j_abspath "$4") +_PSI_J_STDIN=$(_psi_j_abspath "$5") +_PSI_J_STDOUT=$(_psi_j_abspath "$6") +_PSI_J_STDERR=$(_psi_j_abspath "$7") shift 7 @@ -16,7 +36,7 @@ fi ts() { while read LINE; do - TZ=UTC TS=`date '+%Y-%m-%d %H:%M:%S'` + TZ=UTC TS=$(date '+%Y-%m-%d %H:%M:%S') echo "$TS $_PSI_J_JOB_ID $LINE" done } diff --git a/src/psij/launchers/scripts/mpi_launch.sh b/src/psij/launchers/scripts/mpi_launch.sh index b23222db..445cb852 100644 --- a/src/psij/launchers/scripts/mpi_launch.sh +++ b/src/psij/launchers/scripts/mpi_launch.sh @@ -1,6 +1,6 @@ #!/bin/bash -source $(dirname "$0")/launcher_lib.sh +source "${0%/*}/launcher_lib.sh" _PSI_J_PROCESS_COUNT="$1" shift @@ -27,13 +27,13 @@ filter_out_5() { set +e if [ "$IS_OPENMPI_5" == "1" ]; then - mpirun --oversubscribe --output TAG -n $_PSI_J_PROCESS_COUNT "$@" \ - 1> >(filter_out_5 > $_PSI_J_STDOUT) 2> >(filter_out_5 > $_PSI_J_STDERR) <$_PSI_J_STDIN + mpirun --oversubscribe --output TAG -n "$_PSI_J_PROCESS_COUNT" "$@" \ + 1> >(filter_out_5 > "$_PSI_J_STDOUT") 2> >(filter_out_5 > "$_PSI_J_STDERR") <"$_PSI_J_STDIN" elif [ "$IS_OPENMPI" == "1" ]; then - mpirun --oversubscribe --tag-output -q -n $_PSI_J_PROCESS_COUNT "$@" \ - 1> >(filter_out > "$_PSI_J_STDOUT") 2> >(filter_out > $_PSI_J_STDERR) <$_PSI_J_STDIN + mpirun --oversubscribe --tag-output -q -n "$_PSI_J_PROCESS_COUNT" "$@" \ + 1> >(filter_out > "$_PSI_J_STDOUT") 2> >(filter_out > "$_PSI_J_STDERR") <"$_PSI_J_STDIN" else - mpirun -n $_PSI_J_PROCESS_COUNT "$@" 1>$_PSI_J_STDOUT 2>$_PSI_J_STDERR <$_PSI_J_STDIN + mpirun -n "$_PSI_J_PROCESS_COUNT" "$@" 1>"$_PSI_J_STDOUT" 2>"$_PSI_J_STDERR" <"$_PSI_J_STDIN" fi _PSI_J_EC=$? set -e @@ -42,4 +42,4 @@ log "Command done: $_PSI_J_EC" post_launch -exit $_PSI_J_EC +exit "$_PSI_J_EC" diff --git a/src/psij/launchers/scripts/multi_launch.sh b/src/psij/launchers/scripts/multi_launch.sh index 2c9f3213..e2f0664d 100644 --- a/src/psij/launchers/scripts/multi_launch.sh +++ b/src/psij/launchers/scripts/multi_launch.sh @@ -1,6 +1,6 @@ #!/bin/bash -source $(dirname "$0")/launcher_lib.sh +source "${0%/*}/launcher_lib.sh" pre_launch @@ -9,8 +9,8 @@ _PSI_J_PROCESS_COUNT="$1" shift export _PSI_J_PROCESS_COUNT -for INDEX in $(seq 1 1 $_PSI_J_PROCESS_COUNT); do - _PSI_J_PROCESS_INDEX_=$INDEX "$@" 1>>$_PSI_J_STDOUT 2>>$_PSI_J_STDERR <$_PSI_J_STDIN & +for INDEX in $(seq 1 1 "$_PSI_J_PROCESS_COUNT"); do + _PSI_J_PROCESS_INDEX_=$INDEX "$@" 1>>"$_PSI_J_STDOUT" 2>>"$_PSI_J_STDERR" <"$_PSI_J_STDIN" & PIDS="$PIDS $!" done diff --git a/src/psij/launchers/scripts/single_launch.sh b/src/psij/launchers/scripts/single_launch.sh index 88e5d235..52558671 100644 --- a/src/psij/launchers/scripts/single_launch.sh +++ b/src/psij/launchers/scripts/single_launch.sh @@ -1,11 +1,11 @@ #!/bin/bash -source $(dirname "$0")/launcher_lib.sh +source "${0%/*}/launcher_lib.sh" pre_launch set +e -"$@" 1>$_PSI_J_STDOUT 2>$_PSI_J_STDERR <$_PSI_J_STDIN +"$@" 1>"$_PSI_J_STDOUT" 2>"$_PSI_J_STDERR" <"$_PSI_J_STDIN" _PSI_J_EC=$? set -e log "Command done: $_PSI_J_EC" diff --git a/src/psij/launchers/scripts/srun_launch.sh b/src/psij/launchers/scripts/srun_launch.sh index d0ac39ca..3fcb0f4e 100644 --- a/src/psij/launchers/scripts/srun_launch.sh +++ b/src/psij/launchers/scripts/srun_launch.sh @@ -1,6 +1,6 @@ #!/bin/bash -source $(dirname "$0")/launcher_lib.sh +source "${0%/*}/launcher_lib.sh" _PSI_J_PROCESS_COUNT="$1" shift @@ -8,7 +8,7 @@ shift pre_launch set +e -srun "$@" 1>$_PSI_J_STDOUT 2>$_PSI_J_STDERR <$_PSI_J_STDIN +srun "$@" 1>"$_PSI_J_STDOUT" 2>"$_PSI_J_STDERR" <"$_PSI_J_STDIN" _PSI_J_EC=$? set -e diff --git a/tests/plugins1/_batch_test/test/launcher.sh b/tests/plugins1/_batch_test/test/launcher.sh index 13a188ed..bba3dfbd 100644 --- a/tests/plugins1/_batch_test/test/launcher.sh +++ b/tests/plugins1/_batch_test/test/launcher.sh @@ -1,6 +1,6 @@ #!/bin/bash -source $(dirname "$0")/launcher_lib.sh +source "${0%/*}/launcher_lib.sh" pre_launch @@ -18,20 +18,20 @@ export _PSI_J_PPN EXECUTABLE="$1" shift if [ "$EXECUTABLE" == "/bin/hostname" ]; then - EXECUTABLE=$(dirname "$0")/hostname + EXECUTABLE="${0%/*}/hostname" fi log "Running stuff" -log "STDOUT: $_PSI_J_STDOUT" -log "STDERR: $_PSI_J_STDERR" +log "STDOUT: \"$_PSI_J_STDOUT\"" +log "STDERR: \"$_PSI_J_STDERR\"" -for NODE in $(seq 1 1 $_PSI_J_NODE_COUNT); do +for NODE in $(seq 1 1 "$_PSI_J_NODE_COUNT"); do log "Node: $NODE" - for NODE_PROC in $(seq 1 1 $_PSI_J_PPN); do + for NODE_PROC in $(seq 1 1 "$_PSI_J_PPN"); do log "Node proc: $NODE_PROC" INDEX=$(($NODE * $_PSI_J_PPN + $NODE_PROC)) log "Index: $INDEX" - _PSI_J_NODE_INDEX_=$NODE _PSI_J_PROCESS_INDEX_=$INDEX "$EXECUTABLE" "$@" 1>>$_PSI_J_STDOUT 2>>$_PSI_J_STDERR <$_PSI_J_STDIN & + _PSI_J_NODE_INDEX_=$NODE _PSI_J_PROCESS_INDEX_=$INDEX "$EXECUTABLE" "$@" 1>>"$_PSI_J_STDOUT" 2>>"$_PSI_J_STDERR" <"$_PSI_J_STDIN" & PIDS="$PIDS $!" done done From f1be0fc39fe1d6d645608d2139c7fe2b9021c98c Mon Sep 17 00:00:00 2001 From: Tim Cutts Date: Thu, 26 Mar 2026 11:31:02 +0000 Subject: [PATCH 2/4] Much faster ts() function on BASH versions which support it --- src/psij/launchers/scripts/launcher_lib.sh | 23 ++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/psij/launchers/scripts/launcher_lib.sh b/src/psij/launchers/scripts/launcher_lib.sh index 9b46e378..27f5a3b0 100755 --- a/src/psij/launchers/scripts/launcher_lib.sh +++ b/src/psij/launchers/scripts/launcher_lib.sh @@ -34,12 +34,23 @@ if [ "$_PSI_J_LOG_FILE" == "" ]; then _PSI_J_LOG_FILE="/dev/null" fi -ts() { - while read LINE; do - TZ=UTC TS=$(date '+%Y-%m-%d %H:%M:%S') - echo "$TS $_PSI_J_JOB_ID $LINE" - done -} +if [ "${BASH_VERSINFO[0]}" -gt 4 ] || { [ "${BASH_VERSINFO[0]}" -eq 4 ] && [ "${BASH_VERSINFO[1]}" -ge 2 ]; }; then + ts() { + local TZ=UTC + while read LINE; do + printf -v TS '%(%Y-%m-%d %H:%M:%S)T' -1 + echo "$TS $_PSI_J_JOB_ID $LINE" + done + } +else + ts() { + local TZ=UTC + while read LINE; do + TS=$(date '+%Y-%m-%d %H:%M:%S') + echo "$TS $_PSI_J_JOB_ID $LINE" + done + } +fi log() { echo "$@" >&3 From e21bfab86532871a18f95f64ef9cfdeebc7850ef Mon Sep 17 00:00:00 2001 From: Tim Cutts Date: Thu, 26 Mar 2026 12:22:21 +0000 Subject: [PATCH 3/4] handle device files llike /dev/null properly --- src/psij/launchers/scripts/launcher_lib.sh | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/psij/launchers/scripts/launcher_lib.sh b/src/psij/launchers/scripts/launcher_lib.sh index 27f5a3b0..cb755b5e 100755 --- a/src/psij/launchers/scripts/launcher_lib.sh +++ b/src/psij/launchers/scripts/launcher_lib.sh @@ -5,18 +5,12 @@ set -e # Retrieved 2026-03-26, License - CC BY-SA 3.0 function _psi_j_abspath() { - if [ -d "$1" ]; then - # dir - (cd "$1"; pwd) - elif [ -f "$1" ]; then - # file - if [[ $1 = /* ]]; then - echo "$1" - elif [[ $1 == */* ]]; then - echo "$(cd "${1%/*}"; pwd)/${1##*/}" - else - echo "$(pwd)/$1" - fi + if [[ $1 = /* ]]; then + echo "$1" + elif [[ $1 == */* ]]; then + echo "$(cd "${1%/*}"; pwd)/${1##*/}" + elif [ -n "$1" ]; then + echo "$(pwd)/$1" fi } From 03a249d156247872dab4853eecff1f25a12dcd42 Mon Sep 17 00:00:00 2001 From: Tim Cutts Date: Thu, 26 Mar 2026 13:05:10 +0000 Subject: [PATCH 4/4] fixed text which fails on MacOS because of different wc behaviour --- tests/test_nodefile.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_nodefile.sh b/tests/test_nodefile.sh index f061d5ee..4eed9f47 100755 --- a/tests/test_nodefile.sh +++ b/tests/test_nodefile.sh @@ -8,7 +8,7 @@ if [ "$EXPECTED_N_NODES" == "" ]; then exit 3 fi -ACTUAL_N_NODES=`cat "$PSIJ_NODEFILE" | wc -l` +ACTUAL_N_NODES=$(wc -l < "$PSIJ_NODEFILE" | tr -d ' ') if [ "$EXPECTED_N_NODES" != "$ACTUAL_N_NODES" ]; then echo "Invalid node file. Expected $EXPECTED_N_NODES nodes, but got $ACTUAL_N_NODES."