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 (c) 2013 Joyent, Inc. All rights reserved.
  16 #
  17 
  18 #
  19 # This test is purposefully using a 64-bit DTrace and thus 64-bit types
  20 # when compared with a 32-bit process. This test uses the userland
  21 # keyword and so the implicit copyin should access illegal memory and
  22 # thus exit.
  23 #
  24 
  25 if [ $# != 1 ]; then
  26         echo expected one argument: '<'dtrace-path'>'
  27         exit 2
  28 fi
  29 
  30 dtrace=$1
  31 t="zelda_info_t"
  32 exe="tst.chasestrings.exe"
  33 
  34 elfdump "./$exe" | grep -q '.SUNW_ctf' 
  35 if [[ $? -ne 0 ]]; then
  36         echo "CTF does not exist in $exe, that's a bug" >&2
  37         exit 1
  38 fi
  39 
  40 ./$exe &
  41 pid=$!
  42 
  43 $dtrace -64 -qs /dev/stdin <<EOF
  44 typedef struct info {
  45         char    *zi_gamename;
  46         int     zi_ndungeons;
  47         char    *zi_villain;
  48         int     zi_haszelda;
  49 } info_t;
  50 
  51 pid$pid::has_princess:entry
  52 /next == 0/
  53 {
  54         this->t = (userland info_t *)arg0;
  55         printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
  56             stringof(this->t->zi_gamename), this->t->zi_ndungeons,
  57             stringof(this->t->zi_villain), this->t->zi_haszelda);
  58         next = 1;
  59 }
  60 
  61 pid$pid::has_dungeons:entry
  62 /next == 1/
  63 {
  64         this->t = (userland info_t *)arg0;
  65         printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
  66             stringof(this->t->zi_gamename), this->t->zi_ndungeons,
  67             stringof(this->t->zi_villain), this->t->zi_haszelda);
  68         next = 2;
  69 }
  70 
  71 pid$pid::has_villain:entry
  72 /next == 2/
  73 {
  74         this->t = (userland info_t *)arg0;
  75         printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
  76             stringof(this->t->zi_gamename), this->t->zi_ndungeons,
  77             stringof(this->t->zi_villain), this->t->zi_haszelda);
  78         exit(0);
  79 }
  80 
  81 ERROR
  82 {
  83         exit(1);
  84 }
  85 EOF
  86 rc=$?
  87 
  88 kill -9 $pid
  89 
  90 exit $rc