diff options
author | Renaud Métrich <rmetrich@redhat.com> | 2024-04-22 14:47:41 +0200 |
---|---|---|
committer | Jake Hunsaker <jacob.r.hunsaker@gmail.com> | 2024-04-22 10:12:09 -0400 |
commit | 3b15149de1fd3eb7716732961e257467fbd6f200 (patch) | |
tree | f6ddc95caa31f704c0fe9bd340c38279d1e25a39 | |
parent | bf5301188ac27373d376cb657ad67c5e2a213248 (diff) | |
download | sos-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__.py | 10 |
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 |