summaryrefslogtreecommitdiff
path: root/backport-elf-ldconfig-should-skip-temporary-files-created-by-.patch
diff options
context:
space:
mode:
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-.patch76
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
+