diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 075286e51f9a6312927756af4357ad251062f717_LmdpdGxhYi1jaS55bWw=..9001c7f5542b7f9c44b14bb179167440fd5dbbef_LmdpdGxhYi1jaS55bWw= 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -24,7 +24,9 @@
 
 clang:asan:
   extends: .test
+  tags:
+    - asan
   variables:
     CONFIG: "--without-python"
     CC: clang
     CFLAGS: "-O2 -g -fno-omit-frame-pointer -fsanitize=address,undefined,unsigned-integer-overflow,implicit-conversion -fno-sanitize-recover=all -Wno-error=cast-align"
@@ -27,7 +29,5 @@
   variables:
     CONFIG: "--without-python"
     CC: clang
     CFLAGS: "-O2 -g -fno-omit-frame-pointer -fsanitize=address,undefined,unsigned-integer-overflow,implicit-conversion -fno-sanitize-recover=all -Wno-error=cast-align"
-    # LeakSanitizer requires SYS_CAP_PTRACE
-    ASAN_OPTIONS: "detect_leaks=0"
     UBSAN_OPTIONS: "print_stacktrace=1"
@@ -33,2 +33,3 @@
     UBSAN_OPTIONS: "print_stacktrace=1"
+    ASAN_SYMBOLIZER_PATH: "$CI_PROJECT_DIR/.gitlab-ci/llvm-symbolizer"
 
@@ -34,4 +35,3 @@
 
-# Disabled, MSan seems broken on Ubntu 22.04
-.clang:msan:
+clang:msan:
   extends: .test
@@ -37,6 +37,4 @@
   extends: .test
-  only:
-    - schedules
   variables:
     CONFIG: "--without-python --without-zlib --without-lzma --without-crypto"
     CC: clang
@@ -40,7 +38,8 @@
   variables:
     CONFIG: "--without-python --without-zlib --without-lzma --without-crypto"
     CC: clang
-    CFLAGS: "-O2 -g -fno-omit-frame-pointer -fsanitize=memory -Wimplicit-int-conversion -Wno-error=cast-align"
+    CFLAGS: "-O2 -g -fno-omit-frame-pointer -fsanitize=memory -Wno-error=cast-align"
+    MSAN_SYMBOLIZER_PATH: "$CI_PROJECT_DIR/.gitlab-ci/llvm-symbolizer"
 
 .mingw:
   tags:
diff --git a/.gitlab-ci/llvm-symbolizer b/.gitlab-ci/llvm-symbolizer
new file mode 100755
index 0000000000000000000000000000000000000000..9001c7f5542b7f9c44b14bb179167440fd5dbbef_LmdpdGxhYi1jaS9sbHZtLXN5bWJvbGl6ZXI=
--- /dev/null
+++ b/.gitlab-ci/llvm-symbolizer
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+# Newer versions of llvm-symbolizer require libxml2 themselves. Running
+# a test program with LD_LIBRARY_PATH set to .libs makes llvm-symbolizer
+# pick up the tested development version of libxml2 which breaks
+# completely if the build is instrumented with ASan. This wrapper script
+# invokes llvm-symbolizer with an empty LD_LIBRARY_PATH.
+
+LD_LIBRARY_PATH='' llvm-symbolizer "$@"