xref: /freebsd/tools/test/stress2/misc/execi386.sh (revision e0c4386e)
1#!/bin/sh
2
3#
4# Copyright (c) 2014 EMC Corp.
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15#
16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26# SUCH DAMAGE.
27#
28
29# Calling exec*(2) in a thread of a i386 binary on amd64 caused a reboot.
30# Test scenario by: Steven Chamberlain <stev..@pyro.eu.org>
31# Fixed by r266464
32
33[ `uname -p` = "amd64" ] || exit 0
34
35. ../default.cfg
36
37wd=/tmp/execi386.dir
38mkdir -p $wd
39here=`pwd`
40cd $wd
41
42cat > execi386.c <<EOF
43/* https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=743141  */
44#include <unistd.h>
45#include <pthread.h>
46
47void *
48thread_main() {
49        char *cmdline[] = { "./i386", NULL };
50
51        execve(cmdline[0], cmdline, NULL);
52
53	return (NULL);
54}
55
56int
57main() {
58        pthread_t thread;
59
60        pthread_create(&thread, NULL, thread_main, NULL);
61        pthread_join(thread, NULL);
62
63        return (0);
64}
65EOF
66
67mycc -o execi386 -Wall -Wextra -O2 -g execi386.c -lpthread || exit 1
68
69cat > i386.c <<EOF
70#include <stdio.h>
71
72int
73main(void)
74{
75	fprintf(stdout, "Hello, world\n");
76	return (0);
77}
78EOF
79
80mycc -m32 -o i386 -Wall -Wextra -O2 -g i386.c || exit 1
81
82./execi386 > /dev/null || echo FAIL
83
84cd $here
85rm -rf $wd
86exit 0
87