about summary refs log tree commit diff
path: root/Test
diff options
context:
space:
mode:
authorDaniel Shahaf <d.s@daniel.shahaf.name>2020-07-02 17:40:18 +0000
committerDaniel Shahaf <d.s@daniel.shahaf.name>2020-07-05 11:11:22 +0000
commit63fde0b744130d95e463299e204ddc5c46199b08 (patch)
treed70e49853c861b2a381c590143686f93a12481dc /Test
parent4e471c3f899b485e7a4122c75da1500c2d509236 (diff)
downloadzsh-63fde0b744130d95e463299e204ddc5c46199b08.tar.gz
zsh-63fde0b744130d95e463299e204ddc5c46199b08.tar.xz
zsh-63fde0b744130d95e463299e204ddc5c46199b08.zip
46174/0001: test harness: Plug a symlink attack
The test harness created tempfiles with a predictable names and sourced
them without verifying they had been created by itself.  This opened
anyone who ran the test suite to a symlink attacks from other local
users on the build machine.

Fix this by creating the file whilst NO_CLOBBER and ERR_EXIT are both in
scope, to ensure that we'll abort unless the file really was created as
expected.

Put the existing rm(1) call in a try/always block to help it be unlinked
on test failures, thus reducing the chances of the NO_CLOBBER check
triggering on tempfiles created by earlier test suite runs.

I had first tried to fix this by using the
.
    () { ... } =(:)
.
idiom, but couldn't get that to work: it broke the %prep code of X03
with ZTST_verbose unset (its default value) but not with ZTST_verbose=3.
(I tried to set the latter to debug zpty_flush.)

While there, add a needed-in-principle-but-noop-in-this-specific-case (q).

Indentation will be restored in the next commit.
Diffstat (limited to 'Test')
-rw-r--r--Test/comptest12
1 files changed, 10 insertions, 2 deletions
diff --git a/Test/comptest b/Test/comptest
index 166d0b404..4a5fcb4ba 100644
--- a/Test/comptest
+++ b/Test/comptest
@@ -112,17 +112,25 @@ zpty_run() {
 }
 
 comptesteval () {
+ {
+  # Avoid symlink attacks on the predictable filename
+  # TODO: either use =(:) or create this file in the tests' workdir
   local tmp=/tmp/comptest.$$
+  () {
+    setopt localoptions NO_CLOBBER ERR_EXIT
+    print -lr - "$@" > $tmp
+  } "$@"
 
-  print -lr - "$@" > $tmp
   # zpty_flush Before comptesteval
-  zpty -w zsh ". $tmp"
+  zpty -w zsh ". ${(q)tmp}"
   zpty -r -m zsh log_eval "*<PROMPT>*" || {
     print "prompt hasn't appeared."
     return 1
   }
   zpty_flush After comptesteval
+ } always {
   rm $tmp
+ }
 }
 
 comptest () {