blob: 7afab372f0c6c0785409791354cda08fde38ea5d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
#!/usr/bin/env bash
# Copyright 2020 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
# syz-env is a wrapper around gcr.io/syzkaller/env container,
# which includes all tools necessary to develop/test syzkaller.
# It's recommended to create an alias for this script:
#
# alias syz-env="$(go env GOPATH)/src/github.com/google/syzkaller/tools/syz-env"
#
# Then it can be used to wrap almost any make invocation as:
#
# syz-env make format
# syz-env make presubmit
# syz-env make extract SOURCEDIR=~/linux
#
# Or you may run the shell inside of the container with just syz-env.
#
# Note: this way everything runs inside of the container
# and uses all tools bundled in the container rather than host tools.
#
# Note: syz-env assumes a sudo-less Docker is installed, see:
# https://docs.docker.com/engine/install
# https://docs.docker.com/engine/install/linux-postinstall
# (Googlers see go/docker).
COMMAND=""
BUILDARGS=()
DOCKERARGS=()
if [ -n $http_proxy ]; then
BUILDARGS+=" --build-arg http_proxy=$http_proxy"
DOCKERARGS+=" --env http_proxy=$http_proxy"
fi
if [ -n $https_proxy ]; then
BUILDARGS+=" --build-arg https_proxy=$https_proxy"
DOCKERARGS+=" --env https_proxy=$https_proxy"
fi
if [ -n $no_proxy ]; then
BUILDARGS+=" --build-arg no_proxy=$no_proxy"
DOCKERARGS+=" --env no_proxy=$no_proxy"
fi
for ARG in "$@"; do
while IFS='=' read KEY VAL; do
# If we have a kernel path passed in, we mount it in the container
# at /syzkaller/kernel and fix up SOURCEDIR argument.
if [ "$KEY" == "SOURCEDIR" ]; then
DOCKERARGS+=" --volume $VAL:/syzkaller/kernel:z"
COMMAND+=" SOURCEDIR=/syzkaller/kernel"
else
COMMAND+=" $ARG"
fi
done <<< "$ARG"
done
if [ "$CI" == "" ]; then
# This gives interactive shell and allows to abort commands with Ctrl+C.
DOCKERARGS+=" -it"
fi
if [ "$COMMAND" == "" ]; then
COMMAND="bash"
fi
SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P)"
IMAGE="env"
if [ "$(basename -- "$0")" == "syz-old-env" ]; then
IMAGE="old-env"
fi
# If we're running rootless docker, files owned by the host user appear within the
# container as being owned by root.
#
# If we're running regular rootful docker, we need to specify --user, as otherwise
# processes within the container will create files with the wrong ownership.
if [ ! "$(docker info -f "{{println .SecurityOptions}}" | grep rootless)" ]; then
DOCKERARGS+=" --user $(id -u ${USER}):$(id -g ${USER})"
fi
# Build or update docker image
if [ ! -z "$SYZ_ENV_BUILD" ]; then
IMAGE_NAME="syz-$IMAGE"
docker build "$SCRIPT_DIR/docker/$IMAGE" --tag "$IMAGE_NAME" ${BUILDARGS[@]}
else
IMAGE_NAME="gcr.io/syzkaller/$IMAGE"
docker pull -q "$IMAGE_NAME"
fi
# Run everything as the host user, this is important for created/modified files.
docker run \
--rm \
--volume "$SCRIPT_DIR/..:/syzkaller/gopath/src/github.com/google/syzkaller:z" \
--volume "$HOME/.cache:/syzkaller/.cache:z" \
--volume "/var/run/docker.sock":"/var/run/docker.sock" \
--workdir /syzkaller/gopath/src/github.com/google/syzkaller \
--env HOME=/syzkaller \
--env GOPATH=/syzkaller/gopath:/gopath \
--env GOPROXY \
--env FUZZIT_API_KEY \
--env GITHUB_REF \
--env GITHUB_SHA \
--env GITHUB_PR_HEAD_SHA \
--env GITHUB_PR_BASE_SHA \
--env GITHUB_PR_COMMITS \
--env CI \
${DOCKERARGS[@]} \
"$IMAGE_NAME" -c "$COMMAND"
|