1 #! /usr/bin/ksh
   2 #
   3 #
   4 # This file and its contents are supplied under the terms of the
   5 # Common Development and Distribution License ("CDDL"), version 1.0.
   6 # You may only use this file in accordance with the terms of version
   7 # 1.0 of the CDDL.
   8 #
   9 # A full copy of the text of the CDDL should have accompanied this
  10 # source.  A copy of the CDDL is also available via the Internet at
  11 # http://www.illumos.org/license/CDDL.
  12 #
  13 
  14 #
  15 # Copyright 2015, Richard Lowe.
  16 #
  17 
  18 mkdir /tmp/$$-secflags-test
  19 cd /tmp/$$-secflags-test
  20 
  21 /usr/bin/psecflags -s none $$   # Clear ourselves out
  22 cat > expected <<EOF
  23         I:      none
  24 EOF
  25 
  26 /usr/bin/psecflags $$ | grep I: > output
  27 diff -u expected output || exit 1 # Make sure the setting of 'none' worked
  28 
  29 cleanup() {
  30     cd /
  31     rm -fr /tmp/$$-secflags-test
  32 }
  33 trap cleanup EXIT
  34 
  35 ## Tests of manipulating a running process (ourselves)
  36 
  37 self_set() {
  38     echo "Set (self)"
  39     /usr/bin/psecflags -s aslr $$
  40 
  41     cat > expected <<EOF
  42         I:      aslr
  43 EOF
  44 
  45     /usr/bin/psecflags $$ | grep I: > output
  46     diff -u expected output || exit 1
  47 }
  48 
  49 self_add() {
  50     echo "Add (self)"
  51     /usr/bin/psecflags -s current,noexecstack $$
  52     cat > expected <<EOF
  53         I:      aslr,noexecstack
  54 EOF
  55 
  56     /usr/bin/psecflags $$ | grep I: > output
  57     diff -u expected output || exit 1
  58 }
  59 
  60 self_remove() {
  61     echo "Remove (self)"
  62     /usr/bin/psecflags -s current,-aslr $$
  63     cat > expected <<EOF
  64         I:      noexecstack
  65 EOF
  66 
  67     /usr/bin/psecflags $$ | grep I: > output
  68     diff -u expected output || exit 1
  69 }
  70 
  71 self_all() {
  72     echo "All (self)"
  73     /usr/bin/psecflags -s all $$
  74     /usr/bin/psecflags $$ | grep -q 'I:.*,.*,' || exit 1 # This is lame, but functional
  75 }
  76 
  77 self_none() {
  78     echo "None (self)"
  79     /usr/bin/psecflags -s all $$
  80     /usr/bin/psecflags -s none $$
  81     cat > expected <<EOF
  82         I:      none
  83 EOF
  84     /usr/bin/psecflags $$ | grep I: > output
  85     diff -u expected output || exit 1
  86 }
  87 
  88 child_set() {
  89     echo "Set (child)"
  90 
  91     typeset pid; 
  92 
  93     /usr/bin/psecflags -s aslr -e sleep 10000 &
  94     pid=$!
  95     cat > expected <<EOF
  96         E:      aslr
  97         I:      aslr
  98 EOF
  99     /usr/bin/psecflags $pid | grep '[IE]:' > output
 100     kill $pid
 101     diff -u expected output || exit 1
 102 }
 103 
 104 child_add() {
 105     echo "Add (child)"
 106 
 107     typeset pid; 
 108 
 109     /usr/bin/psecflags -s aslr $$
 110     /usr/bin/psecflags -s current,noexecstack -e sleep 10000 &
 111     pid=$!
 112     cat > expected <<EOF
 113         E:      aslr,noexecstack
 114         I:      aslr,noexecstack
 115 EOF
 116     /usr/bin/psecflags $pid | grep '[IE]:' > output
 117     kill $pid
 118     /usr/bin/psecflags -s none $$
 119     diff -u expected output || exit 1
 120 }
 121 
 122 child_remove() {
 123     echo "Remove (child)"
 124 
 125     typeset pid; 
 126 
 127     /usr/bin/psecflags -s aslr $$
 128     /usr/bin/psecflags -s current,-aslr -e sleep 10000 &
 129     pid=$!
 130     cat > expected <<EOF
 131         E:      none
 132         I:      none
 133 EOF
 134     /usr/bin/psecflags $pid | grep '[IE]:' > output
 135     kill $pid
 136     /usr/bin/psecflags -s none $$
 137     diff -u expected output || exit 1
 138 }
 139 
 140 child_all() {
 141     echo "All (child)"
 142 
 143     typeset pid ret
 144 
 145     /usr/bin/psecflags -s all -e sleep 10000 &
 146     pid=$!
 147     /usr/bin/psecflags $pid | grep -q 'E:.*,.*,' # This is lame, but functional
 148     ret=$?
 149     kill $pid
 150     (( $ret != 0 )) && exit $ret
 151 }
 152 
 153 child_none() {
 154     echo "None (child)"
 155 
 156     typeset pid
 157     
 158     /usr/bin/psecflags -s all $$
 159 
 160     /usr/bin/psecflags -s none -e sleep 10000 &
 161     pid=$!
 162     cat > expected <<EOF
 163         E:      none
 164         I:      none
 165 EOF
 166     /usr/bin/psecflags $pid | grep '[IE]:' > output
 167     kill $pid
 168     diff -u expected output || exit 1
 169 }
 170 
 171 list() {
 172     echo "List"
 173     cat > expected<<EOF
 174 aslr
 175 forbidnullmap
 176 noexecstack
 177 EOF
 178 
 179     /usr/bin/psecflags -l > output
 180     diff -u expected output || exit 1
 181 }
 182 
 183 self_set
 184 self_add
 185 self_remove
 186 self_all
 187 self_none
 188 child_set
 189 child_add
 190 child_remove
 191 child_all
 192 child_none
 193 list
 194 
 195 exit 0