Blob Blame History Raw
# Expects VULNS_GIT environment variable with a clone of https://git.kernel.org/pub/scm/linux/security/vulns.git
# Expects KSOURCE_GIT environment variable
mk_dir := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))

# URL of upstream vulns
VULNS_GIT_URL=https://git.kernel.org/pub/scm/linux/security/vulns.git

# URL of CVE
CVE2BUG_URL=https://gitlab.suse.de/security/cve-database/-/raw/master/data/cve2bugzilla

# cached data expiration in days
EXPIRE=3

ADD_REF=$(mk_dir)/add-missing-reference

# oldest stable 4.19 when kernel.org CNA started is from 2018
FIRST_YEAR=2018
# Outer parameter, can be overriden
YEAR=$(shell date +%Y)
# Outer parameter, can be overriden
BRANCH=cve/linux-5.14
branch=$(subst /,_,$(BRANCH))

.PHONY: check_cache update_refs_history update_refs_$(branch)_$(YEAR)

CACHESTAMP=cachestamp

check_cache:
	@test -n "$$(find "$(CACHESTAMP)" -mtime -$(EXPIRE) -print 2>/dev/null)" || touch "$(CACHESTAMP)"

$(CACHESTAMP): check_cache

cve2bugzilla: $(CACHESTAMP)
	curl "$(CVE2BUG_URL)" >"$@"

hash_cve_$(YEAR).dat: $(wildcard $(VULNS_GIT)/cve/published/$(YEAR)/*.sha1) $(VULNS_GIT)/.git/refs/heads/master
	for f in $^ ; do \
		[[ $$f == *.sha1 ]] && \
			echo $$(head -n1 $$f) $$(basename $${f%.sha1}) ; \
	done | sort -k1 >"$@"

$(wildcard $(VULNS_GIT)/cve/published/$(YEAR)/*.sha1): $(VULNS_GIT)/.git/refs/heads/master

$(VULNS_GIT)/.git/refs/heads/master: $(CACHESTAMP)
	test -d $(VULNS_GIT) || git clone "$(VULNS_GIT_URL)" "$(VULNS_GIT)"
	git --git-dir="$(VULNS_GIT)/.git" pull
	touch "$@"

# cve2bugzilla contains multiple bugs for single CVE, use the heuristics of
# lowest numerical bug being the primary bug
cve_bug_$(YEAR).dat: cve2bugzilla
	sed -n '/^CVE-$(YEAR)-.*BUGZILLA:/{s/^\(CVE-[^,]*\),.*BUGZILLA:\([0-9]*\).*$$/\1 \2/;p}' <"$<" | \
	sort -n -k 2 | sort -k 1b,1 -s | uniq | \
	awk '{ primary_bug=$$1 != cve; cve=$$1; print $$0, primary_bug; }' >"$@"

hash_file_$(branch).dat:
	git --git-dir="$(KSOURCE_GIT)/.git" --work-tree="$(KSOURCE_GIT)" grep -i "^git-commit[[:space:]]*:[[:space:]]*" origin/$(BRANCH) -- "$(KSOURCE_GIT)/patches.suse" |\
		awk -vFS=":" '{gsub(" ", "", $$4); print $$4, $$2}' | sort -k1 >"$@"

hash_cve_bug_$(YEAR).dat: hash_cve_$(YEAR).dat cve_bug_$(YEAR).dat
	sort -k 2b,2 hash_cve_$(YEAR).dat | \
	join -1 2 -2 1 -o 1.1,1.2,2.2,2.3 - cve_bug_$(YEAR).dat | \
	sort -k 1 >"$@"

update_refs: update_refs_$(branch)_$(YEAR)

update_refs_history:
	set -e; pushd "$(KSOURCE_GIT)" >/dev/null ; \
	git checkout -f -B users/$$USER/$(BRANCH)/cve-refs origin/$(BRANCH) 2>/dev/null ; \
	popd >/dev/null
	for y in $$(seq $(FIRST_YEAR) $(YEAR)) ; do \
		make -f $(mk_dir)/Makefile BRANCH=$(BRANCH) YEAR=$$y update_refs ; \
	done

update_refs_$(branch)_$(YEAR): hash_file_$(branch).dat hash_cve_bug_$(YEAR).dat
	set -e ; \
	join hash_file_$(branch).dat hash_cve_bug_$(YEAR).dat | \
	while read sha file cve bug primary; do \
		[ "$$primary" -eq 0 ] && continue ; \
		[ -z "$$bug" ] && echo "Unknown bug for $$cve" && continue ; \
		$(ADD_REF) -r $$cve -r "bsc#"$$bug "$(KSOURCE_GIT)/$$file" ; \
	done
	set -e ; pushd "$(KSOURCE_GIT)" >/dev/null ; \
	scripts/log2 --no-edit || true ; \
	popd >/dev/null

clean:
	rm -f *_$(branch).dat
	for y in $$(seq $(FIRST_YEAR) $(YEAR)) ; do \
		rm -f *_$$y.dat ; \
	done