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 # Copyright 2015, Richald Lowe.
  15 
  16 # Verify that aslr musses things up, by comparing the mappings of 2 identical processes
  17 
  18 LC_ALL=C                        # Collation is important
  19 
  20 /usr/bin/psecflags -s aslr $$
  21 
  22 tmpdir=/tmp/test.$$
  23 
  24 mkdir $tmpdir
  25 cd $tmpdir
  26 
  27 cleanup() {
  28     cd /
  29     rm -fr $tmpdir
  30 }
  31 
  32 trap 'cleanup' EXIT
  33 
  34 check() {
  35     typeset name=$1
  36     typeset command=$2
  37     
  38     for (( i=0; i < 1000; i++ )); do
  39         $command > out.$i
  40     done
  41 
  42     cat out.* | sort | uniq -c | sort -nk 1 | nawk '
  43         BEGIN { 
  44                 tot = 0
  45                 colls = 0
  46         }
  47 
  48         $2 != "text:" {
  49                 tot += $1
  50                 if ($1 > 1) {
  51                         colls += $1
  52                 }
  53         }
  54 
  55         END {
  56                 prc = (colls / tot) * 100
  57                 printf "'$name' Collisions: %d/%d (%g%%)\n", colls, tot, prc
  58                 exit prc
  59         }
  60 '
  61     return $?
  62 }
  63 
  64 # Somewhat arbitrary
  65 ACCEPTABLE=70
  66 
  67 ret=0
  68 check 32bit /opt/os-tests/tests/secflags/addrs-32
  69 (( $? > $ACCEPTABLE )) && ret=1
  70 check 64bit /opt/os-tests/tests/secflags/addrs-64
  71 (( $? > $ACCEPTABLE )) && ret=1
  72 
  73 exit $ret