From 638061bbe7f6823257889db3cefa8f973d4cdae0 Mon Sep 17 00:00:00 2001 From: nettingsisyphus Date: Thu, 17 Dec 2020 19:12:21 +0800 Subject: [PATCH] Call process_digest_list before files are added --- ...ss_digest_list-after-files-are-added.patch | 115 ++++++++++++++++++ rpm.spec | 9 +- 2 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 call-process_digest_list-after-files-are-added.patch diff --git a/call-process_digest_list-after-files-are-added.patch b/call-process_digest_list-after-files-are-added.patch new file mode 100644 index 0000000..4809b58 --- /dev/null +++ b/call-process_digest_list-after-files-are-added.patch @@ -0,0 +1,115 @@ +From 641ec5a50cb5057e02c4cfe7bd537a32fafdd665 Mon Sep 17 00:00:00 2001 +From: Roberto Sassu +Date: Mon, 26 Oct 2020 12:10:31 +0800 +Subject: [PATCH] call process_digest_list after files are added + +Signed-off-by: Anakin Zhang +--- + plugins/digest_list.c | 78 ++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 69 insertions(+), 9 deletions(-) + +diff --git a/plugins/digest_list.c b/plugins/digest_list.c +index 9fcb5c4..7213b41 100644 +--- a/plugins/digest_list.c ++++ b/plugins/digest_list.c +@@ -479,28 +479,88 @@ out: + return ret; + } + ++rpmte cur_te; ++int digest_list_counter; ++ + static rpmRC digest_list_psm_pre(rpmPlugin plugin, rpmte te) + { +- process_digest_list(te, 0); +- if (!strcmp(rpmteN(te), "digest-list-tools")) +- process_digest_list(te, 1); ++ Header rpm = rpmteHeader(te); ++ rpmtd dirnames; ++ int i; ++ ++ digest_list_counter = 0; ++ ++ dirnames = rpmtdNew(); ++ headerGet(rpm, RPMTAG_DIRNAMES, dirnames, 0); ++ ++ while ((i = rpmtdNext(dirnames)) >= 0) { ++ char *dirname = (char *) rpmtdGetString(dirnames); ++ if (!strncmp(dirname, DIGEST_LIST_DEFAULT_PATH, ++ sizeof(DIGEST_LIST_DEFAULT_PATH) - 1)) ++ digest_list_counter++; ++ } + ++ rpmtdFree(dirnames); ++ ++ cur_te = te; + return RPMRC_OK; + } + +-static rpmRC digest_list_psm_post(rpmPlugin plugin, rpmte te, int res) ++static rpmRC digest_list_file_common(rpmPlugin plugin, rpmfi fi, ++ const char* path, mode_t file_mode, ++ rpmFsmOp op, int pre, int res) + { +- if (res != RPMRC_OK) ++ rpmFileAction action = XFO_ACTION(op); ++ ++ if (!digest_list_counter) ++ return RPMRC_OK; ++ ++ if (!cur_te) ++ return RPMRC_OK; ++ ++ if (!pre && res != RPMRC_OK) ++ return res; ++ ++ if ((pre && action != FA_ERASE) || ++ (!pre && action != FA_CREATE)) + return RPMRC_OK; + +- process_digest_list(te, 0); +- if (!strcmp(rpmteN(te), "digest-list-tools")) +- process_digest_list(te, 1); ++ if (digest_list_counter) { ++ if (!pre) { ++ if (!strncmp(path, DIGEST_LIST_DEFAULT_PATH, ++ sizeof(DIGEST_LIST_DEFAULT_PATH) - 1)) ++ digest_list_counter--; ++ } else { ++ digest_list_counter = 0; ++ } ++ ++ if (digest_list_counter) ++ return RPMRC_OK; ++ } ++ ++ process_digest_list(cur_te, 0); ++ if (!strcmp(rpmteN(cur_te), "digest-list-tools")) ++ process_digest_list(cur_te, 1); + + return RPMRC_OK; + } + ++static rpmRC digest_list_file_pre(rpmPlugin plugin, rpmfi fi, ++ const char* path, mode_t file_mode, ++ rpmFsmOp op) ++{ ++ return digest_list_file_common(plugin, fi, path, file_mode, op, 1, 0); ++} ++ ++static rpmRC digest_list_file_post(rpmPlugin plugin, rpmfi fi, ++ const char* path, mode_t file_mode, ++ rpmFsmOp op, int res) ++{ ++ return digest_list_file_common(plugin, fi, path, file_mode, op, 0, res); ++} ++ + struct rpmPluginHooks_s digest_list_hooks = { + .psm_pre = digest_list_psm_pre, +- .psm_post = digest_list_psm_post, ++ .fsm_file_pre = digest_list_file_pre, ++ .fsm_file_post = digest_list_file_post, + }; +-- +2.23.0 + diff --git a/rpm.spec b/rpm.spec index 81349d5..046b0db 100644 --- a/rpm.spec +++ b/rpm.spec @@ -1,6 +1,6 @@ Name: rpm Version: 4.15.1 -Release: 19 +Release: 20 Summary: RPM Package Manager License: GPLv2+ URL: http://www.rpm.org/ @@ -23,6 +23,7 @@ Patch13: Generate-digest-lists.patch Patch14: Add-digest-list-plugin.patch Patch15: Don-t-add-dist-to-release-if-it-is-already-there.patch Patch16: Use-user.digest_list-to-avoid-duplicate-processing-o.patch +Patch17: call-process_digest_list-after-files-are-added.patch BuildRequires: gcc autoconf automake libtool make gawk popt-devel openssl-devel readline-devel libdb-devel BuildRequires: zlib-devel libzstd-devel xz-devel bzip2-devel libarchive-devel ima-evm-utils-devel @@ -271,6 +272,12 @@ make check || (cat tests/rpmtests.log; exit 0) %{_mandir}/man1/gendiff.1* %changelog +* Thu Dec 17 2020 Anakin Zhang - 4.15.1-20 +- Type:bugfix +- ID:NA +- SUG:NA +- DESC:call process_digest_list before files are added + * Thu Dec 17 2020 Anakin Zhang - 4.15.1-19 - Type:bugfix - ID:NA