You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
2.2 KiB
50 lines
2.2 KiB
diff -up yum-3.4.3/cli.py.orig yum-3.4.3/cli.py |
|
--- yum-3.4.3/cli.py.orig 2017-06-29 17:44:53.784522557 +0200 |
|
+++ yum-3.4.3/cli.py 2017-06-29 17:46:16.249149700 +0200 |
|
@@ -28,6 +28,7 @@ import logging |
|
import math |
|
from optparse import OptionParser,OptionGroup,SUPPRESS_HELP |
|
import rpm |
|
+import ctypes |
|
|
|
from weakref import proxy as weakref |
|
|
|
@@ -779,6 +780,38 @@ class YumBaseCli(yum.YumBase, output.Yum |
|
if self.conf.debuglevel < 2: |
|
cb.display.output = False |
|
|
|
+ # Whenever we upgrade a shared library (and its dependencies) which the |
|
+ # yum process itself may dlopen() post-transaction (e.g. in a plugin |
|
+ # hook), we may end up in a situation where the upgraded library and |
|
+ # the pre-transaction version of a library it depends on which is ABI |
|
+ # incompatible are loaded in memory at the same time, leading to |
|
+ # unpredictable behavior and possibly a crash. Let's avoid that by |
|
+ # preloading all such dynamically loaded libraries pre-transaction so |
|
+ # that dlopen(), if called post-transaction, uses those instead of |
|
+ # loading the newly installed versions. |
|
+ preload = { |
|
+ # Loaded by libcurl, see BZ#1458841 |
|
+ 'nss-sysinit': ['libnsssysinit.so'], |
|
+ } |
|
+ for pkg in preload: |
|
+ # Only preload the libs if the package is actually installed and we |
|
+ # are changing it with the transaction |
|
+ if not self.tsInfo.matchNaevr(name=pkg) or \ |
|
+ not self.rpmdb.searchNevra(name=pkg): |
|
+ continue |
|
+ for lib in preload[pkg]: |
|
+ try: |
|
+ ctypes.cdll.LoadLibrary(lib) |
|
+ self.verbose_logger.log( |
|
+ yum.logginglevels.DEBUG_4, |
|
+ _('Preloaded shared library %s') % lib |
|
+ ) |
|
+ except Exception as e: |
|
+ self.verbose_logger.log( |
|
+ yum.logginglevels.DEBUG_4, |
|
+ _('Could not preload shared library %s: %s') % (lib, e) |
|
+ ) |
|
+ |
|
self.verbose_logger.log(yum.logginglevels.INFO_2, _('Running transaction')) |
|
resultobject = self.runTransaction(cb=cb) |
|
|
|
|