Thread (19 messages) flat view 19 messages, 5 authors, 9d ago
COOLING9d

[RFC PATCH v2 7/7] livepatch/klp-build: add validation for user-supplied OOT objects

From: Joe Lawrence <joe.lawrence@redhat.com>
Date: 2026-08-26 19:50:20
Subsystem: live patching, the rest · Maintainers: Josh Poimboeuf, Jiri Kosina, Miroslav Benes, Petr Mladek, Linus Torvalds

With the --orig-dir and --patched-dir options, the user performs the
respective original and patched builds manually.  Therefore it is
important to sanity check the supplied objects to the best of our
ability before entering the diff/extraction pipeline.

Add check_oot_object() and check_oot_objects() to verify:

- Each orig/ object has a matching patched/ counterpart
- At least one .text.<func> section is present, implying
  -ffunction-sections compiler flag was used
- Matching compiler versions

Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
---
 scripts/livepatch/klp-build | 47 ++++++++++++++++++++++++++++++++++---
 1 file changed, 44 insertions(+), 3 deletions(-)
diff --git a/scripts/livepatch/klp-build b/scripts/livepatch/klp-build
index e118f133e923..fc5d968fe235 100755
--- a/scripts/livepatch/klp-build
+++ b/scripts/livepatch/klp-build
@@ -982,17 +982,58 @@ build_patch_module() {
 }
 
 
+check_oot_object() {
+	local file="$1"
+
+	readelf -S "$file" 2>/dev/null | command grep -q '\.text\.' ||
+		die "$file: no .text.<func> sections found; was -ffunction-sections used?"
+}
+
+check_oot_objects() {
+	local orig_dir="$1"
+	local patched_dir="$2"
+	local -a files
+	local rel
+
+	command -v readelf &>/dev/null ||
+		die "readelf not found (required for OOT object validation)"
+
+	find "$orig_dir" -type f -name "*.o" -printf '%P\n' | mapfile -t files
+	[[ ${#files[@]} -gt 0 ]] || die "no .o files found in $orig_dir"
+
+	for rel in "${files[@]}"; do
+		[[ -f "$patched_dir/$rel" ]] ||
+			die "$rel found in orig dir but missing from patched dir"
+
+		check_oot_object "$orig_dir/$rel"
+		check_oot_object "$patched_dir/$rel"
+
+		local orig_cc patched_cc
+		orig_cc="$(readelf -p .comment "$orig_dir/$rel" 2>/dev/null | sed -n 's/.*\] *//p' | head -1)"
+		patched_cc="$(readelf -p .comment "$patched_dir/$rel" 2>/dev/null | sed -n 's/.*\] *//p' | head -1)"
+		if [[ -n "$orig_cc" && -n "$patched_cc" && "$orig_cc" != "$patched_cc" ]]; then
+			warn "$rel: compiler mismatch between orig and patched"
+			warn "  orig:    $orig_cc"
+			warn "  patched: $patched_cc"
+		fi
+	done
+
+	find "$patched_dir" -type f -name "*.o" -printf '%P\n' | while read -r rel; do
+		[[ -f "$orig_dir/$rel" ]] ||
+			warn "$rel found in patched dir but missing from orig dir"
+	done
+}
+
 setup_oot() {
 	local files=()
 	local rel
 
+	check_oot_objects "$USER_ORIG_DIR" "$USER_PATCHED_DIR"
+
 	mkdir -p "$ORIG_DIR" "$PATCHED_DIR"
 
 	find "$USER_ORIG_DIR" -type f -name "*.o" -printf '%P\n' | mapfile -t files
-	[[ ${#files[@]} -gt 0 ]] || die "no .o files found in $USER_ORIG_DIR"
 	for rel in "${files[@]}"; do
-		[[ -f "$USER_PATCHED_DIR/$rel" ]] ||
-			die "$rel found in orig dir but missing from patched dir"
 		mkdir -p "$ORIG_DIR/$(dirname "$rel")"
 		mkdir -p "$PATCHED_DIR/$(dirname "$rel")"
 		cp -f "$USER_ORIG_DIR/$rel" "$ORIG_DIR/$rel"
-- 
2.55.0
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help