aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRenaud Métrich <rmetrich@redhat.com>2024-04-22 14:47:41 +0200
committerJake Hunsaker <jacob.r.hunsaker@gmail.com>2024-04-22 10:12:09 -0400
commit3b15149de1fd3eb7716732961e257467fbd6f200 (patch)
treef6ddc95caa31f704c0fe9bd340c38279d1e25a39
parentbf5301188ac27373d376cb657ad67c5e2a213248 (diff)
downloadsos-3b15149de1fd3eb7716732961e257467fbd6f200.tar.gz
[pkg] Don't initialize _packages to empty set
When initializing _packages, a distinction must be made between not having any package and not being initialized at all. Otherwise, if a package manager returns no package, the query command will execute hundreds of times. This can reproduce with 'flatpak' on RHEL when no package is returned: # flatpak list --> no output # strace -fttTvyy -s 128 -e execve -o sos.strace -- ./bin/sos report [...] Press ENTER to continue, or CTRL-C to quit. ^C # grep -c ' execve("/usr/sbin/flatpak"' sos.strace 350 Signed-off-by: Renaud Métrich <rmetrich@redhat.com>
-rw-r--r--sos/policies/package_managers/__init__.py10
1 files changed, 8 insertions, 2 deletions
diff --git a/sos/policies/package_managers/__init__.py b/sos/policies/package_managers/__init__.py
index 663c3132..594ca827 100644
--- a/sos/policies/package_managers/__init__.py
+++ b/sos/policies/package_managers/__init__.py
@@ -54,7 +54,7 @@ class PackageManager():
files = None
def __init__(self, chroot=None, remote_exec=None):
- self._packages = {}
+ self._packages = None
self.files = []
self.remote_exec = remote_exec
@@ -63,7 +63,7 @@ class PackageManager():
@property
def packages(self):
- if not self._packages:
+ if self._packages is None:
self._generate_pkg_list()
return self._packages
@@ -181,6 +181,9 @@ class PackageManager():
'pkg_manager': 'package manager name'}}
"""
+ if self._packages is None:
+ self._packages = {}
+
if self.query_command:
cmd = self.query_command
pkg_list = self.exec_cmd(cmd, timeout=30, chroot=self.chroot)
@@ -340,6 +343,9 @@ class MultiPackageManager(PackageManager):
return self.files
def _generate_pkg_list(self):
+ if self._packages is None:
+ self._packages = {}
+
self._packages.update(self.primary.packages)
for pm in self.fallbacks:
_pkgs = pm.packages