diff options
Diffstat (limited to 'backport-elf-ldconfig-should-skip-temporary-files-created-by-.patch')
-rw-r--r-- | backport-elf-ldconfig-should-skip-temporary-files-created-by-.patch | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/backport-elf-ldconfig-should-skip-temporary-files-created-by-.patch b/backport-elf-ldconfig-should-skip-temporary-files-created-by-.patch new file mode 100644 index 0000000..d7fe8a7 --- /dev/null +++ b/backport-elf-ldconfig-should-skip-temporary-files-created-by-.patch @@ -0,0 +1,76 @@ +From 2aa0974d2573441bffd596b07bff8698b1f2f18c Mon Sep 17 00:00:00 2001 +From: Florian Weimer <fweimer@redhat.com> +Date: Fri, 20 Oct 2023 14:29:50 +0200 +Subject: [PATCH 1/1] elf: ldconfig should skip temporary files created by + package managers + +This avoids crashes due to partially written files, after a package +update is interrupted. + +Reference:https://sourceware.org/git/?p=glibc.git;a=commit;h=2aa0974d2573441bffd596b07bff8698b1f2f18c + +Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> +--- + elf/ldconfig.c | 39 +++++++++++++++++++++++++++------------ + 1 file changed, 27 insertions(+), 12 deletions(-) + +diff --git a/elf/ldconfig.c b/elf/ldconfig.c +index 6190e0ea..73b5ef27 100644 +--- a/elf/ldconfig.c ++++ b/elf/ldconfig.c +@@ -746,6 +746,31 @@ struct dlib_entry + struct dlib_entry *next; + }; + ++/* Skip some temporary DSO files. These files may be partially written ++ and lead to ldconfig crashes when examined. */ ++static bool ++skip_dso_based_on_name (const char *name, size_t len) ++{ ++ /* Skip temporary files created by the prelink program. Files with ++ 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) ++ return true; ++ if (len >= sizeof (".#prelink#.XXXXXX") - 1 ++ && memcmp (name + len - sizeof (".#prelink#.XXXXXX") ++ + 1, ".#prelink#.", sizeof (".#prelink#.") - 1) == 0) ++ return true; ++ } ++ /* Skip temporary files created by RPM. */ ++ if (memchr (name, len, ';') != NULL) ++ return true; ++ /* Skip temporary files created by dpkg. */ ++ if (len > 4 && memcmp (name + len - 4, ".tmp", 4) == 0) ++ return true; ++ return false; ++} + + static void + search_dir (const struct dir_entry *entry) +@@ -822,18 +847,8 @@ search_dir (const struct dir_entry *entry) + continue; + + size_t len = strlen (direntry->d_name); +- /* Skip temporary files created by the prelink program. Files with +- names like these are never really DSOs we want to look at. */ +- if (len >= sizeof (".#prelink#") - 1) +- { +- if (strcmp (direntry->d_name + len - sizeof (".#prelink#") + 1, +- ".#prelink#") == 0) +- continue; +- if (len >= sizeof (".#prelink#.XXXXXX") - 1 +- && memcmp (direntry->d_name + len - sizeof (".#prelink#.XXXXXX") +- + 1, ".#prelink#.", sizeof (".#prelink#.") - 1) == 0) +- continue; +- } ++ if (skip_dso_based_on_name (direntry->d_name, len)) ++ continue; + len += strlen (entry->path) + 2; + if (len > file_name_len) + { +-- +2.33.0 + |