]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
klp-build: Fix checksum comparison for changed offsets
authorJosh Poimboeuf <jpoimboe@kernel.org>
Sat, 11 Apr 2026 04:49:56 +0000 (21:49 -0700)
committerJosh Poimboeuf <jpoimboe@kernel.org>
Tue, 5 May 2026 04:16:02 +0000 (21:16 -0700)
The klp-build -f/--show-first-changed feature uses diff to compare
checksum log lines between original and patched objects.  However, diff
compares entire lines, including the offset field.  When a function is
at a different section offset, the offset field differs even though the
instruction checksum is identical, causing the wrong instruction to be
printed.

Only compare the checksum field when looking for the first changed
instruction.  Also print both the original and patched offsets when they
differ.

Fixes: 78be9facfb5e ("livepatch/klp-build: Add --show-first-changed option to show function divergence")
Acked-by: Song Liu <song@kernel.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
scripts/livepatch/klp-build

index e19d93b78fcba047aa1c59ce65a906d860a965c4..8f0ea56f2640059b8e4e6b7db6e1eedd50d0caf6 100755 (executable)
@@ -727,13 +727,29 @@ diff_checksums() {
                )
 
                for func in ${funcs[$file]}; do
-                       diff <( grep0 -E "^DEBUG: .*checksum: $func " "$orig_log"    | sed "s|$ORIG_DIR/||")    \
-                            <( grep0 -E "^DEBUG: .*checksum: $func " "$patched_log" | sed "s|$PATCHED_DIR/||") \
-                               | gawk '/^< DEBUG: / {
-                                       gsub(/:/, "")
-                                       printf "%s: %s: %s\n", $3, $5, $6
-                                       exit
-                       }' || true
+                       local -a orig patched
+                       paste <(grep0 -E "^DEBUG: .*checksum: $func " "$orig_log") \
+                             <(grep0 -E "^DEBUG: .*checksum: $func " "$patched_log") |
+                       while IFS= read -r line; do
+                               read -ra orig <<< "${line%%$'\t'*}"
+                               read -ra patched <<< "${line#*$'\t'}"
+
+                               if [[ ${#patched[@]} -eq 0 ]]; then
+                                       printf "%s: %s: %s (removed)\n" "${orig[1]%:}" "${orig[3]}" "${orig[-2]}"
+                                       break
+                               elif [[ ${#orig[@]} -eq 0 ]]; then
+                                       printf "%s: %s: %s (added)\n" "${patched[1]%:}" "${patched[3]}" "${patched[-2]}"
+                                       break
+                               fi
+
+                               [[ "${orig[-1]}" == "${patched[-1]}" ]] && continue
+
+                               printf "%s: %s: %s" "${orig[1]%:}" "${orig[3]}" "${orig[-2]}"
+                               [[ "${orig[-2]}" != "${patched[-2]}" ]] && \
+                                       printf " (patched: %s)" "${patched[-2]}"
+                               printf "\n"
+                               break
+                       done || true
                done
        done
 }