Skip to content

Commit 5f55948

Browse files
committed
src/nvidia: support mangling sources with coccinelle
The sources below src/nvidia/generated/ violate type constraints enforced by grsecurity's RANDSTRUCT or PaX's RAP. Support preprocessing these via coccinelle scripts to fix these prior to compiling them. Signed-off-by: Mathias Krause <minipli@grsecurity.net>
1 parent fdef057 commit 5f55948

2 files changed

Lines changed: 95 additions & 0 deletions

File tree

src/nvidia/cocci.sh

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#!/bin/sh
2+
#
3+
# Helper to invoke spatch with optional pre- and post-processing filters and
4+
# optional additional arguments..
5+
#
6+
# Not meant to be used directly but invoked via Kbuild!
7+
#
8+
# (c) 2025,2026 Open Source Security, Inc. All Rights Reserved.
9+
10+
null_filter() {
11+
case "$1" in
12+
pre) ;;
13+
diff) cat; ;;
14+
post) ;;
15+
esac
16+
}
17+
18+
filter() {
19+
${1:-null}_filter "$2"
20+
}
21+
22+
check_prog() {
23+
BIN="$1"
24+
PKG="$2"
25+
26+
if [ -z "$(command -v $BIN 2>/dev/null)" ]; then
27+
echo >&2 "error: $BIN not found, please install $PKG!"
28+
return 1
29+
fi
30+
31+
return 0
32+
}
33+
34+
if [ $# -lt 2 ]; then
35+
echo >&2 "error: spatch file and program missing!"
36+
exit 1
37+
fi
38+
39+
SCRIPT=$1; shift
40+
SPATCH=$1; shift
41+
42+
if ! check_prog "$SPATCH" coccinelle; then
43+
echo >&2 "error: missing required programs!"
44+
exit 2
45+
fi
46+
47+
FILTER=$(echo "$SCRIPT" | sed -n 's|.*:||p')
48+
SCRIPT=${SCRIPT%:*}
49+
EXTRA_ARGS=$(sed -n 's|// options: ||p' $SCRIPT)
50+
51+
filter "$FILTER" pre
52+
$SPATCH --sp-file "$SCRIPT" "$@" $EXTRA_ARGS | filter "$FILTER" diff
53+
filter "$FILTER" post

src/nvidia/nvidia.Kbuild

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,48 @@ SRCS := $(filter-out %/gcc_helper.c,$(SRCS))
2020
SRCS := $(addprefix $(nvidia_src)/,$(SRCS))
2121
SRCS_CXX := $(addprefix $(nvidia_src)/,$(SRCS_CXX))
2222
NVIDSTRING := $(addprefix $(nvidia_src)/,g_nvid_string.c)
23+
ALL_SRCS := $(SRCS) $(SRCS_CXX) $(NVIDSTRING)
24+
25+
COCCI := $(SHELL) cocci.sh
26+
PATCH ?= patch
27+
SPATCH ?= spatch
28+
SPATCH_OPTS := --dir generated/ # mostly generated/ is interesting to us
29+
SPATCH_OPTS += -I generated/
30+
SPATCH_OPTS += --include-headers # headers should be processed (patched) too
31+
SPATCH_OPTS += --patch . # for 'patch -p1 …'
32+
SPATCH_OPTS += --smpl-spacing # don't mess with spacing too much to keep diffs small
33+
SPATCH_OPTS += --very-quiet
34+
35+
# order here is important and defines patch order too!
36+
COCCI_SCRIPTS_ARGS :=
37+
38+
COCCI_SCRIPTS := $(filter %.cocci,$(subst :, ,$(COCCI_SCRIPTS_ARGS)))
39+
COCCI_PATCHES = $(addprefix 0???-,$(COCCI_SCRIPTS:.cocci=.diff))
40+
COCCI_PATCH_MARKER := .cocci_patched
41+
42+
PATCH_CANDIDATES := $(filter $(nvidia_src)/generated/%,$(ALL_SRCS))
43+
$(addprefix $(obj)/,$(PATCH_CANDIDATES)): $(obj)/$(nvidia_src)/$(COCCI_PATCH_MARKER)
44+
45+
$(obj)/$(nvidia_src)/$(COCCI_PATCH_MARKER): $(addprefix $(obj)/$(nvidia_src)/,$(COCCI_SCRIPTS))
46+
@echo '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
47+
@echo '!!! Generating cocci patches, this may take a while. !!!'
48+
@echo '!!! DO NOT INTERRUPT, OR SOURCES WILL BE MESSED UP! !!!'
49+
@echo '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
50+
@cd $(src)/$(nvidia_src) && i=1 && \
51+
for s in $(COCCI_SCRIPTS_ARGS); do \
52+
c=$${s%:*}; \
53+
p=$$(printf "%04d-%s" $$i "$${c%.cocci}.diff"); \
54+
i=$$((i+1)); \
55+
echo " COCCI $$c"; \
56+
$(COCCI) "$$s" "$(SPATCH)" $(SPATCH_OPTS) > $$p || exit 1; \
57+
echo " PATCH $$p"; \
58+
$(PATCH) -p1 <$$p; \
59+
done
60+
@touch $@
61+
62+
# XXX: better reverse apply the patches on clean
63+
#clean-files += $(addprefix $(nvidia_src)/,$(COCCI_PATCH_MARKER) $(COCCI_PATCHES))
64+
clean-files += $(addprefix $(nvidia_src)/,pfunc.list)
2365

2466
nv-kernel-objs := $(SRCS:.c=.o)
2567
nv-kernel-objs += $(SRCS_CXX:.cpp=.o)

0 commit comments

Comments
 (0)