Skip to content

Commit 555ecce

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

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:
@@ -45,28 +46,55 @@ jobs:
4546
sudo update-alternatives --set clang /usr/bin/clang-21
4647
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-21 100
4748
sudo update-alternatives --set clang++ /usr/bin/clang++-21
48-
49-
if [ "${SANITIZER}" = "TSan" ]; then
50-
# Reduce ASLR to avoid TSan crashing
51-
sudo sysctl -w vm.mmap_rnd_bits=28
52-
fi
53-
54-
- name: Sanitizer option setup
55-
run: |
56-
if [ "${SANITIZER}" = "TSan" ]; then
57-
echo "TSAN_OPTIONS=${SAN_LOG_OPTION} suppressions=${GITHUB_WORKSPACE}/Tools/tsan/suppressions${{
58-
fromJSON(inputs.free-threading)
59-
&& '_free_threading'
60-
|| ''
61-
}}.txt handle_segv=0" >> "$GITHUB_ENV"
62-
else
63-
echo "UBSAN_OPTIONS=${SAN_LOG_OPTION} halt_on_error=1 suppressions=${GITHUB_WORKSPACE}/Tools/ubsan/suppressions.txt" >> "$GITHUB_ENV"
64-
fi
6549
echo "CC=clang" >> "$GITHUB_ENV"
6650
echo "CXX=clang++" >> "$GITHUB_ENV"
51+
- name: TSan option setup
52+
if: inputs.sanitizer == 'TSan'
53+
run: |
54+
sudo sysctl -w vm.mmap_rnd_bits=28 # Reduce ASLR to avoid TSan crashing
55+
56+
echo "MULTISSL_DIR=${GITHUB_WORKSPACE}/multissl" >> "$GITHUB_ENV"
57+
echo "OPENSSL_DIR=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}" >> "$GITHUB_ENV"
58+
echo "TSAN_OPTIONS=${SAN_LOG_OPTION} suppressions=${GITHUB_WORKSPACE}/Tools/tsan/suppressions${SUPPRESSIONS_SUFFIX}.txt handle_segv=0" >> "$GITHUB_ENV"
6759
env:
68-
SANITIZER: ${{ inputs.sanitizer }}
6960
SAN_LOG_OPTION: log_path=${{ github.workspace }}/san_log
61+
SUPPRESSIONS_SUFFIX: >-
62+
${{
63+
fromJSON(inputs.free-threading)
64+
&& '_free_threading'
65+
|| ''
66+
}}
67+
- name: UBSan option setup
68+
if: inputs.sanitizer != 'TSan'
69+
run: >-
70+
echo
71+
"UBSAN_OPTIONS=${SAN_LOG_OPTION}
72+
halt_on_error=1
73+
suppressions=${GITHUB_WORKSPACE}/Tools/ubsan/suppressions.txt"
74+
>> "$GITHUB_ENV"
75+
env:
76+
SAN_LOG_OPTION: log_path=${{ github.workspace }}/san_log
77+
- name: Add ccache to PATH
78+
run: |
79+
echo "PATH=/usr/lib/ccache:$PATH" >> "$GITHUB_ENV"
80+
- name: 'Restore OpenSSL build (TSan)'
81+
id: cache-openssl
82+
if: inputs.sanitizer == 'TSan'
83+
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
84+
with:
85+
path: ./multissl/openssl/${{ env.OPENSSL_VER }}
86+
key: ${{ env.IMAGE_OS_VERSION }}-multissl-openssl-tsan-${{ env.OPENSSL_VER }}
87+
- name: Install OpenSSL (TSan)
88+
if: >-
89+
inputs.sanitizer == 'TSan'
90+
&& steps.cache-openssl.outputs.cache-hit != 'true'
91+
run: >-
92+
python3 Tools/ssl/multissltests.py
93+
--steps=library
94+
--base-directory="${MULTISSL_DIR}"
95+
--openssl="${OPENSSL_VER}"
96+
--system=Linux
97+
--tsan
7098
- name: Configure CPython
7199
run: >-
72100
./configure
@@ -77,6 +105,7 @@ jobs:
77105
|| '--with-undefined-behavior-sanitizer --with-strict-overflow'
78106
}}
79107
--with-pydebug
108+
${{ inputs.sanitizer == 'TSan' && '--with-openssl="$OPENSSL_DIR" --with-openssl-rpath=auto' || '' }}
80109
${{ fromJSON(inputs.free-threading) && '--disable-gil' || '' }}
81110
- name: Build CPython
82111
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)