forked from rpms/glibc
		
	ldconfig should skip temporary files created by RPM (RHEL-13720)
Resolves: RHEL-13720
This commit is contained in:
		
							parent
							
								
									159c3a720f
								
							
						
					
					
						commit
						8db9f8aab0
					
				
							
								
								
									
										72
									
								
								glibc-RHEL-13720-1.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								glibc-RHEL-13720-1.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,72 @@ | |||||||
|  | commit 2aa0974d2573441bffd596b07bff8698b1f2f18c | ||||||
|  | Author: Florian Weimer <fweimer@redhat.com> | ||||||
|  | Date:   Fri Oct 20 14:29:50 2023 +0200 | ||||||
|  | 
 | ||||||
|  |     elf: ldconfig should skip temporary files created by package managers | ||||||
|  |      | ||||||
|  |     This avoids crashes due to partially written files, after a package | ||||||
|  |     update is interrupted. | ||||||
|  |      | ||||||
|  |     Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> | ||||||
|  | 
 | ||||||
|  | Conflicts: | ||||||
|  | 	elf/ldconfig.c | ||||||
|  | 	  (missing alloca removal downstream) | ||||||
|  | 
 | ||||||
|  | diff --git a/elf/ldconfig.c b/elf/ldconfig.c
 | ||||||
|  | index 8c66d7e5426d8cc4..51de08f91fbaf093 100644
 | ||||||
|  | --- a/elf/ldconfig.c
 | ||||||
|  | +++ b/elf/ldconfig.c
 | ||||||
|  | @@ -771,6 +771,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) | ||||||
|  | @@ -849,18 +874,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) | ||||||
|  |  	{ | ||||||
							
								
								
									
										61
									
								
								glibc-RHEL-13720-2.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								glibc-RHEL-13720-2.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | |||||||
|  | commit cfb5a97a93ea656e3b2263e42142a4032986d9ba | ||||||
|  | Author: Florian Weimer <fweimer@redhat.com> | ||||||
|  | Date:   Mon Oct 23 12:53:16 2023 +0200 | ||||||
|  | 
 | ||||||
|  |     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"). | ||||||
|  | 
 | ||||||
|  | diff --git a/elf/ldconfig.c b/elf/ldconfig.c
 | ||||||
|  | index 51de08f91fbaf093..fb19dd68d41c07a4 100644
 | ||||||
|  | --- a/elf/ldconfig.c
 | ||||||
|  | +++ b/elf/ldconfig.c
 | ||||||
|  | @@ -771,6 +771,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 | ||||||
|  | @@ -780,8 +791,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") | ||||||
|  | @@ -789,10 +799,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; | ||||||
|  |  } | ||||||
| @ -1,6 +1,6 @@ | |||||||
| %define glibcsrcdir glibc-2.28 | %define glibcsrcdir glibc-2.28 | ||||||
| %define glibcversion 2.28 | %define glibcversion 2.28 | ||||||
| %define glibcrelease 242%{?dist} | %define glibcrelease 243%{?dist} | ||||||
| # Pre-release tarballs are pulled in from git using a command that is | # Pre-release tarballs are pulled in from git using a command that is | ||||||
| # effectively: | # effectively: | ||||||
| # | # | ||||||
| @ -1058,6 +1058,8 @@ Patch870: glibc-RHEL-2122.patch | |||||||
| Patch871: glibc-RHEL-1192.patch | Patch871: glibc-RHEL-1192.patch | ||||||
| Patch872: glibc-RHEL-3639.patch | Patch872: glibc-RHEL-3639.patch | ||||||
| Patch873: glibc-RHEL-10481.patch | Patch873: glibc-RHEL-10481.patch | ||||||
|  | Patch874: glibc-RHEL-13720-1.patch | ||||||
|  | Patch875: glibc-RHEL-13720-2.patch | ||||||
| 
 | 
 | ||||||
| ############################################################################## | ############################################################################## | ||||||
| # Continued list of core "glibc" package information: | # Continued list of core "glibc" package information: | ||||||
| @ -2889,6 +2891,9 @@ fi | |||||||
| %files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared | %files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Tue Nov 21 2023 Florian Weimer <fweimer@redhat.com> - 2.28-243 | ||||||
|  | - ldconfig should skip temporary files created by RPM (RHEL-13720) | ||||||
|  | 
 | ||||||
| * Mon Nov 20 2023 Florian Weimer <fweimer@redhat.com> - 2.28-242 | * Mon Nov 20 2023 Florian Weimer <fweimer@redhat.com> - 2.28-242 | ||||||
| - Fix force-first handling in dlclose (RHEL-10481) | - Fix force-first handling in dlclose (RHEL-10481) | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user