From ab43aa927d5ba5a7ec80bc04683ca04aa941278b Mon Sep 17 00:00:00 2001 From: Eric Lundby Date: Wed, 10 Jun 2026 10:56:44 -0600 Subject: [PATCH 01/11] Debugging --- recipe/meta.yaml | 5 + recipe/patches/0015-Doing-d1trimfile.patch | 520 +++++++++--------- recipe/patches/0021-Unvendor-libffi.patch | 38 +- ...-DER-EOF-detection-for-openssl-3.5.7.patch | 68 +++ ...s-fielddesc-init-for-external-libffi.patch | 272 +++++++++ 5 files changed, 628 insertions(+), 275 deletions(-) create mode 100644 recipe/patches/0028-Fix-ssl-DER-EOF-detection-for-openssl-3.5.7.patch create mode 100644 recipe/patches/0029-Fix-ctypes-fielddesc-init-for-external-libffi.patch diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 0e1e20b8f..122f118c1 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -79,6 +79,7 @@ source: # https://github.com/pypa/distutils/pull/53 - patches/0019-Fix-LDSHARED-when-CC-is-overriden-on-Linux-too.patch - patches/0020-Unvendor-bzip2.patch + # also sets USING_MALLOC_CLOSURE_DOT_C=1 on _ctypes.vcxproj (gh-29791) - patches/0021-Unvendor-libffi.patch - patches/0022-Unvendor-tcltk.patch - patches/0023-unvendor-xz.patch @@ -88,6 +89,10 @@ source: - patches/0026-Use-OpenSSL-3-instead-of-1_1.patch {% endif %} - patches/0027-Unvendor-expat.patch + # https://github.com/python/cpython/pull/100373 (OpenSSL 3.5.7 Windows cert-store fix) + - patches/0028-Fix-ssl-DER-EOF-detection-for-openssl-3.5.7.patch + # https://github.com/python/cpython/pull/29791 + - patches/0029-Fix-ctypes-fielddesc-init-for-external-libffi.patch build: number: {{ build_number }} diff --git a/recipe/patches/0015-Doing-d1trimfile.patch b/recipe/patches/0015-Doing-d1trimfile.patch index 63da3e253..6d098f9a7 100644 --- a/recipe/patches/0015-Doing-d1trimfile.patch +++ b/recipe/patches/0015-Doing-d1trimfile.patch @@ -1,58 +1,58 @@ -From 7df56c01f83fa3524b7c2045388458fc32146c4b Mon Sep 17 00:00:00 2001 -From: Ray Donnelly -Date: Tue, 31 Dec 2019 21:47:47 +0100 -Subject: [PATCH 15/25] Doing d1trimfile - ---- - PCbuild/_asyncio.vcxproj | 20 ++++++++++++++++++++ - PCbuild/_bz2.vcxproj | 4 ++++ - PCbuild/_ctypes.vcxproj | 4 ++++ - PCbuild/_ctypes_test.vcxproj | 20 ++++++++++++++++++++ - PCbuild/_decimal.vcxproj | 4 ++++ - PCbuild/_elementtree.vcxproj | 4 ++++ - PCbuild/_freeze_importlib.vcxproj | 4 ++++ - PCbuild/_hashlib.vcxproj | 12 ++++++++++++ - PCbuild/_lzma.vcxproj | 4 ++++ - PCbuild/_msi.vcxproj | 12 ++++++++++++ - PCbuild/_multiprocessing.vcxproj | 12 ++++++++++++ - PCbuild/_overlapped.vcxproj | 12 ++++++++++++ - PCbuild/_queue.vcxproj | 20 ++++++++++++++++++++ - PCbuild/_socket.vcxproj | 12 ++++++++++++ - PCbuild/_sqlite3.vcxproj | 4 ++++ - PCbuild/_ssl.vcxproj | 12 ++++++++++++ - PCbuild/_testbuffer.vcxproj | 20 ++++++++++++++++++++ - PCbuild/_testcapi.vcxproj | 20 ++++++++++++++++++++ - PCbuild/_testconsole.vcxproj | 4 ++++ - PCbuild/_testembed.vcxproj | 4 ++++ - PCbuild/_testimportmultiple.vcxproj | 20 ++++++++++++++++++++ - PCbuild/_testinternalcapi.vcxproj | 20 ++++++++++++++++++++ - PCbuild/_testmultiphase.vcxproj | 4 ++++ - PCbuild/_tkinter.vcxproj | 4 ++++ - PCbuild/liblzma.vcxproj | 4 ++++ - PCbuild/pyexpat.vcxproj | 4 ++++ - PCbuild/pylauncher.vcxproj | 4 ++++ - PCbuild/pyshellext.vcxproj | 4 ++++ - PCbuild/python.vcxproj | 4 ++++ - PCbuild/python3dll.vcxproj | 4 ++++ - PCbuild/python_uwp.vcxproj | 2 +- - PCbuild/pythoncore.vcxproj | 2 +- - PCbuild/pythonw.vcxproj | 12 ++++++++++++ - PCbuild/pythonw_uwp.vcxproj | 2 +- - PCbuild/pywlauncher.vcxproj | 4 ++++ - PCbuild/select.vcxproj | 12 ++++++++++++ - PCbuild/unicodedata.vcxproj | 20 ++++++++++++++++++++ - PCbuild/venvlauncher.vcxproj | 4 ++++ - PCbuild/venvwlauncher.vcxproj | 4 ++++ - PCbuild/winsound.vcxproj | 12 ++++++++++++ - PCbuild/xxlimited.vcxproj | 6 ++++++ - PCbuild/xxlimited_35.vcxproj | 6 ++++++ - 42 files changed, 363 insertions(+), 3 deletions(-) - -diff --git a/PCbuild/_asyncio.vcxproj b/PCbuild/_asyncio.vcxproj -index ed1e1bc0a4..47d322be5f 100644 ---- a/PCbuild/_asyncio.vcxproj -+++ b/PCbuild/_asyncio.vcxproj -@@ -91,6 +91,26 @@ +From 7df56c01f83fa3524b7c2045388458fc32146c4b Mon Sep 17 00:00:00 2001 +From: Ray Donnelly +Date: Tue, 31 Dec 2019 21:47:47 +0100 +Subject: [PATCH 15/25] Doing d1trimfile + +--- + PCbuild/_asyncio.vcxproj | 20 ++++++++++++++++++++ + PCbuild/_bz2.vcxproj | 4 ++++ + PCbuild/_ctypes.vcxproj | 4 ++++ + PCbuild/_ctypes_test.vcxproj | 20 ++++++++++++++++++++ + PCbuild/_decimal.vcxproj | 4 ++++ + PCbuild/_elementtree.vcxproj | 4 ++++ + PCbuild/_freeze_importlib.vcxproj | 4 ++++ + PCbuild/_hashlib.vcxproj | 12 ++++++++++++ + PCbuild/_lzma.vcxproj | 4 ++++ + PCbuild/_msi.vcxproj | 12 ++++++++++++ + PCbuild/_multiprocessing.vcxproj | 12 ++++++++++++ + PCbuild/_overlapped.vcxproj | 12 ++++++++++++ + PCbuild/_queue.vcxproj | 20 ++++++++++++++++++++ + PCbuild/_socket.vcxproj | 12 ++++++++++++ + PCbuild/_sqlite3.vcxproj | 4 ++++ + PCbuild/_ssl.vcxproj | 12 ++++++++++++ + PCbuild/_testbuffer.vcxproj | 20 ++++++++++++++++++++ + PCbuild/_testcapi.vcxproj | 20 ++++++++++++++++++++ + PCbuild/_testconsole.vcxproj | 4 ++++ + PCbuild/_testembed.vcxproj | 4 ++++ + PCbuild/_testimportmultiple.vcxproj | 20 ++++++++++++++++++++ + PCbuild/_testinternalcapi.vcxproj | 20 ++++++++++++++++++++ + PCbuild/_testmultiphase.vcxproj | 4 ++++ + PCbuild/_tkinter.vcxproj | 4 ++++ + PCbuild/liblzma.vcxproj | 4 ++++ + PCbuild/pyexpat.vcxproj | 4 ++++ + PCbuild/pylauncher.vcxproj | 4 ++++ + PCbuild/pyshellext.vcxproj | 4 ++++ + PCbuild/python.vcxproj | 4 ++++ + PCbuild/python3dll.vcxproj | 4 ++++ + PCbuild/python_uwp.vcxproj | 2 +- + PCbuild/pythoncore.vcxproj | 2 +- + PCbuild/pythonw.vcxproj | 12 ++++++++++++ + PCbuild/pythonw_uwp.vcxproj | 2 +- + PCbuild/pywlauncher.vcxproj | 4 ++++ + PCbuild/select.vcxproj | 12 ++++++++++++ + PCbuild/unicodedata.vcxproj | 20 ++++++++++++++++++++ + PCbuild/venvlauncher.vcxproj | 4 ++++ + PCbuild/venvwlauncher.vcxproj | 4 ++++ + PCbuild/winsound.vcxproj | 12 ++++++++++++ + PCbuild/xxlimited.vcxproj | 6 ++++++ + PCbuild/xxlimited_35.vcxproj | 6 ++++++ + 42 files changed, 363 insertions(+), 3 deletions(-) + +diff --git a/PCbuild/_asyncio.vcxproj b/PCbuild/_asyncio.vcxproj +index ed1e1bc0a4..47d322be5f 100644 +--- a/PCbuild/_asyncio.vcxproj ++++ b/PCbuild/_asyncio.vcxproj +@@ -91,6 +91,26 @@ <_ProjectFileVersion>10.0.30319.1 @@ -79,11 +79,11 @@ index ed1e1bc0a4..47d322be5f 100644 -diff --git a/PCbuild/_bz2.vcxproj b/PCbuild/_bz2.vcxproj -index 3fe95fbf83..0402f7a9aa 100644 ---- a/PCbuild/_bz2.vcxproj -+++ b/PCbuild/_bz2.vcxproj -@@ -97,6 +97,10 @@ +diff --git a/PCbuild/_bz2.vcxproj b/PCbuild/_bz2.vcxproj +index 3fe95fbf83..0402f7a9aa 100644 +--- a/PCbuild/_bz2.vcxproj ++++ b/PCbuild/_bz2.vcxproj +@@ -97,6 +97,10 @@ $(bz2Dir);%(AdditionalIncludeDirectories) WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) 4244;4267;%(DisableSpecificWarnings) @@ -94,11 +94,11 @@ index 3fe95fbf83..0402f7a9aa 100644 -diff --git a/PCbuild/_ctypes.vcxproj b/PCbuild/_ctypes.vcxproj -index 69e4271a9b..f28002d190 100644 ---- a/PCbuild/_ctypes.vcxproj -+++ b/PCbuild/_ctypes.vcxproj -@@ -95,6 +95,10 @@ +diff --git a/PCbuild/_ctypes.vcxproj b/PCbuild/_ctypes.vcxproj +index 69e4271a9b..f28002d190 100644 +--- a/PCbuild/_ctypes.vcxproj ++++ b/PCbuild/_ctypes.vcxproj +@@ -95,6 +95,10 @@ FFI_BUILDING;%(PreprocessorDefinitions) @@ -109,11 +109,11 @@ index 69e4271a9b..f28002d190 100644 /EXPORT:DllGetClassObject,PRIVATE /EXPORT:DllCanUnloadNow,PRIVATE %(AdditionalOptions) -diff --git a/PCbuild/_ctypes_test.vcxproj b/PCbuild/_ctypes_test.vcxproj -index 8a01e743a4..1ad658d5f9 100644 ---- a/PCbuild/_ctypes_test.vcxproj -+++ b/PCbuild/_ctypes_test.vcxproj -@@ -92,6 +92,26 @@ +diff --git a/PCbuild/_ctypes_test.vcxproj b/PCbuild/_ctypes_test.vcxproj +index 8a01e743a4..1ad658d5f9 100644 +--- a/PCbuild/_ctypes_test.vcxproj ++++ b/PCbuild/_ctypes_test.vcxproj +@@ -92,6 +92,26 @@ <_ProjectFileVersion>10.0.30319.1 @@ -140,11 +140,11 @@ index 8a01e743a4..1ad658d5f9 100644 -diff --git a/PCbuild/_decimal.vcxproj b/PCbuild/_decimal.vcxproj -index 0916f1a2d3..17a4cbfcd7 100644 ---- a/PCbuild/_decimal.vcxproj -+++ b/PCbuild/_decimal.vcxproj -@@ -99,6 +99,10 @@ +diff --git a/PCbuild/_decimal.vcxproj b/PCbuild/_decimal.vcxproj +index 0916f1a2d3..17a4cbfcd7 100644 +--- a/PCbuild/_decimal.vcxproj ++++ b/PCbuild/_decimal.vcxproj +@@ -99,6 +99,10 @@ CONFIG_64;ANSI;%(PreprocessorDefinitions) CONFIG_64;MASM;%(PreprocessorDefinitions) ..\Modules\_decimal;..\Modules\_decimal\libmpdec;%(AdditionalIncludeDirectories) @@ -155,11 +155,11 @@ index 0916f1a2d3..17a4cbfcd7 100644 -diff --git a/PCbuild/_elementtree.vcxproj b/PCbuild/_elementtree.vcxproj -index 4a125b243b..20cc09d63f 100644 ---- a/PCbuild/_elementtree.vcxproj -+++ b/PCbuild/_elementtree.vcxproj -@@ -95,6 +95,10 @@ +diff --git a/PCbuild/_elementtree.vcxproj b/PCbuild/_elementtree.vcxproj +index 4a125b243b..20cc09d63f 100644 +--- a/PCbuild/_elementtree.vcxproj ++++ b/PCbuild/_elementtree.vcxproj +@@ -95,6 +95,10 @@ ..\Modules\expat;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;USE_PYEXPAT_CAPI;XML_STATIC;%(PreprocessorDefinitions) @@ -170,11 +170,11 @@ index 4a125b243b..20cc09d63f 100644 -diff --git a/PCbuild/_freeze_importlib.vcxproj b/PCbuild/_freeze_importlib.vcxproj -index e437412a16..c4d5886b9f 100644 ---- a/PCbuild/_freeze_importlib.vcxproj -+++ b/PCbuild/_freeze_importlib.vcxproj -@@ -89,6 +89,10 @@ +diff --git a/PCbuild/_freeze_importlib.vcxproj b/PCbuild/_freeze_importlib.vcxproj +index e437412a16..c4d5886b9f 100644 +--- a/PCbuild/_freeze_importlib.vcxproj ++++ b/PCbuild/_freeze_importlib.vcxproj +@@ -89,6 +89,10 @@ _CONSOLE;%(PreprocessorDefinitions) @@ -185,11 +185,11 @@ index e437412a16..c4d5886b9f 100644 Console -diff --git a/PCbuild/_hashlib.vcxproj b/PCbuild/_hashlib.vcxproj -index 6dad8183c5..6d3d37fdf9 100644 ---- a/PCbuild/_hashlib.vcxproj -+++ b/PCbuild/_hashlib.vcxproj -@@ -96,6 +96,18 @@ +diff --git a/PCbuild/_hashlib.vcxproj b/PCbuild/_hashlib.vcxproj +index 6dad8183c5..6d3d37fdf9 100644 +--- a/PCbuild/_hashlib.vcxproj ++++ b/PCbuild/_hashlib.vcxproj +@@ -96,6 +96,18 @@ ws2_32.lib;%(AdditionalDependencies) @@ -208,11 +208,11 @@ index 6dad8183c5..6d3d37fdf9 100644 -diff --git a/PCbuild/_lzma.vcxproj b/PCbuild/_lzma.vcxproj -index fe076a6fc5..0565132363 100644 ---- a/PCbuild/_lzma.vcxproj -+++ b/PCbuild/_lzma.vcxproj -@@ -95,6 +95,10 @@ +diff --git a/PCbuild/_lzma.vcxproj b/PCbuild/_lzma.vcxproj +index fe076a6fc5..0565132363 100644 +--- a/PCbuild/_lzma.vcxproj ++++ b/PCbuild/_lzma.vcxproj +@@ -95,6 +95,10 @@ $(lzmaDir)src/liblzma/api;%(AdditionalIncludeDirectories) WIN32;_FILE_OFFSET_BITS=64;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;LZMA_API_STATIC;%(PreprocessorDefinitions) @@ -223,11 +223,11 @@ index fe076a6fc5..0565132363 100644 $(OutDir)liblzma$(PyDebugExt).lib;%(AdditionalDependencies) -diff --git a/PCbuild/_msi.vcxproj b/PCbuild/_msi.vcxproj -index 720eb2931b..247ab0e915 100644 ---- a/PCbuild/_msi.vcxproj -+++ b/PCbuild/_msi.vcxproj -@@ -96,6 +96,18 @@ +diff --git a/PCbuild/_msi.vcxproj b/PCbuild/_msi.vcxproj +index 720eb2931b..247ab0e915 100644 +--- a/PCbuild/_msi.vcxproj ++++ b/PCbuild/_msi.vcxproj +@@ -96,6 +96,18 @@ cabinet.lib;msi.lib;rpcrt4.lib;%(AdditionalDependencies) @@ -246,11 +246,11 @@ index 720eb2931b..247ab0e915 100644 -diff --git a/PCbuild/_multiprocessing.vcxproj b/PCbuild/_multiprocessing.vcxproj -index 77b6bfc8e1..3c2b651549 100644 ---- a/PCbuild/_multiprocessing.vcxproj -+++ b/PCbuild/_multiprocessing.vcxproj -@@ -95,6 +95,18 @@ +diff --git a/PCbuild/_multiprocessing.vcxproj b/PCbuild/_multiprocessing.vcxproj +index 77b6bfc8e1..3c2b651549 100644 +--- a/PCbuild/_multiprocessing.vcxproj ++++ b/PCbuild/_multiprocessing.vcxproj +@@ -95,6 +95,18 @@ ws2_32.lib;%(AdditionalDependencies) @@ -269,11 +269,11 @@ index 77b6bfc8e1..3c2b651549 100644 -diff --git a/PCbuild/_overlapped.vcxproj b/PCbuild/_overlapped.vcxproj -index 9e60d3b5db..95b57290f8 100644 ---- a/PCbuild/_overlapped.vcxproj -+++ b/PCbuild/_overlapped.vcxproj -@@ -95,6 +95,18 @@ +diff --git a/PCbuild/_overlapped.vcxproj b/PCbuild/_overlapped.vcxproj +index 9e60d3b5db..95b57290f8 100644 +--- a/PCbuild/_overlapped.vcxproj ++++ b/PCbuild/_overlapped.vcxproj +@@ -95,6 +95,18 @@ ws2_32.lib;%(AdditionalDependencies) @@ -292,11 +292,11 @@ index 9e60d3b5db..95b57290f8 100644 -diff --git a/PCbuild/_queue.vcxproj b/PCbuild/_queue.vcxproj -index 8065b23585..e46ab5a83b 100644 ---- a/PCbuild/_queue.vcxproj -+++ b/PCbuild/_queue.vcxproj -@@ -91,6 +91,26 @@ +diff --git a/PCbuild/_queue.vcxproj b/PCbuild/_queue.vcxproj +index 8065b23585..e46ab5a83b 100644 +--- a/PCbuild/_queue.vcxproj ++++ b/PCbuild/_queue.vcxproj +@@ -91,6 +91,26 @@ <_ProjectFileVersion>10.0.30319.1 @@ -323,11 +323,11 @@ index 8065b23585..e46ab5a83b 100644 -diff --git a/PCbuild/_socket.vcxproj b/PCbuild/_socket.vcxproj -index 8fd75f90e7..b403828291 100644 ---- a/PCbuild/_socket.vcxproj -+++ b/PCbuild/_socket.vcxproj -@@ -95,6 +95,18 @@ +diff --git a/PCbuild/_socket.vcxproj b/PCbuild/_socket.vcxproj +index 8fd75f90e7..b403828291 100644 +--- a/PCbuild/_socket.vcxproj ++++ b/PCbuild/_socket.vcxproj +@@ -95,6 +95,18 @@ ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies) @@ -346,11 +346,11 @@ index 8fd75f90e7..b403828291 100644 -diff --git a/PCbuild/_sqlite3.vcxproj b/PCbuild/_sqlite3.vcxproj -index fcdee1be60..ec2680955f 100644 ---- a/PCbuild/_sqlite3.vcxproj -+++ b/PCbuild/_sqlite3.vcxproj -@@ -94,6 +94,10 @@ +diff --git a/PCbuild/_sqlite3.vcxproj b/PCbuild/_sqlite3.vcxproj +index fcdee1be60..ec2680955f 100644 +--- a/PCbuild/_sqlite3.vcxproj ++++ b/PCbuild/_sqlite3.vcxproj +@@ -94,6 +94,10 @@ $(condaDir)\include;%(AdditionalIncludeDirectories) @@ -361,11 +361,11 @@ index fcdee1be60..ec2680955f 100644 $(condaDir)\lib\sqlite3.lib;%(AdditionalDependencies) -diff --git a/PCbuild/_ssl.vcxproj b/PCbuild/_ssl.vcxproj -index b2c23d5e8c..ebe4e88848 100644 ---- a/PCbuild/_ssl.vcxproj -+++ b/PCbuild/_ssl.vcxproj -@@ -96,6 +96,18 @@ +diff --git a/PCbuild/_ssl.vcxproj b/PCbuild/_ssl.vcxproj +index b2c23d5e8c..ebe4e88848 100644 +--- a/PCbuild/_ssl.vcxproj ++++ b/PCbuild/_ssl.vcxproj +@@ -96,6 +96,18 @@ ws2_32.lib;crypt32.lib;%(AdditionalDependencies) @@ -384,11 +384,11 @@ index b2c23d5e8c..ebe4e88848 100644 -diff --git a/PCbuild/_testbuffer.vcxproj b/PCbuild/_testbuffer.vcxproj -index 917d7ae50f..8c7e141eea 100644 ---- a/PCbuild/_testbuffer.vcxproj -+++ b/PCbuild/_testbuffer.vcxproj -@@ -92,6 +92,26 @@ +diff --git a/PCbuild/_testbuffer.vcxproj b/PCbuild/_testbuffer.vcxproj +index 917d7ae50f..8c7e141eea 100644 +--- a/PCbuild/_testbuffer.vcxproj ++++ b/PCbuild/_testbuffer.vcxproj +@@ -92,6 +92,26 @@ <_ProjectFileVersion>10.0.40219.1 @@ -415,11 +415,11 @@ index 917d7ae50f..8c7e141eea 100644 -diff --git a/PCbuild/_testcapi.vcxproj b/PCbuild/_testcapi.vcxproj -index c1a1943725..99ee2f4a41 100644 ---- a/PCbuild/_testcapi.vcxproj -+++ b/PCbuild/_testcapi.vcxproj -@@ -92,6 +92,26 @@ +diff --git a/PCbuild/_testcapi.vcxproj b/PCbuild/_testcapi.vcxproj +index c1a1943725..99ee2f4a41 100644 +--- a/PCbuild/_testcapi.vcxproj ++++ b/PCbuild/_testcapi.vcxproj +@@ -92,6 +92,26 @@ <_ProjectFileVersion>10.0.30319.1 @@ -446,11 +446,11 @@ index c1a1943725..99ee2f4a41 100644 -diff --git a/PCbuild/_testconsole.vcxproj b/PCbuild/_testconsole.vcxproj -index 5d7e14eff1..695dcb3b91 100644 ---- a/PCbuild/_testconsole.vcxproj -+++ b/PCbuild/_testconsole.vcxproj -@@ -92,6 +92,10 @@ +diff --git a/PCbuild/_testconsole.vcxproj b/PCbuild/_testconsole.vcxproj +index 5d7e14eff1..695dcb3b91 100644 +--- a/PCbuild/_testconsole.vcxproj ++++ b/PCbuild/_testconsole.vcxproj +@@ -92,6 +92,10 @@ _CONSOLE;%(PreprocessorDefinitions) @@ -461,11 +461,11 @@ index 5d7e14eff1..695dcb3b91 100644 Console -diff --git a/PCbuild/_testembed.vcxproj b/PCbuild/_testembed.vcxproj -index a7ea8787e0..eab72171e3 100644 ---- a/PCbuild/_testembed.vcxproj -+++ b/PCbuild/_testembed.vcxproj -@@ -89,6 +89,10 @@ +diff --git a/PCbuild/_testembed.vcxproj b/PCbuild/_testembed.vcxproj +index a7ea8787e0..eab72171e3 100644 +--- a/PCbuild/_testembed.vcxproj ++++ b/PCbuild/_testembed.vcxproj +@@ -89,6 +89,10 @@ _CONSOLE;%(PreprocessorDefinitions) @@ -476,11 +476,11 @@ index a7ea8787e0..eab72171e3 100644 Console -diff --git a/PCbuild/_testimportmultiple.vcxproj b/PCbuild/_testimportmultiple.vcxproj -index 6d80d5779f..951bf40e7c 100644 ---- a/PCbuild/_testimportmultiple.vcxproj -+++ b/PCbuild/_testimportmultiple.vcxproj -@@ -92,6 +92,26 @@ +diff --git a/PCbuild/_testimportmultiple.vcxproj b/PCbuild/_testimportmultiple.vcxproj +index 6d80d5779f..951bf40e7c 100644 +--- a/PCbuild/_testimportmultiple.vcxproj ++++ b/PCbuild/_testimportmultiple.vcxproj +@@ -92,6 +92,26 @@ <_ProjectFileVersion>10.0.30319.1 @@ -507,11 +507,11 @@ index 6d80d5779f..951bf40e7c 100644 -diff --git a/PCbuild/_testinternalcapi.vcxproj b/PCbuild/_testinternalcapi.vcxproj -index 6c5b12cd40..d25c774913 100644 ---- a/PCbuild/_testinternalcapi.vcxproj -+++ b/PCbuild/_testinternalcapi.vcxproj -@@ -92,6 +92,26 @@ +diff --git a/PCbuild/_testinternalcapi.vcxproj b/PCbuild/_testinternalcapi.vcxproj +index 6c5b12cd40..d25c774913 100644 +--- a/PCbuild/_testinternalcapi.vcxproj ++++ b/PCbuild/_testinternalcapi.vcxproj +@@ -92,6 +92,26 @@ <_ProjectFileVersion>10.0.30319.1 @@ -538,11 +538,11 @@ index 6c5b12cd40..d25c774913 100644 -diff --git a/PCbuild/_testmultiphase.vcxproj b/PCbuild/_testmultiphase.vcxproj -index 430eb528cc..7a268d227b 100644 ---- a/PCbuild/_testmultiphase.vcxproj -+++ b/PCbuild/_testmultiphase.vcxproj -@@ -92,6 +92,10 @@ +diff --git a/PCbuild/_testmultiphase.vcxproj b/PCbuild/_testmultiphase.vcxproj +index 430eb528cc..7a268d227b 100644 +--- a/PCbuild/_testmultiphase.vcxproj ++++ b/PCbuild/_testmultiphase.vcxproj +@@ -92,6 +92,10 @@ _CONSOLE;%(PreprocessorDefinitions) @@ -553,11 +553,11 @@ index 430eb528cc..7a268d227b 100644 Console -diff --git a/PCbuild/_tkinter.vcxproj b/PCbuild/_tkinter.vcxproj -index af813b77c1..9ff2acde0a 100644 ---- a/PCbuild/_tkinter.vcxproj -+++ b/PCbuild/_tkinter.vcxproj -@@ -96,6 +96,10 @@ +diff --git a/PCbuild/_tkinter.vcxproj b/PCbuild/_tkinter.vcxproj +index af813b77c1..9ff2acde0a 100644 +--- a/PCbuild/_tkinter.vcxproj ++++ b/PCbuild/_tkinter.vcxproj +@@ -96,6 +96,10 @@ $(tcltkDir)include;%(AdditionalIncludeDirectories) WITH_APPINIT;%(PreprocessorDefinitions) Py_TCLTK_DIR="$(tcltkDir.TrimEnd('\').Replace('\', '\\'))";%(PreprocessorDefinitions) @@ -568,11 +568,11 @@ index af813b77c1..9ff2acde0a 100644 $(tcltkLib);%(AdditionalDependencies) -diff --git a/PCbuild/liblzma.vcxproj b/PCbuild/liblzma.vcxproj -index 4dd42ab98a..7c2dbc7e70 100644 ---- a/PCbuild/liblzma.vcxproj -+++ b/PCbuild/liblzma.vcxproj -@@ -94,6 +94,10 @@ +diff --git a/PCbuild/liblzma.vcxproj b/PCbuild/liblzma.vcxproj +index 4dd42ab98a..7c2dbc7e70 100644 +--- a/PCbuild/liblzma.vcxproj ++++ b/PCbuild/liblzma.vcxproj +@@ -94,6 +94,10 @@ WIN32;HAVE_CONFIG_H;_LIB;%(PreprocessorDefinitions) $(lzmaDir)windows/vs2019;$(lzmaDir)src/liblzma/common;$(lzmaDir)src/common;$(lzmaDir)src/liblzma/api;$(lzmaDir)src/liblzma/check;$(lzmaDir)src/liblzma/delta;$(lzmaDir)src/liblzma/lz;$(lzmaDir)src/liblzma/lzma;$(lzmaDir)src/liblzma/rangecoder;$(lzmaDir)src/liblzma/simple;%(AdditionalIncludeDirectories) 4028;4113;4133;4244;4267;4996;%(DisableSpecificWarnings) @@ -583,11 +583,11 @@ index 4dd42ab98a..7c2dbc7e70 100644 -diff --git a/PCbuild/pyexpat.vcxproj b/PCbuild/pyexpat.vcxproj -index b2d9f5d57d..26ac82980c 100644 ---- a/PCbuild/pyexpat.vcxproj -+++ b/PCbuild/pyexpat.vcxproj -@@ -92,6 +92,10 @@ +diff --git a/PCbuild/pyexpat.vcxproj b/PCbuild/pyexpat.vcxproj +index b2d9f5d57d..26ac82980c 100644 +--- a/PCbuild/pyexpat.vcxproj ++++ b/PCbuild/pyexpat.vcxproj +@@ -92,6 +92,10 @@ $(PySourcePath)Modules\expat;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;PYEXPAT_EXPORTS;HAVE_EXPAT_H;XML_STATIC;%(PreprocessorDefinitions) @@ -598,11 +598,11 @@ index b2d9f5d57d..26ac82980c 100644 -diff --git a/PCbuild/pylauncher.vcxproj b/PCbuild/pylauncher.vcxproj -index 550e084230..0ea871bddb 100644 ---- a/PCbuild/pylauncher.vcxproj -+++ b/PCbuild/pylauncher.vcxproj -@@ -93,6 +93,10 @@ +diff --git a/PCbuild/pylauncher.vcxproj b/PCbuild/pylauncher.vcxproj +index 550e084230..0ea871bddb 100644 +--- a/PCbuild/pylauncher.vcxproj ++++ b/PCbuild/pylauncher.vcxproj +@@ -93,6 +93,10 @@ _CONSOLE;%(PreprocessorDefinitions) MultiThreaded @@ -613,11 +613,11 @@ index 550e084230..0ea871bddb 100644 version.lib;%(AdditionalDependencies) -diff --git a/PCbuild/pyshellext.vcxproj b/PCbuild/pyshellext.vcxproj -index ea432d6bc9..13bc692103 100644 ---- a/PCbuild/pyshellext.vcxproj -+++ b/PCbuild/pyshellext.vcxproj -@@ -92,6 +92,10 @@ +diff --git a/PCbuild/pyshellext.vcxproj b/PCbuild/pyshellext.vcxproj +index ea432d6bc9..13bc692103 100644 +--- a/PCbuild/pyshellext.vcxproj ++++ b/PCbuild/pyshellext.vcxproj +@@ -92,6 +92,10 @@ _CONSOLE;%(PreprocessorDefinitions) @@ -628,11 +628,11 @@ index ea432d6bc9..13bc692103 100644 version.lib;shlwapi.lib;%(AdditionalDependencies) -diff --git a/PCbuild/python.vcxproj b/PCbuild/python.vcxproj -index 3481ed3d47..06b0858e22 100644 ---- a/PCbuild/python.vcxproj -+++ b/PCbuild/python.vcxproj -@@ -91,6 +91,10 @@ +diff --git a/PCbuild/python.vcxproj b/PCbuild/python.vcxproj +index 3481ed3d47..06b0858e22 100644 +--- a/PCbuild/python.vcxproj ++++ b/PCbuild/python.vcxproj +@@ -91,6 +91,10 @@ Py_BUILD_CORE;_CONSOLE;%(PreprocessorDefinitions) @@ -643,11 +643,11 @@ index 3481ed3d47..06b0858e22 100644 Console -diff --git a/PCbuild/python3dll.vcxproj b/PCbuild/python3dll.vcxproj -index ec22e6fc76..80dff0a3d9 100644 ---- a/PCbuild/python3dll.vcxproj -+++ b/PCbuild/python3dll.vcxproj -@@ -93,6 +93,10 @@ +diff --git a/PCbuild/python3dll.vcxproj b/PCbuild/python3dll.vcxproj +index ec22e6fc76..80dff0a3d9 100644 +--- a/PCbuild/python3dll.vcxproj ++++ b/PCbuild/python3dll.vcxproj +@@ -93,6 +93,10 @@ PYTHON_DLL_NAME="$(PyDllName)";%(PreprocessorDefinitions) false @@ -658,11 +658,11 @@ index ec22e6fc76..80dff0a3d9 100644 true -diff --git a/PCbuild/python_uwp.vcxproj b/PCbuild/python_uwp.vcxproj -index fb27e9e712..f8dc841ef1 100644 ---- a/PCbuild/python_uwp.vcxproj -+++ b/PCbuild/python_uwp.vcxproj -@@ -90,7 +90,7 @@ +diff --git a/PCbuild/python_uwp.vcxproj b/PCbuild/python_uwp.vcxproj +index fb27e9e712..f8dc841ef1 100644 +--- a/PCbuild/python_uwp.vcxproj ++++ b/PCbuild/python_uwp.vcxproj +@@ -90,7 +90,7 @@ %(PreprocessorDefinitions) @@ -671,11 +671,11 @@ index fb27e9e712..f8dc841ef1 100644 windowsapp.lib;%(AdditionalDependencies) -diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj -index 3ba6358764..5d15834900 100644 ---- a/PCbuild/pythoncore.vcxproj -+++ b/PCbuild/pythoncore.vcxproj -@@ -99,7 +99,7 @@ +diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj +index 3ba6358764..5d15834900 100644 +--- a/PCbuild/pythoncore.vcxproj ++++ b/PCbuild/pythoncore.vcxproj +@@ -99,7 +99,7 @@ @@ -684,11 +684,11 @@ index 3ba6358764..5d15834900 100644 $(PySourcePath)Python;%(AdditionalIncludeDirectories) $(zlibDir);%(AdditionalIncludeDirectories) _USRDLL;Py_BUILD_CORE;Py_BUILD_CORE_BUILTIN;Py_ENABLE_SHARED;MS_DLL_ID="$(SysWinVer)";%(PreprocessorDefinitions) -diff --git a/PCbuild/pythonw.vcxproj b/PCbuild/pythonw.vcxproj -index 247ea10d5c..5bd4bbbc3a 100644 ---- a/PCbuild/pythonw.vcxproj -+++ b/PCbuild/pythonw.vcxproj -@@ -91,6 +91,18 @@ +diff --git a/PCbuild/pythonw.vcxproj b/PCbuild/pythonw.vcxproj +index 247ea10d5c..5bd4bbbc3a 100644 +--- a/PCbuild/pythonw.vcxproj ++++ b/PCbuild/pythonw.vcxproj +@@ -91,6 +91,18 @@ 2000000 @@ -707,11 +707,11 @@ index 247ea10d5c..5bd4bbbc3a 100644 -diff --git a/PCbuild/pythonw_uwp.vcxproj b/PCbuild/pythonw_uwp.vcxproj -index e21e46a1b7..ff7dc6635d 100644 ---- a/PCbuild/pythonw_uwp.vcxproj -+++ b/PCbuild/pythonw_uwp.vcxproj -@@ -90,7 +90,7 @@ +diff --git a/PCbuild/pythonw_uwp.vcxproj b/PCbuild/pythonw_uwp.vcxproj +index e21e46a1b7..ff7dc6635d 100644 +--- a/PCbuild/pythonw_uwp.vcxproj ++++ b/PCbuild/pythonw_uwp.vcxproj +@@ -90,7 +90,7 @@ PYTHONW;%(PreprocessorDefinitions) @@ -720,11 +720,11 @@ index e21e46a1b7..ff7dc6635d 100644 windowsapp.lib;%(AdditionalDependencies) -diff --git a/PCbuild/pywlauncher.vcxproj b/PCbuild/pywlauncher.vcxproj -index 44e3fc2927..1105c99807 100644 ---- a/PCbuild/pywlauncher.vcxproj -+++ b/PCbuild/pywlauncher.vcxproj -@@ -93,6 +93,10 @@ +diff --git a/PCbuild/pywlauncher.vcxproj b/PCbuild/pywlauncher.vcxproj +index 44e3fc2927..1105c99807 100644 +--- a/PCbuild/pywlauncher.vcxproj ++++ b/PCbuild/pywlauncher.vcxproj +@@ -93,6 +93,10 @@ _WINDOWS;%(PreprocessorDefinitions) MultiThreaded @@ -735,11 +735,11 @@ index 44e3fc2927..1105c99807 100644 version.lib;%(AdditionalDependencies) -diff --git a/PCbuild/select.vcxproj b/PCbuild/select.vcxproj -index 750a713949..1da66eaddc 100644 ---- a/PCbuild/select.vcxproj -+++ b/PCbuild/select.vcxproj -@@ -94,6 +94,18 @@ +diff --git a/PCbuild/select.vcxproj b/PCbuild/select.vcxproj +index 750a713949..1da66eaddc 100644 +--- a/PCbuild/select.vcxproj ++++ b/PCbuild/select.vcxproj +@@ -94,6 +94,18 @@ ws2_32.lib;%(AdditionalDependencies) @@ -758,11 +758,11 @@ index 750a713949..1da66eaddc 100644 -diff --git a/PCbuild/unicodedata.vcxproj b/PCbuild/unicodedata.vcxproj -index addef75335..1a13f363e2 100644 ---- a/PCbuild/unicodedata.vcxproj -+++ b/PCbuild/unicodedata.vcxproj -@@ -91,6 +91,26 @@ +diff --git a/PCbuild/unicodedata.vcxproj b/PCbuild/unicodedata.vcxproj +index addef75335..1a13f363e2 100644 +--- a/PCbuild/unicodedata.vcxproj ++++ b/PCbuild/unicodedata.vcxproj +@@ -91,6 +91,26 @@ <_ProjectFileVersion>10.0.30319.1 @@ -789,11 +789,11 @@ index addef75335..1a13f363e2 100644 -diff --git a/PCbuild/venvlauncher.vcxproj b/PCbuild/venvlauncher.vcxproj -index 123e84ec4e..6272f9f69d 100644 ---- a/PCbuild/venvlauncher.vcxproj -+++ b/PCbuild/venvlauncher.vcxproj -@@ -93,6 +93,10 @@ +diff --git a/PCbuild/venvlauncher.vcxproj b/PCbuild/venvlauncher.vcxproj +index 123e84ec4e..6272f9f69d 100644 +--- a/PCbuild/venvlauncher.vcxproj ++++ b/PCbuild/venvlauncher.vcxproj +@@ -93,6 +93,10 @@ _CONSOLE;VENV_REDIRECT;%(PreprocessorDefinitions) MultiThreaded @@ -804,11 +804,11 @@ index 123e84ec4e..6272f9f69d 100644 PY_ICON;%(PreprocessorDefinitions) -diff --git a/PCbuild/venvwlauncher.vcxproj b/PCbuild/venvwlauncher.vcxproj -index b8504d5d08..60d6308713 100644 ---- a/PCbuild/venvwlauncher.vcxproj -+++ b/PCbuild/venvwlauncher.vcxproj -@@ -93,6 +93,10 @@ +diff --git a/PCbuild/venvwlauncher.vcxproj b/PCbuild/venvwlauncher.vcxproj +index b8504d5d08..60d6308713 100644 +--- a/PCbuild/venvwlauncher.vcxproj ++++ b/PCbuild/venvwlauncher.vcxproj +@@ -93,6 +93,10 @@ _WINDOWS;VENV_REDIRECT;%(PreprocessorDefinitions) MultiThreaded @@ -819,11 +819,11 @@ index b8504d5d08..60d6308713 100644 PYW_ICON;%(PreprocessorDefinitions) -diff --git a/PCbuild/winsound.vcxproj b/PCbuild/winsound.vcxproj -index 32cedc9b44..c9abee1d69 100644 ---- a/PCbuild/winsound.vcxproj -+++ b/PCbuild/winsound.vcxproj -@@ -96,6 +96,18 @@ +diff --git a/PCbuild/winsound.vcxproj b/PCbuild/winsound.vcxproj +index 32cedc9b44..c9abee1d69 100644 +--- a/PCbuild/winsound.vcxproj ++++ b/PCbuild/winsound.vcxproj +@@ -96,6 +96,18 @@ winmm.lib;%(AdditionalDependencies) @@ -842,11 +842,11 @@ index 32cedc9b44..c9abee1d69 100644 -diff --git a/PCbuild/xxlimited.vcxproj b/PCbuild/xxlimited.vcxproj -index 1c776fb0da..36dec23c20 100644 ---- a/PCbuild/xxlimited.vcxproj -+++ b/PCbuild/xxlimited.vcxproj -@@ -93,6 +93,12 @@ +diff --git a/PCbuild/xxlimited.vcxproj b/PCbuild/xxlimited.vcxproj +index 1c776fb0da..36dec23c20 100644 +--- a/PCbuild/xxlimited.vcxproj ++++ b/PCbuild/xxlimited.vcxproj +@@ -93,6 +93,12 @@ <_ProjectFileVersion>10.0.30319.1 @@ -859,11 +859,11 @@ index 1c776fb0da..36dec23c20 100644 wsock32.lib;%(AdditionalDependencies) -diff --git a/PCbuild/xxlimited_35.vcxproj b/PCbuild/xxlimited_35.vcxproj -index dd830b3b6a..fef2c5b9f4 100644 ---- a/PCbuild/xxlimited_35.vcxproj -+++ b/PCbuild/xxlimited_35.vcxproj -@@ -93,6 +93,12 @@ +diff --git a/PCbuild/xxlimited_35.vcxproj b/PCbuild/xxlimited_35.vcxproj +index dd830b3b6a..fef2c5b9f4 100644 +--- a/PCbuild/xxlimited_35.vcxproj ++++ b/PCbuild/xxlimited_35.vcxproj +@@ -93,6 +93,12 @@ <_ProjectFileVersion>10.0.30319.1 diff --git a/recipe/patches/0021-Unvendor-libffi.patch b/recipe/patches/0021-Unvendor-libffi.patch index cb83b407a..8b1643165 100644 --- a/recipe/patches/0021-Unvendor-libffi.patch +++ b/recipe/patches/0021-Unvendor-libffi.patch @@ -1,17 +1,25 @@ -From f79b4ea35df7853bdf6faa2881e0bdc07c935243 Mon Sep 17 00:00:00 2001 -From: Isuru Fernando -Date: Mon, 16 Aug 2021 03:07:40 -0700 -Subject: [PATCH 21/25] Unvendor libffi - ---- - PCbuild/libffi.props | 15 +++------------ - 1 file changed, 3 insertions(+), 12 deletions(-) - -diff --git a/PCbuild/libffi.props b/PCbuild/libffi.props -index 975c4a0d35..97fb5966bf 100644 ---- a/PCbuild/libffi.props -+++ b/PCbuild/libffi.props -@@ -2,20 +2,11 @@ +From f79b4ea35df7853bdf6faa2881e0bdc07c935243 Mon Sep 17 00:00:00 2001 +From: Isuru Fernando +Date: Mon, 16 Aug 2021 03:07:40 -0700 +Subject: [PATCH 21/25] Unvendor libffi + +--- + PCbuild/_ctypes.vcxproj | 2 +- + PCbuild/libffi.props | 15 +++------------ + 2 files changed, 4 insertions(+), 13 deletions(-) + +diff --git a/PCbuild/_ctypes.vcxproj b/PCbuild/_ctypes.vcxproj +index 69e4271a9b..a8f3c2b1d4 100644 +--- a/PCbuild/_ctypes.vcxproj ++++ b/PCbuild/_ctypes.vcxproj +@@ -97 +97 @@ +- FFI_BUILDING;%(PreprocessorDefinitions) ++ USING_MALLOC_CLOSURE_DOT_C=1;%(PreprocessorDefinitions) +diff --git a/PCbuild/libffi.props b/PCbuild/libffi.props +index 975c4a0d35..97fb5966bf 100644 +--- a/PCbuild/libffi.props ++++ b/PCbuild/libffi.props +@@ -2,20 +2,11 @@ @@ -34,7 +42,7 @@ index 975c4a0d35..97fb5966bf 100644 - - - - + \ No newline at end of file -- 2.32.1 (Apple Git-133) diff --git a/recipe/patches/0028-Fix-ssl-DER-EOF-detection-for-openssl-3.5.7.patch b/recipe/patches/0028-Fix-ssl-DER-EOF-detection-for-openssl-3.5.7.patch new file mode 100644 index 000000000..45c5cfa4e --- /dev/null +++ b/recipe/patches/0028-Fix-ssl-DER-EOF-detection-for-openssl-3.5.7.patch @@ -0,0 +1,68 @@ +From 863a0a7badf3919c4a710df67e98dbf5db0a2690 Mon Sep 17 00:00:00 2001 +From: David Benjamin +Date: Tue, 20 Dec 2022 10:36:19 -0500 +Subject: [PATCH 28/28] Fix ssl DER EOF detection for openssl 3.5.7 + +In PEM, we need to parse until error and then suppress +PEM_R_NO_START_LINE, because PEM allows arbitrary leading and trailing +data. DER, however, does not. Parsing until error and suppressing +ASN1_R_HEADER_TOO_LONG doesn't quite work because that error also +covers some cases that should be rejected. + +Instead, check BIO_eof early and stop the loop that way. + +Backported for OpenSSL 3.5.7 compatibility on Windows (openssl 3.5.7 +returns ASN1_R_NOT_ENOUGH_DATA at DER EOF instead of ASN1_R_HEADER_TOO_LONG). +--- + Lib/test/test_ssl.py | 2 ++ + Modules/_ssl.c | 10 ++++++---- + 2 files changed, 8 insertions(+), 4 deletions(-) + +diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py +index d4eb2d2e81..f251dff95c 100644 +--- a/Lib/test/test_ssl.py ++++ b/Lib/test/test_ssl.py +@@ -1522,6 +1522,8 @@ class ContextTests(unittest.TestCase): + "not enough data: cadata does not contain a certificate" + ): + ctx.load_verify_locations(cadata=b"broken") ++ with self.assertRaises(ssl.SSLError): ++ ctx.load_verify_locations(cadata=cacert_der + b"A") + + @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows") + def test_load_dh_params(self): +diff --git a/Modules/_ssl.c b/Modules/_ssl.c +index 8f03a846ae..c740decd66 100644 +--- a/Modules/_ssl.c ++++ b/Modules/_ssl.c +@@ -3951,7 +3951,7 @@ _add_ca_certs(PySSLContext *self, const void *data, Py_ssize_t len, + { + BIO *biobuf = NULL; + X509_STORE *store; +- int retval = -1, err, loaded = 0; ++ int retval = -1, err, loaded = 0, was_bio_eof = 0; + + assert(filetype == SSL_FILETYPE_ASN1 || filetype == SSL_FILETYPE_PEM); + +@@ -3979,6 +3979,10 @@ _add_ca_certs(PySSLContext *self, const void *data, Py_ssize_t len, + int r; + + if (filetype == SSL_FILETYPE_ASN1) { ++ if (BIO_eof(biobuf)) { ++ was_bio_eof = 1; ++ break; ++ } + cert = d2i_X509_bio(biobuf, NULL); + } else { + cert = PEM_read_bio_X509(biobuf, NULL, +@@ -4014,9 +4018,7 @@ _add_ca_certs(PySSLContext *self, const void *data, Py_ssize_t len, + } + _setSSLError(get_state_ctx(self), msg, 0, __FILE__, __LINE__); + retval = -1; +- } else if ((filetype == SSL_FILETYPE_ASN1) && +- (ERR_GET_LIB(err) == ERR_LIB_ASN1) && +- (ERR_GET_REASON(err) == ASN1_R_HEADER_TOO_LONG)) { ++ } else if ((filetype == SSL_FILETYPE_ASN1) && was_bio_eof) { + /* EOF ASN1 file, not an error */ + ERR_clear_error(); + retval = 0; diff --git a/recipe/patches/0029-Fix-ctypes-fielddesc-init-for-external-libffi.patch b/recipe/patches/0029-Fix-ctypes-fielddesc-init-for-external-libffi.patch new file mode 100644 index 000000000..5837bd52c --- /dev/null +++ b/recipe/patches/0029-Fix-ctypes-fielddesc-init-for-external-libffi.patch @@ -0,0 +1,272 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Christian Heimes +Date: Sat, 27 Nov 2021 21:41:18 +0100 +Subject: [PATCH 29/29] Fix ctypes fielddesc init for external libffi + +Backport https://github.com/python/cpython/pull/29791 (bpo-45898) for +Windows builds that link against an external libffi DLL instead of the +vendored copy. Delay fielddesc initialization and remove duplicate +ffi_type definitions from cfield.c. (FFI_BUILDING is replaced with +USING_MALLOC_CLOSURE_DOT_C=1 in 0021-Unvendor-libffi.patch.) +--- +diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c +index 534ec94..240b73c 100644 +--- a/Modules/_ctypes/cfield.c ++++ b/Modules/_ctypes/cfield.c +@@ -1473,55 +1473,40 @@ P_get(void *ptr, Py_ssize_t size) + } + + static struct fielddesc formattable[] = { +- { 's', s_set, s_get, &ffi_type_pointer}, +- { 'b', b_set, b_get, &ffi_type_schar}, +- { 'B', B_set, B_get, &ffi_type_uchar}, +- { 'c', c_set, c_get, &ffi_type_schar}, +- { 'd', d_set, d_get, &ffi_type_double, d_set_sw, d_get_sw}, +- { 'g', g_set, g_get, &ffi_type_longdouble}, +- { 'f', f_set, f_get, &ffi_type_float, f_set_sw, f_get_sw}, +- { 'h', h_set, h_get, &ffi_type_sshort, h_set_sw, h_get_sw}, +- { 'H', H_set, H_get, &ffi_type_ushort, H_set_sw, H_get_sw}, +- { 'i', i_set, i_get, &ffi_type_sint, i_set_sw, i_get_sw}, +- { 'I', I_set, I_get, &ffi_type_uint, I_set_sw, I_get_sw}, +-/* XXX Hm, sizeof(int) == sizeof(long) doesn't hold on every platform */ +-/* As soon as we can get rid of the type codes, this is no longer a problem */ +-#if SIZEOF_LONG == 4 +- { 'l', l_set, l_get, &ffi_type_sint32, l_set_sw, l_get_sw}, +- { 'L', L_set, L_get, &ffi_type_uint32, L_set_sw, L_get_sw}, +-#elif SIZEOF_LONG == 8 +- { 'l', l_set, l_get, &ffi_type_sint64, l_set_sw, l_get_sw}, +- { 'L', L_set, L_get, &ffi_type_uint64, L_set_sw, L_get_sw}, +-#else +-# error +-#endif +-#if SIZEOF_LONG_LONG == 8 +- { 'q', q_set, q_get, &ffi_type_sint64, q_set_sw, q_get_sw}, +- { 'Q', Q_set, Q_get, &ffi_type_uint64, Q_set_sw, Q_get_sw}, +-#else +-# error +-#endif +- { 'P', P_set, P_get, &ffi_type_pointer}, +- { 'z', z_set, z_get, &ffi_type_pointer}, +- { 'u', u_set, u_get, NULL}, /* ffi_type set later */ +- { 'U', U_set, U_get, &ffi_type_pointer}, +- { 'Z', Z_set, Z_get, &ffi_type_pointer}, ++ { 's', s_set, s_get, NULL}, ++ { 'b', b_set, b_get, NULL}, ++ { 'B', B_set, B_get, NULL}, ++ { 'c', c_set, c_get, NULL}, ++ { 'd', d_set, d_get, NULL, d_set_sw, d_get_sw}, ++ { 'g', g_set, g_get, NULL}, ++ { 'f', f_set, f_get, NULL, f_set_sw, f_get_sw}, ++ { 'h', h_set, h_get, NULL, h_set_sw, h_get_sw}, ++ { 'H', H_set, H_get, NULL, H_set_sw, H_get_sw}, ++ { 'i', i_set, i_get, NULL, i_set_sw, i_get_sw}, ++ { 'I', I_set, I_get, NULL, I_set_sw, I_get_sw}, ++ { 'l', l_set, l_get, NULL, l_set_sw, l_get_sw}, ++ { 'L', L_set, L_get, NULL, L_set_sw, L_get_sw}, ++ { 'q', q_set, q_get, NULL, q_set_sw, q_get_sw}, ++ { 'Q', Q_set, Q_get, NULL, Q_set_sw, Q_get_sw}, ++ { 'P', P_set, P_get, NULL}, ++ { 'z', z_set, z_get, NULL}, ++ { 'u', u_set, u_get, NULL}, ++ { 'U', U_set, U_get, NULL}, ++ { 'Z', Z_set, Z_get, NULL}, + #ifdef MS_WIN32 +- { 'X', BSTR_set, BSTR_get, &ffi_type_pointer}, ++ { 'X', BSTR_set, BSTR_get, NULL}, + #endif +- { 'v', vBOOL_set, vBOOL_get, &ffi_type_sshort}, +-#if SIZEOF__BOOL == 1 +- { '?', bool_set, bool_get, &ffi_type_uchar}, /* Also fallback for no native _Bool support */ +-#elif SIZEOF__BOOL == SIZEOF_SHORT +- { '?', bool_set, bool_get, &ffi_type_ushort}, +-#elif SIZEOF__BOOL == SIZEOF_INT +- { '?', bool_set, bool_get, &ffi_type_uint, I_set_sw, I_get_sw}, ++ { 'v', vBOOL_set, vBOOL_get, NULL}, ++#if SIZEOF__BOOL == SIZEOF_INT ++ { '?', bool_set, bool_get, NULL, I_set_sw, I_get_sw}, + #elif SIZEOF__BOOL == SIZEOF_LONG +- { '?', bool_set, bool_get, &ffi_type_ulong, L_set_sw, L_get_sw}, ++ { '?', bool_set, bool_get, NULL, L_set_sw, L_get_sw}, + #elif SIZEOF__BOOL == SIZEOF_LONG_LONG +- { '?', bool_set, bool_get, &ffi_type_ulong, Q_set_sw, Q_get_sw}, ++ { '?', bool_set, bool_get, NULL, Q_set_sw, Q_get_sw}, ++#else ++ { '?', bool_set, bool_get, NULL}, + #endif /* SIZEOF__BOOL */ +- { 'O', O_set, O_get, &ffi_type_pointer}, ++ { 'O', O_set, O_get, NULL}, + { 0, NULL, NULL, NULL}, + }; + +@@ -1530,6 +1515,79 @@ static struct fielddesc formattable[] = { + Use '?' as code for BOOL. + */ + ++/* Delayed initialization. Windows cannot statically reference dynamically ++ loaded addresses from DLLs. */ ++void ++_ctypes_init_fielddesc(void) ++{ ++ struct fielddesc *fd = formattable; ++ for (; fd->code; ++fd) { ++ switch (fd->code) { ++ case 's': fd->pffi_type = &ffi_type_pointer; break; ++ case 'b': fd->pffi_type = &ffi_type_schar; break; ++ case 'B': fd->pffi_type = &ffi_type_uchar; break; ++ case 'c': fd->pffi_type = &ffi_type_schar; break; ++ case 'd': fd->pffi_type = &ffi_type_double; break; ++ case 'g': fd->pffi_type = &ffi_type_longdouble; break; ++ case 'f': fd->pffi_type = &ffi_type_float; break; ++ case 'h': fd->pffi_type = &ffi_type_sshort; break; ++ case 'H': fd->pffi_type = &ffi_type_ushort; break; ++ case 'i': fd->pffi_type = &ffi_type_sint; break; ++ case 'I': fd->pffi_type = &ffi_type_uint; break; ++ /* XXX Hm, sizeof(int) == sizeof(long) doesn't hold on every platform */ ++ /* As soon as we can get rid of the type codes, this is no longer a problem */ ++ #if SIZEOF_LONG == 4 ++ case 'l': fd->pffi_type = &ffi_type_sint32; break; ++ case 'L': fd->pffi_type = &ffi_type_uint32; break; ++ #elif SIZEOF_LONG == 8 ++ case 'l': fd->pffi_type = &ffi_type_sint64; break; ++ case 'L': fd->pffi_type = &ffi_type_uint64; break; ++ #else ++ #error ++ #endif ++ #if SIZEOF_LONG_LONG == 8 ++ case 'q': fd->pffi_type = &ffi_type_sint64; break; ++ case 'Q': fd->pffi_type = &ffi_type_uint64; break; ++ #else ++ #error ++ #endif ++ case 'P': fd->pffi_type = &ffi_type_pointer; break; ++ case 'z': fd->pffi_type = &ffi_type_pointer; break; ++ case 'u': ++ if (sizeof(wchar_t) == sizeof(short)) ++ fd->pffi_type = &ffi_type_sshort; ++ else if (sizeof(wchar_t) == sizeof(int)) ++ fd->pffi_type = &ffi_type_sint; ++ else if (sizeof(wchar_t) == sizeof(long)) ++ fd->pffi_type = &ffi_type_slong; ++ else ++ Py_UNREACHABLE(); ++ break; ++ case 'U': fd->pffi_type = &ffi_type_pointer; break; ++ case 'Z': fd->pffi_type = &ffi_type_pointer; break; ++ #ifdef MS_WIN32 ++ case 'X': fd->pffi_type = &ffi_type_pointer; break; ++ #endif ++ case 'v': fd->pffi_type = &ffi_type_sshort; break; ++ #if SIZEOF__BOOL == 1 ++ case '?': fd->pffi_type = &ffi_type_uchar; break; /* Also fallback for no native _Bool support */ ++ #elif SIZEOF__BOOL == SIZEOF_SHORT ++ case '?': fd->pffi_type = &ffi_type_ushort; break; ++ #elif SIZEOF__BOOL == SIZEOF_INT ++ case '?': fd->pffi_type = &ffi_type_uint; break; ++ #elif SIZEOF__BOOL == SIZEOF_LONG ++ case '?': fd->pffi_type = &ffi_type_ulong; break; ++ #elif SIZEOF__BOOL == SIZEOF_LONG_LONG ++ case '?': fd->pffi_type = &ffi_type_ulong; break; ++ #endif /* SIZEOF__BOOL */ ++ case 'O': fd->pffi_type = &ffi_type_pointer; break; ++ default: ++ Py_UNREACHABLE(); ++ } ++ } ++ ++} ++ + struct fielddesc * + _ctypes_get_fielddesc(const char *fmt) + { +@@ -1538,12 +1596,7 @@ _ctypes_get_fielddesc(const char *fmt) + + if (!initialized) { + initialized = 1; +- if (sizeof(wchar_t) == sizeof(short)) +- _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_sshort; +- else if (sizeof(wchar_t) == sizeof(int)) +- _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_sint; +- else if (sizeof(wchar_t) == sizeof(long)) +- _ctypes_get_fielddesc("u")->pffi_type = &ffi_type_slong; ++ _ctypes_init_fielddesc(); + } + + for (; table->code; ++table) { +@@ -1553,77 +1606,4 @@ _ctypes_get_fielddesc(const char *fmt) + return NULL; + } + +-typedef struct { char c; char x; } s_char; +-typedef struct { char c; short x; } s_short; +-typedef struct { char c; int x; } s_int; +-typedef struct { char c; long x; } s_long; +-typedef struct { char c; float x; } s_float; +-typedef struct { char c; double x; } s_double; +-typedef struct { char c; long double x; } s_long_double; +-typedef struct { char c; char *x; } s_char_p; +-typedef struct { char c; void *x; } s_void_p; +- +-/* +-#define CHAR_ALIGN (sizeof(s_char) - sizeof(char)) +-#define SHORT_ALIGN (sizeof(s_short) - sizeof(short)) +-#define LONG_ALIGN (sizeof(s_long) - sizeof(long)) +-*/ +-#define INT_ALIGN (sizeof(s_int) - sizeof(int)) +-#define FLOAT_ALIGN (sizeof(s_float) - sizeof(float)) +-#define DOUBLE_ALIGN (sizeof(s_double) - sizeof(double)) +-#define LONGDOUBLE_ALIGN (sizeof(s_long_double) - sizeof(long double)) +- +-/* #define CHAR_P_ALIGN (sizeof(s_char_p) - sizeof(char*)) */ +-#define VOID_P_ALIGN (sizeof(s_void_p) - sizeof(void*)) +- +-/* +-#ifdef HAVE_USABLE_WCHAR_T +-typedef struct { char c; wchar_t x; } s_wchar; +-typedef struct { char c; wchar_t *x; } s_wchar_p; +- +-#define WCHAR_ALIGN (sizeof(s_wchar) - sizeof(wchar_t)) +-#define WCHAR_P_ALIGN (sizeof(s_wchar_p) - sizeof(wchar_t*)) +-#endif +-*/ +- +-typedef struct { char c; long long x; } s_long_long; +-#define LONG_LONG_ALIGN (sizeof(s_long_long) - sizeof(long long)) +- +-/* from ffi.h: +-typedef struct _ffi_type +-{ +- size_t size; +- unsigned short alignment; +- unsigned short type; +- struct _ffi_type **elements; +-} ffi_type; +-*/ +- +-/* align and size are bogus for void, but they must not be zero */ +-ffi_type ffi_type_void = { 1, 1, FFI_TYPE_VOID }; +- +-ffi_type ffi_type_uint8 = { 1, 1, FFI_TYPE_UINT8 }; +-ffi_type ffi_type_sint8 = { 1, 1, FFI_TYPE_SINT8 }; +- +-ffi_type ffi_type_uint16 = { 2, 2, FFI_TYPE_UINT16 }; +-ffi_type ffi_type_sint16 = { 2, 2, FFI_TYPE_SINT16 }; +- +-ffi_type ffi_type_uint32 = { 4, INT_ALIGN, FFI_TYPE_UINT32 }; +-ffi_type ffi_type_sint32 = { 4, INT_ALIGN, FFI_TYPE_SINT32 }; +- +-ffi_type ffi_type_uint64 = { 8, LONG_LONG_ALIGN, FFI_TYPE_UINT64 }; +-ffi_type ffi_type_sint64 = { 8, LONG_LONG_ALIGN, FFI_TYPE_SINT64 }; +- +-ffi_type ffi_type_float = { sizeof(float), FLOAT_ALIGN, FFI_TYPE_FLOAT }; +-ffi_type ffi_type_double = { sizeof(double), DOUBLE_ALIGN, FFI_TYPE_DOUBLE }; +- +-#ifdef ffi_type_longdouble +-#undef ffi_type_longdouble +-#endif +- /* This is already defined on OSX */ +-ffi_type ffi_type_longdouble = { sizeof(long double), LONGDOUBLE_ALIGN, +- FFI_TYPE_LONGDOUBLE }; +- +-ffi_type ffi_type_pointer = { sizeof(void *), VOID_P_ALIGN, FFI_TYPE_POINTER }; +- + /*---------------- EOF ----------------*/ From 54323a3b1bd216f07153e2d66bb3e7995f944607 Mon Sep 17 00:00:00 2001 From: Eric Lundby Date: Wed, 10 Jun 2026 11:10:52 -0600 Subject: [PATCH 02/11] Update patches --- recipe/meta.yaml | 1 - recipe/patches/0015-Doing-d1trimfile.patch | 3 ++- recipe/patches/0021-Unvendor-libffi.patch | 13 ++----------- ...-ctypes-fielddesc-init-for-external-libffi.patch | 2 +- 4 files changed, 5 insertions(+), 14 deletions(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 122f118c1..7557bb19f 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -79,7 +79,6 @@ source: # https://github.com/pypa/distutils/pull/53 - patches/0019-Fix-LDSHARED-when-CC-is-overriden-on-Linux-too.patch - patches/0020-Unvendor-bzip2.patch - # also sets USING_MALLOC_CLOSURE_DOT_C=1 on _ctypes.vcxproj (gh-29791) - patches/0021-Unvendor-libffi.patch - patches/0022-Unvendor-tcltk.patch - patches/0023-unvendor-xz.patch diff --git a/recipe/patches/0015-Doing-d1trimfile.patch b/recipe/patches/0015-Doing-d1trimfile.patch index 6d098f9a7..62f9ff906 100644 --- a/recipe/patches/0015-Doing-d1trimfile.patch +++ b/recipe/patches/0015-Doing-d1trimfile.patch @@ -101,7 +101,8 @@ index 69e4271a9b..f28002d190 100644 @@ -95,6 +95,10 @@ - FFI_BUILDING;%(PreprocessorDefinitions) +- FFI_BUILDING;%(PreprocessorDefinitions) ++ USING_MALLOC_CLOSURE_DOT_C=1;%(PreprocessorDefinitions) + /d1trimfile:%SRC_DIR% + /d1trimfile:%SRC_DIR% + /d1trimfile:%SRC_DIR% diff --git a/recipe/patches/0021-Unvendor-libffi.patch b/recipe/patches/0021-Unvendor-libffi.patch index 8b1643165..e61005299 100644 --- a/recipe/patches/0021-Unvendor-libffi.patch +++ b/recipe/patches/0021-Unvendor-libffi.patch @@ -4,17 +4,9 @@ Date: Mon, 16 Aug 2021 03:07:40 -0700 Subject: [PATCH 21/25] Unvendor libffi --- - PCbuild/_ctypes.vcxproj | 2 +- - PCbuild/libffi.props | 15 +++------------ - 2 files changed, 4 insertions(+), 13 deletions(-) + PCbuild/libffi.props | 15 +++------------ + 1 file changed, 3 insertions(+), 12 deletions(-) -diff --git a/PCbuild/_ctypes.vcxproj b/PCbuild/_ctypes.vcxproj -index 69e4271a9b..a8f3c2b1d4 100644 ---- a/PCbuild/_ctypes.vcxproj -+++ b/PCbuild/_ctypes.vcxproj -@@ -97 +97 @@ -- FFI_BUILDING;%(PreprocessorDefinitions) -+ USING_MALLOC_CLOSURE_DOT_C=1;%(PreprocessorDefinitions) diff --git a/PCbuild/libffi.props b/PCbuild/libffi.props index 975c4a0d35..97fb5966bf 100644 --- a/PCbuild/libffi.props @@ -46,4 +38,3 @@ index 975c4a0d35..97fb5966bf 100644 \ No newline at end of file -- 2.32.1 (Apple Git-133) - diff --git a/recipe/patches/0029-Fix-ctypes-fielddesc-init-for-external-libffi.patch b/recipe/patches/0029-Fix-ctypes-fielddesc-init-for-external-libffi.patch index 5837bd52c..6238db3d3 100644 --- a/recipe/patches/0029-Fix-ctypes-fielddesc-init-for-external-libffi.patch +++ b/recipe/patches/0029-Fix-ctypes-fielddesc-init-for-external-libffi.patch @@ -7,7 +7,7 @@ Backport https://github.com/python/cpython/pull/29791 (bpo-45898) for Windows builds that link against an external libffi DLL instead of the vendored copy. Delay fielddesc initialization and remove duplicate ffi_type definitions from cfield.c. (FFI_BUILDING is replaced with -USING_MALLOC_CLOSURE_DOT_C=1 in 0021-Unvendor-libffi.patch.) +USING_MALLOC_CLOSURE_DOT_C=1 in 0015-Doing-d1trimfile.patch.) --- diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 534ec94..240b73c 100644 From 52d9b2dc268618316d61a9d1e4475ea49af0fe6d Mon Sep 17 00:00:00 2001 From: Eric Lundby Date: Wed, 10 Jun 2026 11:23:23 -0600 Subject: [PATCH 03/11] Update 0021-Unvendor-libffi.patch --- recipe/patches/0021-Unvendor-libffi.patch | 36 +++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/recipe/patches/0021-Unvendor-libffi.patch b/recipe/patches/0021-Unvendor-libffi.patch index e61005299..bfa3b6d16 100644 --- a/recipe/patches/0021-Unvendor-libffi.patch +++ b/recipe/patches/0021-Unvendor-libffi.patch @@ -1,17 +1,17 @@ -From f79b4ea35df7853bdf6faa2881e0bdc07c935243 Mon Sep 17 00:00:00 2001 -From: Isuru Fernando -Date: Mon, 16 Aug 2021 03:07:40 -0700 -Subject: [PATCH 21/25] Unvendor libffi - ---- - PCbuild/libffi.props | 15 +++------------ - 1 file changed, 3 insertions(+), 12 deletions(-) - -diff --git a/PCbuild/libffi.props b/PCbuild/libffi.props -index 975c4a0d35..97fb5966bf 100644 ---- a/PCbuild/libffi.props -+++ b/PCbuild/libffi.props -@@ -2,20 +2,11 @@ +From f79b4ea35df7853bdf6faa2881e0bdc07c935243 Mon Sep 17 00:00:00 2001 +From: Isuru Fernando +Date: Mon, 16 Aug 2021 03:07:40 -0700 +Subject: [PATCH 21/25] Unvendor libffi + +--- + PCbuild/libffi.props | 15 +++------------ + 1 file changed, 3 insertions(+), 12 deletions(-) + +diff --git a/PCbuild/libffi.props b/PCbuild/libffi.props +index 975c4a0d35..97fb5966bf 100644 +--- a/PCbuild/libffi.props ++++ b/PCbuild/libffi.props +@@ -2,20 +2,11 @@ @@ -34,7 +34,7 @@ index 975c4a0d35..97fb5966bf 100644 - - - - -\ No newline at end of file --- -2.32.1 (Apple Git-133) + +\ No newline at end of file +-- +2.32.1 (Apple Git-133) From 6eeabb2f12d2dee4ae18a4fd19408c639842a302 Mon Sep 17 00:00:00 2001 From: Eric Lundby Date: Wed, 10 Jun 2026 11:52:15 -0600 Subject: [PATCH 04/11] Add a test --- recipe/meta.yaml | 2 + recipe/regression_openssl_ctypes.py | 196 ++++++++++++++++++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 recipe/regression_openssl_ctypes.py diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 7557bb19f..04093620f 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -239,6 +239,7 @@ outputs: - tests/cython/* - tests/prefix-replacement/* - run_test.py + - regression_openssl_ctypes.py commands: - echo on # [win] - set # [win] @@ -290,6 +291,7 @@ outputs: - popd - popd - python run_test.py + - python regression_openssl_ctypes.py - test ! -f default.profraw # [osx] # Test workaround for https://github.com/conda/conda/issues/10969 - test -d "$PREFIX/lib/python3.1/site-packages" # [unix] diff --git a/recipe/regression_openssl_ctypes.py b/recipe/regression_openssl_ctypes.py new file mode 100644 index 000000000..9889c6fe4 --- /dev/null +++ b/recipe/regression_openssl_ctypes.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python3 +"""Regression checks for openssl 3.5.7 + external libffi feedstock patches. + +Patches exercised: + 0028 DER EOF handling in _ssl.c (OpenSSL 3.5.7 returns NOT_ENOUGH_DATA at EOF) + 0015/0029 _ctypes with external libffi on Windows + +Demonstrating the SSL failure (vanilla Python 3.10 + openssl >= 3.5.7, without 0028): + + 1. Build/install Python with patches 0001-0027 only (omit 0028). + 2. Run: python regression_openssl_ctypes.py + 3. Expect: FAIL ssl_der_eof_single_cert (SSLError: not enough data) + +After applying 0028 and rebuilding, the same command should report all PASS. + +The stdlib unittest added by 0028 can also be run directly: + + python -m unittest test.test_ssl.ContextTests.test_load_verify_cadata -v + +On Windows, ssl.create_default_context() hits the same DER-EOF path via the +system cert store; test_windows_default_context covers that when win32. +""" + +from __future__ import annotations + +import os +import re +import sys +import traceback + + +def _result(name: str, status: str, detail: str = "") -> tuple[str, str, str]: + return name, status, detail + + +def _openssl_ge(version: tuple[int, int, int]) -> bool: + import ssl + + m = re.search(r"OpenSSL (\d+)\.(\d+)\.(\d+)", ssl.OPENSSL_VERSION) + if not m: + return False + return tuple(map(int, m.groups())) >= version + + +def _load_test_ca_pem() -> str: + import sysconfig + + stdlib = sysconfig.get_path("stdlib") + candidates = [ + os.path.join(stdlib, "test", "certdata", "capath", "5ed36f99.0"), + os.path.join(stdlib, "test", "certdata", "keycert.pem"), + ] + for path in candidates: + if os.path.isfile(path): + with open(path, encoding="ascii") as f: + return f.read() + raise FileNotFoundError( + "No test CA PEM found under %s; install the python test suite" % stdlib + ) + + +def test_ssl_der_eof_single_cert() -> tuple[str, str, str]: + """Single DER cert ending at buffer EOF (core 0028 regression).""" + name = "ssl_der_eof_single_cert" + if not _openssl_ge((3, 5, 7)): + import ssl + + return _result(name, "SKIP", "OpenSSL %s < 3.5.7" % ssl.OPENSSL_VERSION) + + import ssl + + cacert_der = ssl.PEM_cert_to_DER_cert(_load_test_ca_pem()) + ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + try: + ctx.load_verify_locations(cadata=cacert_der) + except ssl.SSLError as exc: + msg = str(exc) + if "NOT_ENOUGH_DATA" in msg or "not enough data" in msg.lower(): + return _result( + name, + "FAIL", + "%s (apply patch 0028)" % exc, + ) + raise + return _result(name, "PASS", "load_verify_locations accepted DER cadata at EOF") + + +def test_ssl_der_rejects_trailing_garbage() -> tuple[str, str, str]: + """DER cert followed by non-EOF byte must raise SSLError (0028 test_ssl addition).""" + name = "ssl_der_rejects_trailing_garbage" + if not _openssl_ge((3, 5, 7)): + import ssl + + return _result(name, "SKIP", "OpenSSL %s < 3.5.7" % ssl.OPENSSL_VERSION) + + import ssl + + cacert_der = ssl.PEM_cert_to_DER_cert(_load_test_ca_pem()) + ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + try: + ctx.load_verify_locations(cadata=cacert_der + b"A") + except ssl.SSLError: + return _result(name, "PASS", "trailing byte correctly rejected") + return _result(name, "FAIL", "expected SSLError for DER cert + trailing byte") + + +def test_windows_default_context() -> tuple[str, str, str]: + """Windows cert store loads DER via load_verify_locations(cadata=...).""" + name = "windows_default_context" + if sys.platform != "win32": + return _result(name, "SKIP", "Windows only") + if not _openssl_ge((3, 5, 7)): + import ssl + + return _result(name, "SKIP", "OpenSSL %s < 3.5.7" % ssl.OPENSSL_VERSION) + + import ssl + + try: + ssl.create_default_context() + except ssl.SSLError as exc: + msg = str(exc) + if "NOT_ENOUGH_DATA" in msg or "not enough data" in msg.lower(): + return _result( + name, + "FAIL", + "%s (apply patch 0028)" % exc, + ) + raise + return _result(name, "PASS", "create_default_context() succeeded") + + +def test_ctypes_external_libffi_fields() -> tuple[str, str, str]: + """Exercise ctypes Structure field descriptors (0029 / gh-29791).""" + name = "ctypes_external_libffi_fields" + import ctypes + + class Record(ctypes.Structure): + _fields_ = [ + ("d", ctypes.c_double), + ("q", ctypes.c_longlong), + ("p", ctypes.c_void_p), + ("h", ctypes.c_short), + ] + + rec = Record() + rec.d = 2.5 + rec.q = 1 << 40 + rec.h = -3 + if rec.d != 2.5 or rec.q != 1 << 40 or rec.h != -3: + return _result(name, "FAIL", "field round-trip mismatch") + return _result(name, "PASS", "Structure fields with external libffi OK") + + +TESTS = ( + test_ssl_der_eof_single_cert, + test_ssl_der_rejects_trailing_garbage, + test_windows_default_context, + test_ctypes_external_libffi_fields, +) + + +def main() -> int: + import ssl + + print("Python:", sys.version.split()[0], "platform:", sys.platform) + print("OpenSSL:", ssl.OPENSSL_VERSION) + print() + + failed = 0 + for test in TESTS: + try: + name, status, detail = test() + except Exception: + failed += 1 + print("FAIL %s" % test.__name__) + traceback.print_exc() + print() + continue + line = "%-4s %s" % (status, name) + if detail: + line += " — %s" % detail + print(line) + if status == "FAIL": + failed += 1 + + print() + if failed: + print("%d test(s) failed" % failed) + return 1 + print("all regression checks passed") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) From 8a449e4b53fc6aa20a6c4ac19c6f2e1e4218aea7 Mon Sep 17 00:00:00 2001 From: Eric Lundby Date: Wed, 10 Jun 2026 12:08:06 -0600 Subject: [PATCH 05/11] Fix test --- recipe/regression_openssl_ctypes.py | 34 +++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/recipe/regression_openssl_ctypes.py b/recipe/regression_openssl_ctypes.py index 9889c6fe4..27d0e7837 100644 --- a/recipe/regression_openssl_ctypes.py +++ b/recipe/regression_openssl_ctypes.py @@ -42,11 +42,32 @@ def _openssl_ge(version: tuple[int, int, int]) -> bool: return tuple(map(int, m.groups())) >= version +# CPython Lib/test/capath/4e1295a3.0 (Neuronio CA). Embedded so the test does +# not depend on the stdlib test tree being installed in the conda package. +_EMBEDDED_CA_PEM = """\ +-----BEGIN CERTIFICATE----- +MIICLDCCAdYCAQAwDQYJKoZIhvcNAQEEBQAwgaAxCzAJBgNVBAYTAlBUMRMwEQYD +VQQIEwpRdWVlbnNsYW5kMQ8wDQYDVQQHEwZMaXNib2ExFzAVBgNVBAoTDk5ldXJv +bmlvLCBMZGEuMRgwFgYDVQQLEw9EZXNlbnZvbHZpbWVudG8xGzAZBgNVBAMTEmJy +dXR1cy5uZXVyb25pby5wdDEbMBkGCSqGSIb3DQEJARYMc2FtcG9AaWtpLmZpMB4X +DTk2MDkwNTAzNDI0M1oXDTk2MTAwNTAzNDI0M1owgaAxCzAJBgNVBAYTAlBUMRMw +EQYDVQQIEwpRdWVlbnNsYW5kMQ8wDQYDVQQHEwZMaXNib2ExFzAVBgNVBAoTDk5l +dXJvbmlvLCBMZGEuMRgwFgYDVQQLEw9EZXNlbnZvbHZpbWVudG8xGzAZBgNVBAMT +EmJydXR1cy5uZXVyb25pby5wdDEbMBkGCSqGSIb3DQEJARYMc2FtcG9AaWtpLmZp +MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL7+aty3S1iBA/+yxjxv4q1MUTd1kjNw +L4lYKbpzzlmC5beaQXeQ2RmGMTXU+mDvuqItjVHOK3DvPK7lTcSGftUCAwEAATAN +BgkqhkiG9w0BAQQFAANBAFqPEKFjk6T6CKTHvaQeEAsX0/8YHPHqH/9AnhSjrwuX +9EBc0n6bVGhN7XaXd6sJ7dym9sbsWxb+pJdurnkxjx4= +-----END CERTIFICATE----- +""" + + def _load_test_ca_pem() -> str: import sysconfig stdlib = sysconfig.get_path("stdlib") candidates = [ + os.path.join(stdlib, "test", "capath", "4e1295a3.0"), os.path.join(stdlib, "test", "certdata", "capath", "5ed36f99.0"), os.path.join(stdlib, "test", "certdata", "keycert.pem"), ] @@ -54,9 +75,7 @@ def _load_test_ca_pem() -> str: if os.path.isfile(path): with open(path, encoding="ascii") as f: return f.read() - raise FileNotFoundError( - "No test CA PEM found under %s; install the python test suite" % stdlib - ) + return _EMBEDDED_CA_PEM def test_ssl_der_eof_single_cert() -> tuple[str, str, str]: @@ -171,15 +190,16 @@ def main() -> int: for test in TESTS: try: name, status, detail = test() - except Exception: + except Exception as exc: failed += 1 - print("FAIL %s" % test.__name__) - traceback.print_exc() + print("FAIL %s - %s: %s" % (test.__name__, type(exc).__name__, exc)) + if os.environ.get("REGRESSION_DEBUG"): + traceback.print_exc() print() continue line = "%-4s %s" % (status, name) if detail: - line += " — %s" % detail + line += " - %s" % detail print(line) if status == "FAIL": failed += 1 From bb291571552f12c217fab0077acbf59d4bc5d630 Mon Sep 17 00:00:00 2001 From: Eric Lundby Date: Wed, 10 Jun 2026 12:13:52 -0600 Subject: [PATCH 06/11] Bump build number, build only for windows. --- recipe/meta.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 04093620f..39fd96b9b 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -4,7 +4,7 @@ {% set ver2 = '.'.join(version.split('.')[0:2]) %} {% set ver2nd = ''.join(version.split('.')[0:2]) %} {% set ver3nd = ''.join(version.split('.')[0:3]) %} -{% set build_number = "0" %} +{% set build_number = "1" %} {% set channel_targets = ('abc', 'def') %} # this makes the linter happy @@ -95,6 +95,8 @@ source: build: number: {{ build_number }} + # TODO: Debug jsut windows for now. + skip: true # [not win] requirements: build: From 028301b478886ebab729396f31989528f099c6f6 Mon Sep 17 00:00:00 2001 From: Eric Lundby Date: Wed, 10 Jun 2026 12:24:50 -0600 Subject: [PATCH 07/11] Make it fail. --- recipe/meta.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 39fd96b9b..66637367b 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -89,7 +89,7 @@ source: {% endif %} - patches/0027-Unvendor-expat.patch # https://github.com/python/cpython/pull/100373 (OpenSSL 3.5.7 Windows cert-store fix) - - patches/0028-Fix-ssl-DER-EOF-detection-for-openssl-3.5.7.patch + # - patches/0028-Fix-ssl-DER-EOF-detection-for-openssl-3.5.7.patch # https://github.com/python/cpython/pull/29791 - patches/0029-Fix-ctypes-fielddesc-init-for-external-libffi.patch From 72c98bae432fbc8a09068cde6ddd85eb62f1d714 Mon Sep 17 00:00:00 2001 From: Eric Lundby Date: Wed, 10 Jun 2026 19:15:27 -0600 Subject: [PATCH 08/11] Revert "Make it fail." This reverts commit 028301b478886ebab729396f31989528f099c6f6. --- recipe/meta.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 66637367b..39fd96b9b 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -89,7 +89,7 @@ source: {% endif %} - patches/0027-Unvendor-expat.patch # https://github.com/python/cpython/pull/100373 (OpenSSL 3.5.7 Windows cert-store fix) - # - patches/0028-Fix-ssl-DER-EOF-detection-for-openssl-3.5.7.patch + - patches/0028-Fix-ssl-DER-EOF-detection-for-openssl-3.5.7.patch # https://github.com/python/cpython/pull/29791 - patches/0029-Fix-ctypes-fielddesc-init-for-external-libffi.patch From 0bc96a6709394874f954f0d7d8d1f2c1b8c246cb Mon Sep 17 00:00:00 2001 From: Eric Lundby Date: Wed, 10 Jun 2026 20:14:41 -0600 Subject: [PATCH 09/11] Simplify test. --- recipe/meta.yaml | 4 - recipe/regression_openssl_ctypes.py | 216 ---------------------------- recipe/run_test.py | 5 + 3 files changed, 5 insertions(+), 220 deletions(-) delete mode 100644 recipe/regression_openssl_ctypes.py diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 39fd96b9b..1be3829b7 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -95,8 +95,6 @@ source: build: number: {{ build_number }} - # TODO: Debug jsut windows for now. - skip: true # [not win] requirements: build: @@ -241,7 +239,6 @@ outputs: - tests/cython/* - tests/prefix-replacement/* - run_test.py - - regression_openssl_ctypes.py commands: - echo on # [win] - set # [win] @@ -293,7 +290,6 @@ outputs: - popd - popd - python run_test.py - - python regression_openssl_ctypes.py - test ! -f default.profraw # [osx] # Test workaround for https://github.com/conda/conda/issues/10969 - test -d "$PREFIX/lib/python3.1/site-packages" # [unix] diff --git a/recipe/regression_openssl_ctypes.py b/recipe/regression_openssl_ctypes.py deleted file mode 100644 index 27d0e7837..000000000 --- a/recipe/regression_openssl_ctypes.py +++ /dev/null @@ -1,216 +0,0 @@ -#!/usr/bin/env python3 -"""Regression checks for openssl 3.5.7 + external libffi feedstock patches. - -Patches exercised: - 0028 DER EOF handling in _ssl.c (OpenSSL 3.5.7 returns NOT_ENOUGH_DATA at EOF) - 0015/0029 _ctypes with external libffi on Windows - -Demonstrating the SSL failure (vanilla Python 3.10 + openssl >= 3.5.7, without 0028): - - 1. Build/install Python with patches 0001-0027 only (omit 0028). - 2. Run: python regression_openssl_ctypes.py - 3. Expect: FAIL ssl_der_eof_single_cert (SSLError: not enough data) - -After applying 0028 and rebuilding, the same command should report all PASS. - -The stdlib unittest added by 0028 can also be run directly: - - python -m unittest test.test_ssl.ContextTests.test_load_verify_cadata -v - -On Windows, ssl.create_default_context() hits the same DER-EOF path via the -system cert store; test_windows_default_context covers that when win32. -""" - -from __future__ import annotations - -import os -import re -import sys -import traceback - - -def _result(name: str, status: str, detail: str = "") -> tuple[str, str, str]: - return name, status, detail - - -def _openssl_ge(version: tuple[int, int, int]) -> bool: - import ssl - - m = re.search(r"OpenSSL (\d+)\.(\d+)\.(\d+)", ssl.OPENSSL_VERSION) - if not m: - return False - return tuple(map(int, m.groups())) >= version - - -# CPython Lib/test/capath/4e1295a3.0 (Neuronio CA). Embedded so the test does -# not depend on the stdlib test tree being installed in the conda package. -_EMBEDDED_CA_PEM = """\ ------BEGIN CERTIFICATE----- -MIICLDCCAdYCAQAwDQYJKoZIhvcNAQEEBQAwgaAxCzAJBgNVBAYTAlBUMRMwEQYD -VQQIEwpRdWVlbnNsYW5kMQ8wDQYDVQQHEwZMaXNib2ExFzAVBgNVBAoTDk5ldXJv -bmlvLCBMZGEuMRgwFgYDVQQLEw9EZXNlbnZvbHZpbWVudG8xGzAZBgNVBAMTEmJy -dXR1cy5uZXVyb25pby5wdDEbMBkGCSqGSIb3DQEJARYMc2FtcG9AaWtpLmZpMB4X -DTk2MDkwNTAzNDI0M1oXDTk2MTAwNTAzNDI0M1owgaAxCzAJBgNVBAYTAlBUMRMw -EQYDVQQIEwpRdWVlbnNsYW5kMQ8wDQYDVQQHEwZMaXNib2ExFzAVBgNVBAoTDk5l -dXJvbmlvLCBMZGEuMRgwFgYDVQQLEw9EZXNlbnZvbHZpbWVudG8xGzAZBgNVBAMT -EmJydXR1cy5uZXVyb25pby5wdDEbMBkGCSqGSIb3DQEJARYMc2FtcG9AaWtpLmZp -MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL7+aty3S1iBA/+yxjxv4q1MUTd1kjNw -L4lYKbpzzlmC5beaQXeQ2RmGMTXU+mDvuqItjVHOK3DvPK7lTcSGftUCAwEAATAN -BgkqhkiG9w0BAQQFAANBAFqPEKFjk6T6CKTHvaQeEAsX0/8YHPHqH/9AnhSjrwuX -9EBc0n6bVGhN7XaXd6sJ7dym9sbsWxb+pJdurnkxjx4= ------END CERTIFICATE----- -""" - - -def _load_test_ca_pem() -> str: - import sysconfig - - stdlib = sysconfig.get_path("stdlib") - candidates = [ - os.path.join(stdlib, "test", "capath", "4e1295a3.0"), - os.path.join(stdlib, "test", "certdata", "capath", "5ed36f99.0"), - os.path.join(stdlib, "test", "certdata", "keycert.pem"), - ] - for path in candidates: - if os.path.isfile(path): - with open(path, encoding="ascii") as f: - return f.read() - return _EMBEDDED_CA_PEM - - -def test_ssl_der_eof_single_cert() -> tuple[str, str, str]: - """Single DER cert ending at buffer EOF (core 0028 regression).""" - name = "ssl_der_eof_single_cert" - if not _openssl_ge((3, 5, 7)): - import ssl - - return _result(name, "SKIP", "OpenSSL %s < 3.5.7" % ssl.OPENSSL_VERSION) - - import ssl - - cacert_der = ssl.PEM_cert_to_DER_cert(_load_test_ca_pem()) - ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) - try: - ctx.load_verify_locations(cadata=cacert_der) - except ssl.SSLError as exc: - msg = str(exc) - if "NOT_ENOUGH_DATA" in msg or "not enough data" in msg.lower(): - return _result( - name, - "FAIL", - "%s (apply patch 0028)" % exc, - ) - raise - return _result(name, "PASS", "load_verify_locations accepted DER cadata at EOF") - - -def test_ssl_der_rejects_trailing_garbage() -> tuple[str, str, str]: - """DER cert followed by non-EOF byte must raise SSLError (0028 test_ssl addition).""" - name = "ssl_der_rejects_trailing_garbage" - if not _openssl_ge((3, 5, 7)): - import ssl - - return _result(name, "SKIP", "OpenSSL %s < 3.5.7" % ssl.OPENSSL_VERSION) - - import ssl - - cacert_der = ssl.PEM_cert_to_DER_cert(_load_test_ca_pem()) - ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) - try: - ctx.load_verify_locations(cadata=cacert_der + b"A") - except ssl.SSLError: - return _result(name, "PASS", "trailing byte correctly rejected") - return _result(name, "FAIL", "expected SSLError for DER cert + trailing byte") - - -def test_windows_default_context() -> tuple[str, str, str]: - """Windows cert store loads DER via load_verify_locations(cadata=...).""" - name = "windows_default_context" - if sys.platform != "win32": - return _result(name, "SKIP", "Windows only") - if not _openssl_ge((3, 5, 7)): - import ssl - - return _result(name, "SKIP", "OpenSSL %s < 3.5.7" % ssl.OPENSSL_VERSION) - - import ssl - - try: - ssl.create_default_context() - except ssl.SSLError as exc: - msg = str(exc) - if "NOT_ENOUGH_DATA" in msg or "not enough data" in msg.lower(): - return _result( - name, - "FAIL", - "%s (apply patch 0028)" % exc, - ) - raise - return _result(name, "PASS", "create_default_context() succeeded") - - -def test_ctypes_external_libffi_fields() -> tuple[str, str, str]: - """Exercise ctypes Structure field descriptors (0029 / gh-29791).""" - name = "ctypes_external_libffi_fields" - import ctypes - - class Record(ctypes.Structure): - _fields_ = [ - ("d", ctypes.c_double), - ("q", ctypes.c_longlong), - ("p", ctypes.c_void_p), - ("h", ctypes.c_short), - ] - - rec = Record() - rec.d = 2.5 - rec.q = 1 << 40 - rec.h = -3 - if rec.d != 2.5 or rec.q != 1 << 40 or rec.h != -3: - return _result(name, "FAIL", "field round-trip mismatch") - return _result(name, "PASS", "Structure fields with external libffi OK") - - -TESTS = ( - test_ssl_der_eof_single_cert, - test_ssl_der_rejects_trailing_garbage, - test_windows_default_context, - test_ctypes_external_libffi_fields, -) - - -def main() -> int: - import ssl - - print("Python:", sys.version.split()[0], "platform:", sys.platform) - print("OpenSSL:", ssl.OPENSSL_VERSION) - print() - - failed = 0 - for test in TESTS: - try: - name, status, detail = test() - except Exception as exc: - failed += 1 - print("FAIL %s - %s: %s" % (test.__name__, type(exc).__name__, exc)) - if os.environ.get("REGRESSION_DEBUG"): - traceback.print_exc() - print() - continue - line = "%-4s %s" % (status, name) - if detail: - line += " - %s" % detail - print(line) - if status == "FAIL": - failed += 1 - - print() - if failed: - print("%d test(s) failed" % failed) - return 1 - print("all regression checks passed") - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/recipe/run_test.py b/recipe/run_test.py index ba08c9681..44bec425c 100644 --- a/recipe/run_test.py +++ b/recipe/run_test.py @@ -98,3 +98,8 @@ print('OPENSSL_VERSION:', ssl.OPENSSL_VERSION) CONDA_OPENSSL_VERSION = os.getenv("openssl") assert CONDA_OPENSSL_VERSION in ssl.OPENSSL_VERSION +# xref https://github.com/conda-forge/openssl-feedstock/issues/237 +pem = ssl.get_server_certificate(("pypi.org", 443)) +der = ssl.PEM_cert_to_DER_cert(pem) +ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) +ctx.load_verify_locations(cadata=der) From ef9dc56ea5e4594e89cc15e59252cc28628b504e Mon Sep 17 00:00:00 2001 From: Eric Lundby Date: Thu, 11 Jun 2026 08:46:16 -0600 Subject: [PATCH 10/11] Use local cert instead of external request. --- recipe/run_test.py | 3 ++- recipe/test-cert.pem | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 recipe/test-cert.pem diff --git a/recipe/run_test.py b/recipe/run_test.py index 44bec425c..fa6178e69 100644 --- a/recipe/run_test.py +++ b/recipe/run_test.py @@ -99,7 +99,8 @@ CONDA_OPENSSL_VERSION = os.getenv("openssl") assert CONDA_OPENSSL_VERSION in ssl.OPENSSL_VERSION # xref https://github.com/conda-forge/openssl-feedstock/issues/237 -pem = ssl.get_server_certificate(("pypi.org", 443)) +from pathlib import Path +pem = Path(__file__).with_name("test-cert.pem").read_text() der = ssl.PEM_cert_to_DER_cert(pem) ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) ctx.load_verify_locations(cadata=der) diff --git a/recipe/test-cert.pem b/recipe/test-cert.pem new file mode 100644 index 000000000..2db63fd81 --- /dev/null +++ b/recipe/test-cert.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDKTCCAhGgAwIBAgIUbmuRNVmcGqJIEKm2YojxPMGv7OkwDQYJKoZIhvcNAQEL +BQAwJDEiMCAGA1UEAwwZcHl0aG9uLWZlZWRzdG9jay1zc2wtdGVzdDAeFw0yNjA2 +MTExNDQwMDJaFw0zNjA2MDgxNDQwMDJaMCQxIjAgBgNVBAMMGXB5dGhvbi1mZWVk +c3RvY2stc3NsLXRlc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCu +d7c1PE1tTme8XuK+8DlKILUR3FluP6O4R2EbAej2zPSwtcLjyf7T2KCh/HJPlU8F ++QNq4UXoyAalNe0QImcdAb9oaBBwQWtZCNqQ9vKKF8mg/UTEskRwcWrbFl4ZUhAP +k3xjTBflr16WbrPcffLQsTs6cwDhYRJ/1xHaX0Q0cSWqmpkbysdgLcixmKhl80HJ +unIUxO7speyf6yGS8IFymGPPt3b5DPaDgdLnvi5CQ+SRLxICPSec8SysAR+6e2tu +sDHQOm8YjDvHb5Ujbbogq1XogTca7BeaDVxd/z/FJDRVO9qfWBGaRQ9UeZ+peAgC +wfLG1zMgq21J2tEYiK7bAgMBAAGjUzBRMB0GA1UdDgQWBBS6aBjsrBctsIr+wygb +XyCTepLDXTAfBgNVHSMEGDAWgBS6aBjsrBctsIr+wygbXyCTepLDXTAPBgNVHRMB +Af8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA/goYzC7BEwVdfJ5ordI8YhzWH +V3DOcsbAympVsWF6Ra8qa6TXEEHhsYyIwB50aw62ccWZoyIexc+Lx3H/NmjrPHXo +YD+341ORMjZTBsk/MHlf5ex0s+m9MJVNh2IfCanBc6k9kDYZNRd4YF2hdJTsqoxV +QByMLRRfrzg2VZHdEk3whGXD9C/36NML22oTRwWefAmV+jyJyjMgis4cjnaZVxpn +iT3joMkOreswCvo4O2tAlEfR81MvNu80GajckTtMMq7VWxf2t8OdLdoXLUJrY27Y +pDp5BoTJ+52YJP6kz2gIanevw4Z2XE6otP2VX6Anaydf4fiJSMVJDTl3eXB/ +-----END CERTIFICATE----- From 792b3a8628573f32086a8174c1dcbaeb04c6e4c7 Mon Sep 17 00:00:00 2001 From: Eric Lundby Date: Thu, 11 Jun 2026 08:47:41 -0600 Subject: [PATCH 11/11] Update meta.yaml --- recipe/meta.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 1be3829b7..5569aed23 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -239,6 +239,7 @@ outputs: - tests/cython/* - tests/prefix-replacement/* - run_test.py + - test-cert.pem commands: - echo on # [win] - set # [win]