Pass the correct stat to backup files

(cherry picked from commit 607c7bbf3f50e192cdf51812fb145f0335f52f6f)
This commit is contained in:
kouwenqi 2024-05-22 09:39:18 +08:00 committed by openeuler-sync-bot
parent ebed3e3256
commit e6399aa594
2 changed files with 67 additions and 1 deletions

View File

@ -0,0 +1,62 @@
From c835ecc67b7e37c0d0b7dd7e032209fdaa285808 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Wed, 6 Apr 2022 10:48:35 +0200
Subject: [PATCH] Pass the correct stat to backup files
The last case to call output_file() in the main loop is
output_file (outname, NULL, &tmpoutst, NULL, NULL,
file_type | 0, backup);
and this essentially means to create a backup file (where to=NULL)
only if backup=true, and does nothing else.
And, in the current code, the passed file stat (&tmpoutst) is a file
stat of the temporary file that has been processed, not the original
file (outname) to be backed up. When the backup is performed
immediately, this is no big problem. However, output_file() may
schedule the deferred handling, and the given file may be backed up at
a later point. The problem is that create_backup() tries to avoid the
backup of the same file twice, and it checks the given stat i-node
number in the hash list. Since it's a stat of a temporary file, the
same i-node number may be reused once a temp file is deleted and
another is created. This results in a false-positive detection of the
already existing file, eventually missing a backup file.
This patch attempts to address the issue:
- Modify the condition for better understanding, clearly indicating
that the code there is for creating a backup file
- Pass the stat of the original file instead of a temporary file
BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1198106
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
src/patch.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/src/patch.c b/src/patch.c
index 9684794..5a61241 100644
--- a/src/patch.c
+++ b/src/patch.c
@@ -622,9 +622,16 @@ main (int argc, char **argv)
output_file (NULL, NULL, NULL, inname, &instat,
mode, backup);
}
- else
- output_file (outname, NULL, &tmpoutst, NULL, NULL,
- file_type | 0, backup);
+ else if (backup)
+ {
+ struct stat outstat;
+
+ if (stat_file (outname, &outstat, NULL) != 0)
+ say ("Cannot stat file %s, skipping backup\n", outname);
+ else
+ output_file (outname, NULL, &outstat, NULL, NULL,
+ file_type | 0, true);
+ }
}
}
}
--
2.23.0

View File

@ -1,6 +1,6 @@
Name: patch Name: patch
Version: 2.7.6 Version: 2.7.6
Release: 13 Release: 14
Summary: Utiliity which applies a patch file to original files. Summary: Utiliity which applies a patch file to original files.
License: GPLv3+ License: GPLv3+
URL: http://www.gnu.org/software/patch/patch.html URL: http://www.gnu.org/software/patch/patch.html
@ -14,6 +14,7 @@ Patch5: Fix-swapping-fake-lines-in-pch_swap.patch
Patch6: CVE-2018-20969-and-CVE-2019-13638.patch Patch6: CVE-2018-20969-and-CVE-2019-13638.patch
Patch7: CVE-2019-13636.patch Patch7: CVE-2019-13636.patch
Patch8: patch-selinux.patch Patch8: patch-selinux.patch
Patch9: backport-Pass-the-correct-stat-to-backup-files.patch
BuildRequires: gcc libselinux-devel libattr-devel ed BuildRequires: gcc libselinux-devel libattr-devel ed
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-root Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-root
@ -56,6 +57,9 @@ CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE"
%{_mandir}/man1/* %{_mandir}/man1/*
%changelog %changelog
* Wed May 22 2024 kouwenqi <kouwenqi@kylinos.cn> - 2.7.6-14
- Pass the correct stat to backup files
* Wed Oct 19 2022 fuanan <fuanan3@h-partners.com> - 2.7.6-13 * Wed Oct 19 2022 fuanan <fuanan3@h-partners.com> - 2.7.6-13
- optimize check by running make in parallel - optimize check by running make in parallel