Capture the output of the patch command to detect when a patch applies
with fuzz or line offsets.

If such "fuzz" is detected during the validation phase, warn the user
and display the details.  This helps identify input patches that may
need refreshing against the target source tree.

Ensure that internal patch operations (such as those in refresh_patch or
during the final build phase) can still run quietly.

Signed-off-by: Joe Lawrence <[email protected]>
---
 scripts/livepatch/klp-build | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/scripts/livepatch/klp-build b/scripts/livepatch/klp-build
index 325dc4601bba..0ad7e6631314 100755
--- a/scripts/livepatch/klp-build
+++ b/scripts/livepatch/klp-build
@@ -359,11 +359,24 @@ check_unsupported_patches() {
 
 apply_patch() {
        local patch="$1"
+       shift
+       local extra_args=("$@")
+       local drift_regex="with fuzz|offset [0-9]+ line"
+       local output
+       local status
 
        [[ ! -f "$patch" ]] && die "$patch doesn't exist"
-       patch -d "$SRC" -p1 --dry-run --silent --no-backup-if-mismatch -r 
/dev/null < "$patch"
-       patch -d "$SRC" -p1 --silent --no-backup-if-mismatch -r /dev/null < 
"$patch"
+       status=0
+       output=$(patch -d "$SRC" -p1 --dry-run --no-backup-if-mismatch -r 
/dev/null "${extra_args[@]}" < "$patch" 2>&1) || status=$?
+       if [[ "$status" -ne 0 ]]; then
+               echo "$output" >&2
+               die "$patch did not apply"
+       elif [[ "$output" =~ $drift_regex ]]; then
+               echo "$output" >&2
+               warn "${patch} applied with fuzz"
+       fi
 
+       patch -d "$SRC" -p1 --no-backup-if-mismatch -r /dev/null 
"${extra_args[@]}" --silent < "$patch"
        APPLIED_PATCHES+=("$patch")
 }
 
@@ -382,10 +395,11 @@ revert_patch() {
 }
 
 apply_patches() {
+       local extra_args=("$@")
        local patch
 
        for patch in "${PATCHES[@]}"; do
-               apply_patch "$patch"
+               apply_patch "$patch" "${extra_args[@]}"
        done
 }
 
@@ -443,7 +457,7 @@ refresh_patch() {
        ( cd "$SRC" && echo "${input_files[@]}" | xargs cp --parents 
--target-directory="$tmpdir/a" )
 
        # Copy patched source files to 'b'
-       apply_patch "$patch"
+       apply_patch "$patch" "--silent"
        ( cd "$SRC" && echo "${output_files[@]}" | xargs cp --parents 
--target-directory="$tmpdir/b" )
        revert_patch "$patch"
 
@@ -816,7 +830,7 @@ fi
 if (( SHORT_CIRCUIT <= 2 )); then
        status "Fixing patch(es)"
        fix_patches
-       apply_patches
+       apply_patches "--silent"
        status "Building patched kernel"
        build_kernel "patched"
        revert_patches
-- 
2.53.0


Reply via email to