changeset 31:baeb8bdeff3a

Fortify sources using _FORTIFY_SOURCE=3 and also apply -fno-delete-null-pointer-checks. See: https://github.com/ossf/wg-best-practices-os-developers/issues/659.
author Franz Glasner <fzglas.hg@dom66.de>
date Sun, 21 Sep 2025 13:11:30 +0200
parents fc4555a3097b
children 72c1b70d4f5c
files Makefile.freebsd mupdf-source/Makerules mupdf-source/scripts/wrap/__main__.py pipcl.py setup.py
diffstat 5 files changed, 27 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile.freebsd	Fri Sep 19 19:59:44 2025 +0200
+++ b/Makefile.freebsd	Sun Sep 21 13:11:30 2025 +0200
@@ -51,6 +51,17 @@
 #CC=	$(CLANG_DIR)/bin/clang
 #CXX=	$(CLANG_DIR)/bin/clang++
 
+# Define _FORTIFY_SOURCE=$(FORTIFY) (if != 0, default 0)
+FORTIFY?=	3
+#
+# If != 0 (default 1):
+#    -fno-delete-null-pointer-checks
+#
+#       Should always be done when fortifying:
+#       https://github.com/ossf/wg-best-practices-os-developers/issues/659
+#
+EXTRA_CHECKS?=	1
+
 
 all: sdist wheel
 
@@ -61,7 +72,7 @@
 	$(TEST) -e $(firstword $(PYTHON_PREFIXES))/bin/cc || $(SYMLINK) $(CLANG_DIR)/bin/clang $(firstword $(PYTHON_PREFIXES))/bin/cc
 	$(TEST) -e $(firstword $(PYTHON_PREFIXES))/bin/c++ || $(SYMLINK) $(CLANG_DIR)/bin/clang++ $(firstword $(PYTHON_PREFIXES))/bin/c++
 	$(TEST) -e $(firstword $(PYTHON_PREFIXES))/bin/ld || $(SYMLINK) $(CLANG_DIR)/bin/ld.lld $(firstword $(PYTHON_PREFIXES))/bin/ld
-	PIPCL_VERBOSE=2 LIBCLANG_LIBRARY_PATH=$(LIBCLANG_LIBRARY_PATH) PYMUPDF_SETUP_MUPDF_BUILD=$(PYMUPDF_SETUP_MUPDF_BUILD) PYMUPDF_SETUP_MUPDF_TESSERACT=$(PYMUPDF_SETUP_MUPDF_TESSERACT) $(PYTHON) -m build --wheel --verbose --no-isolation
+	FORTIFY=$(FORTIFY) EXTRA_CHECKS=$(EXTRA_CHECKS) PIPCL_VERBOSE=2 LIBCLANG_LIBRARY_PATH=$(LIBCLANG_LIBRARY_PATH) PYMUPDF_SETUP_MUPDF_BUILD=$(PYMUPDF_SETUP_MUPDF_BUILD) PYMUPDF_SETUP_MUPDF_TESSERACT=$(PYMUPDF_SETUP_MUPDF_TESSERACT) $(PYTHON) -m build --wheel --verbose --no-isolation
 
 
 sdist: check
--- a/mupdf-source/Makerules	Fri Sep 19 19:59:44 2025 +0200
+++ b/mupdf-source/Makerules	Sun Sep 21 13:11:30 2025 +0200
@@ -105,6 +105,10 @@
   CFLAGS += -ffunction-sections -fdata-sections
 endif
 
+ifneq ($(EXTRA_CHECKS),0)
+  CFLAGS += -fno-delete-null-pointer-checks
+endif
+
 ifeq ($(OS),Darwin)
   LDREMOVEUNREACH := -Wl,-dead_strip
   SO := dylib
--- a/mupdf-source/scripts/wrap/__main__.py	Fri Sep 19 19:59:44 2025 +0200
+++ b/mupdf-source/scripts/wrap/__main__.py	Sun Sep 21 13:11:30 2025 +0200
@@ -1541,6 +1541,8 @@
 
     dir_so_flags = os.path.basename( build_dirs.dir_so).split( '-')
     cflags = os.environ.get('XCXXFLAGS', '')
+    if os.environ.get('EXTRA_CHECKS', '1') != '0':
+        cflags += ' -fno-delete-null-pointer-checks'
 
     windows_build_type = build_dirs.windows_build_type()
     so_version = get_so_version( build_dirs)
--- a/pipcl.py	Fri Sep 19 19:59:44 2025 +0200
+++ b/pipcl.py	Sun Sep 21 13:11:30 2025 +0200
@@ -1767,6 +1767,8 @@
             general_flags += ' -g'
         if optimise:
             general_flags += ' -O2 -DNDEBUG'
+        if os.environ.get('EXTRA_CHECKS', '1') != '0':
+            general_flags += ' -fno-delete-null-pointer-checks'
 
         py_limited_api3 = f'-DPy_LIMITED_API={py_limited_api2}' if py_limited_api2 else ''
 
--- a/setup.py	Fri Sep 19 19:59:44 2025 +0200
+++ b/setup.py	Sun Sep 21 13:11:30 2025 +0200
@@ -967,6 +967,10 @@
         log( f'Setting XCFLAGS and XCXXFLAGS to predefine TOFU_CJK_EXT.')
         env_add(env, 'XCFLAGS', '-DTOFU_CJK_EXT')
         env_add(env, 'XCXXFLAGS', '-DTOFU_CJK_EXT')
+        fortify = os.environ.get('FORTIFY', '0')
+        if fortify != '0':
+            env_add(env, 'XCFLAGS', f'-D_FORTIFY_SOURCE={fortify}')
+            env_add(env, 'XCXXFLAGS', f'-D_FORTIFY_SOURCE={fortify}')
 
     if openbsd or freebsd:
         env_add(env, 'CXX', 'c++', ' ')
@@ -1192,6 +1196,9 @@
     debug = 'debug' in mupdf_build_dir_flags
     r_extra = ''
     defines = list()
+    fortify = os.environ.get('FORTIFY', '0')
+    if fortify != '0':
+        defines.append(f'_FORTIFY_SOURCE={fortify}')
     if windows:
         defines.append('FZ_DLL_CLIENT')
         wp = pipcl.wdev.WindowsPython()