diff options
Diffstat (limited to 'backport-ldconfig-Fixes-for-skipping-temporary-files.patch')
-rw-r--r-- | backport-ldconfig-Fixes-for-skipping-temporary-files.patch | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/backport-ldconfig-Fixes-for-skipping-temporary-files.patch b/backport-ldconfig-Fixes-for-skipping-temporary-files.patch new file mode 100644 index 0000000..1fa1061 --- /dev/null +++ b/backport-ldconfig-Fixes-for-skipping-temporary-files.patch @@ -0,0 +1,68 @@ +From cfb5a97a93ea656e3b2263e42142a4032986d9ba Mon Sep 17 00:00:00 2001 +From: Florian Weimer <fweimer@redhat.com> +Date: Mon, 23 Oct 2023 12:53:16 +0200 +Subject: [PATCH] ldconfig: Fixes for skipping temporary files. + +Arguments to a memchr call were swapped, causing incorrect skipping +of files. + +Files related to dpkg have different names: they actually end in +.dpkg-new and .dpkg-tmp, not .tmp as I mistakenly assumed. + +Fixes commit 2aa0974d2573441bffd59 ("elf: ldconfig should skip +temporary files created by package managers"). + +Reference:https://sourceware.org/git/?p=glibc.git;a=commit;h=cfb5a97a93ea656e3b2263e42142a4032986d9ba +--- + elf/ldconfig.c | 19 +++++++++++++++---- + 1 file changed, 15 insertions(+), 4 deletions(-) + +diff --git a/elf/ldconfig.c b/elf/ldconfig.c +index 73b5ef27..5812a951 100644 +--- a/elf/ldconfig.c ++++ b/elf/ldconfig.c +@@ -746,6 +746,17 @@ struct dlib_entry + struct dlib_entry *next; + }; + ++/* Return true if the N bytes at NAME end with with the characters in ++ the string SUFFIX. (NAME[N + 1] does not have to be a null byte.) ++ Expected to be called with a string literal for SUFFIX. */ ++static inline bool ++endswithn (const char *name, size_t n, const char *suffix) ++{ ++ return (n >= strlen (suffix) ++ && memcmp (name + n - strlen (suffix), suffix, ++ strlen (suffix)) == 0); ++} ++ + /* Skip some temporary DSO files. These files may be partially written + and lead to ldconfig crashes when examined. */ + static bool +@@ -755,8 +766,7 @@ skip_dso_based_on_name (const char *name, size_t len) + names like these are never really DSOs we want to look at. */ + if (len >= sizeof (".#prelink#") - 1) + { +- if (strcmp (name + len - sizeof (".#prelink#") + 1, +- ".#prelink#") == 0) ++ if (endswithn (name, len, ".#prelink#")) + return true; + if (len >= sizeof (".#prelink#.XXXXXX") - 1 + && memcmp (name + len - sizeof (".#prelink#.XXXXXX") +@@ -764,10 +774,11 @@ skip_dso_based_on_name (const char *name, size_t len) + return true; + } + /* Skip temporary files created by RPM. */ +- if (memchr (name, len, ';') != NULL) ++ if (memchr (name, ';', len) != NULL) + return true; + /* Skip temporary files created by dpkg. */ +- if (len > 4 && memcmp (name + len - 4, ".tmp", 4) == 0) ++ if (endswithn (name, len, ".dpkg-new") ++ || endswithn (name, len, ".dpkg-tmp")) + return true; + return false; + } +-- +2.33.0 + |