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

If such "drift" 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 fd104ace29e6..5367d573b94b 100755
--- a/scripts/livepatch/klp-build
+++ b/scripts/livepatch/klp-build
@@ -369,11 +369,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"
+               die "$patch did not apply"
+       elif [[ "$output" =~ $drift_regex ]]; then
+               warn "$patch applied with drift"
+               echo "$output"
+       fi
 
+       patch -d "$SRC" -p1 --no-backup-if-mismatch -r /dev/null 
"${extra_args[@]}" --silent < "$patch"
        APPLIED_PATCHES+=("$patch")
 }
 
@@ -392,10 +405,11 @@ revert_patch() {
 }
 
 apply_patches() {
+       local extra_args=("$@")
        local patch
 
        for patch in "${PATCHES[@]}"; do
-               apply_patch "$patch"
+               apply_patch "$patch" "${extra_args[@]}"
        done
 }
 
@@ -453,7 +467,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"
 
@@ -826,7 +840,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