1 #!/usr/bin/ksh
   2 #
   3 # CDDL HEADER START
   4 #
   5 # The contents of this file are subject to the terms of the
   6 # Common Development and Distribution License (the "License").
   7 # You may not use this file except in compliance with the License.
   8 #
   9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10 # or http://www.opensolaris.org/os/licensing.
  11 # See the License for the specific language governing permissions
  12 # and limitations under the License.
  13 #
  14 # When distributing Covered Code, include this CDDL HEADER in each
  15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16 # If applicable, add the following below this CDDL HEADER, with the
  17 # fields enclosed by brackets "[]" replaced with your own identifying
  18 # information: Portions Copyright [yyyy] [name of copyright owner]
  19 #
  20 # CDDL HEADER END
  21 #
  22 
  23 #
  24 # Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  25 # Use is subject to license terms.
  26 #
  27 
  28 #
  29 # This test verifies that a program that corrupts its own environment
  30 # without inducing a crash does not crash solely due to drti.o's use of
  31 # getenv(3C).
  32 #
  33 
  34 PATH=/usr/bin:/usr/sbin:$PATH
  35 
  36 if (( $# != 1 )); then
  37         print -u2 'expected one argument: <dtrace-path>'
  38         exit 2
  39 fi
  40 
  41 #
  42 # jdtrace does not implement the -h option that is required to generate
  43 # C header files.
  44 #
  45 if [[ "$1" == */jdtrace ]]; then
  46         exit 0
  47 fi
  48 
  49 dtrace="$1"
  50 startdir="$PWD"
  51 dir=$(mktemp -td drtiXXXXXX)
  52 if (( $? != 0 )); then
  53         print -u2 'Could not create safe temporary directory'
  54         exit 2
  55 fi
  56 
  57 cd "$dir"
  58 
  59 cat > Makefile <<EOF
  60 all: main
  61 
  62 main: main.o prov.o
  63         gcc -o main main.o prov.o
  64 
  65 main.o: main.c prov.h
  66         gcc -c main.c
  67 
  68 prov.h: prov.d
  69         $dtrace -h -s prov.d
  70 
  71 prov.o: prov.d main.o
  72         $dtrace -G -32 -s prov.d main.o
  73 EOF
  74 
  75 cat > prov.d <<EOF
  76 provider tester {
  77         probe entry();
  78 };
  79 EOF
  80 
  81 cat > main.c <<EOF
  82 #include <stdlib.h>
  83 #include <sys/sdt.h>
  84 #include "prov.h"
  85 
  86 int
  87 main(int argc, char **argv, char **envp)
  88 {
  89         envp[0] = (char*)0xff;
  90         TESTER_ENTRY();
  91         return 0;
  92 }
  93 EOF
  94 
  95 make > /dev/null
  96 status=$?
  97 if (( $status != 0 )) ; then
  98         print -u2 "failed to build"
  99 else
 100         ./main
 101         status=$?
 102 fi
 103 
 104 cd "$startdir"
 105 rm -rf "$dir"
 106 
 107 exit $status