Skip to content

Commit fc19ad7

Browse files
gh-143750: Compile OpenSSL with TSan for TSan CI (#153316)
Co-authored-by: Sam Gross <colesbury@gmail.com>
1 parent 68abf17 commit fc19ad7

2 files changed

Lines changed: 55 additions & 18 deletions

File tree

.github/workflows/reusable-san.yml

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ permissions:
1717

1818
env:
1919
FORCE_COLOR: 1
20+
OPENSSL_VER: 3.5.7
2021

2122
jobs:
2223
build-san-reusable:
@@ -38,28 +39,55 @@ jobs:
3839
run: |
3940
sudo ./.github/workflows/posix-deps-apt.sh
4041
# On ubuntu-26.04 image, clang is clang-21 by default
41-
42-
if [ "${SANITIZER}" = "TSan" ]; then
43-
# Reduce ASLR to avoid TSan crashing
44-
sudo sysctl -w vm.mmap_rnd_bits=28
45-
fi
46-
47-
- name: Sanitizer option setup
48-
run: |
49-
if [ "${SANITIZER}" = "TSan" ]; then
50-
echo "TSAN_OPTIONS=${SAN_LOG_OPTION} suppressions=${GITHUB_WORKSPACE}/Tools/tsan/suppressions${{
51-
fromJSON(inputs.free-threading)
52-
&& '_free_threading'
53-
|| ''
54-
}}.txt handle_segv=0" >> "$GITHUB_ENV"
55-
else
56-
echo "UBSAN_OPTIONS=${SAN_LOG_OPTION} halt_on_error=1 suppressions=${GITHUB_WORKSPACE}/Tools/ubsan/suppressions.txt" >> "$GITHUB_ENV"
57-
fi
5842
echo "CC=clang" >> "$GITHUB_ENV"
5943
echo "CXX=clang++" >> "$GITHUB_ENV"
44+
- name: TSan option setup
45+
if: inputs.sanitizer == 'TSan'
46+
run: |
47+
sudo sysctl -w vm.mmap_rnd_bits=28 # Reduce ASLR to avoid TSan crashing
48+
49+
echo "MULTISSL_DIR=${GITHUB_WORKSPACE}/multissl" >> "$GITHUB_ENV"
50+
echo "OPENSSL_DIR=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}" >> "$GITHUB_ENV"
51+
echo "TSAN_OPTIONS=${SAN_LOG_OPTION} suppressions=${GITHUB_WORKSPACE}/Tools/tsan/suppressions${SUPPRESSIONS_SUFFIX}.txt handle_segv=0" >> "$GITHUB_ENV"
6052
env:
61-
SANITIZER: ${{ inputs.sanitizer }}
6253
SAN_LOG_OPTION: log_path=${{ github.workspace }}/san_log
54+
SUPPRESSIONS_SUFFIX: >-
55+
${{
56+
fromJSON(inputs.free-threading)
57+
&& '_free_threading'
58+
|| ''
59+
}}
60+
- name: UBSan option setup
61+
if: inputs.sanitizer != 'TSan'
62+
run: >-
63+
echo
64+
"UBSAN_OPTIONS=${SAN_LOG_OPTION}
65+
halt_on_error=1
66+
suppressions=${GITHUB_WORKSPACE}/Tools/ubsan/suppressions.txt"
67+
>> "$GITHUB_ENV"
68+
env:
69+
SAN_LOG_OPTION: log_path=${{ github.workspace }}/san_log
70+
- name: Add ccache to PATH
71+
run: |
72+
echo "PATH=/usr/lib/ccache:$PATH" >> "$GITHUB_ENV"
73+
- name: 'Restore OpenSSL build (TSan)'
74+
id: cache-openssl
75+
if: inputs.sanitizer == 'TSan'
76+
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
77+
with:
78+
path: ./multissl/openssl/${{ env.OPENSSL_VER }}
79+
key: ${{ env.IMAGE_OS_VERSION }}-multissl-openssl-tsan-${{ env.OPENSSL_VER }}
80+
- name: Install OpenSSL (TSan)
81+
if: >-
82+
inputs.sanitizer == 'TSan'
83+
&& steps.cache-openssl.outputs.cache-hit != 'true'
84+
run: >-
85+
python3 Tools/ssl/multissltests.py
86+
--steps=library
87+
--base-directory="${MULTISSL_DIR}"
88+
--openssl="${OPENSSL_VER}"
89+
--system=Linux
90+
--tsan
6391
- name: Configure CPython
6492
run: >-
6593
./configure
@@ -70,6 +98,7 @@ jobs:
7098
|| '--with-undefined-behavior-sanitizer --with-strict-overflow'
7199
}}
72100
--with-pydebug
101+
${{ inputs.sanitizer == 'TSan' && '--with-openssl="$OPENSSL_DIR" --with-openssl-rpath=auto' || '' }}
73102
${{ fromJSON(inputs.free-threading) && '--disable-gil' || '' }}
74103
- name: Build CPython
75104
run: make -j4

Tools/ssl/multissltests.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,12 @@
163163
dest='keep_sources',
164164
help="Keep original sources for debugging."
165165
)
166+
parser.add_argument(
167+
'--tsan',
168+
action='store_true',
169+
dest='tsan',
170+
help="Build with thread sanitizer. (Disables fips in OpenSSL 3.x)."
171+
)
166172

167173

168174
class AbstractBuilder(object):
@@ -317,6 +323,8 @@ def _build_src(self, config_args=()):
317323
"""Now build openssl"""
318324
log.info("Running build in {}".format(self.build_dir))
319325
cwd = self.build_dir
326+
if self.args.tsan:
327+
config_args += ("-fsanitize=thread",)
320328
cmd = [
321329
"./config", *config_args,
322330
"shared", "--debug",

0 commit comments

Comments
 (0)