Note: This is a public test instance of Red Hat Bugzilla. The data contained within is a snapshot of the live data so any changes you make will not be reflected in the production Bugzilla. Email is disabled so feel free to test any aspect of the site that you want. File any problems you find or give feedback at bugzilla.redhat.com.

Bug 507885

Summary: package-cleanup crashes with infinite recursion
Product: Red Hat Enterprise Linux 5 Reporter: James Antill <james.antill>
Component: yumAssignee: James Antill <james.antill>
Status: CLOSED ERRATA QA Contact: BaseOS QE Security Team <qe-baseos-security>
Severity: medium Docs Contact:
Priority: low    
Version: 5.4CC: james.antill, jhutar, pmatilai, tim.lauridsen
Target Milestone: rc   
Target Release: ---   
Hardware: All   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Under certain, unusual circumstances, yum could encounter an infinite recursion while executing the package-cleanup --dupes command. Yum would crash and the recursion would eventually terminate with the error maximum recursion depth exceeded while calling a Python object. The code that populates the package sacks is now modified so that this recursion cannot take place, therefore avoiding the crash.
Story Points: ---
Clone Of: 507220 Environment:
Last Closed: 2009-09-02 07:34:30 UTC Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description James Antill 2009-06-24 15:58:50 UTC
+++ This bug was initially created as a clone of Bug #507220 +++

Description of problem:
package-cleanup --dupes crashes 

Version-Release number of selected component (if applicable):
yum-3.2.23-6.fc12.noarch
yum-utils-1.1.22-1.fc12.noarch

How reproducible:
always

Steps to Reproduce:
1. Run: package-cleanup --dupes
  
Actual results:
Setting up yum
Traceback (most recent call last):
  File "/usr/bin/package-cleanup", line 498, in <module>
    main()
  File "/usr/bin/package-cleanup", line 459, in main
    my = initYum(opts)
  File "/usr/bin/package-cleanup", line 60, in initYum
    my.doTsSetup()
  File "/usr/lib/python2.6/site-packages/yum/depsolve.py", line 85, in doTsSetup
    return self._getTs()
  File "/usr/lib/python2.6/site-packages/yum/depsolve.py", line 100, in _getTs
    self._getTsInfo(remove_only)
  File "/usr/lib/python2.6/site-packages/yum/depsolve.py", line 111, in _getTsInfo
    pkgSack = self.pkgSack
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 666, in <lambda>
    pkgSack = property(fget=lambda self: self._getSacks(),
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 507, in _getSacks
    self.excludePackages()
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 1148, in excludePackages
    self.pkgSack.addPackageExcluder(repoid, 'exclude.match', match)
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 666, in <lambda>
    pkgSack = property(fget=lambda self: self._getSacks(),
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 507, in _getSacks
    self.excludePackages()
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 1148, in excludePackages

...this trio is repeated many times, until it ends with...:

  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 1148, in excludePackages
    self.pkgSack.addPackageExcluder(repoid, 'exclude.match', match)
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 666, in <lambda>
    pkgSack = property(fget=lambda self: self._getSacks(),
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 486, in _getSacks
    if self._pkgSack and thisrepo is None:
  File "/usr/lib/python2.6/site-packages/yum/packageSack.py", line 336, in __len__
    for sack in sorted(self.sacks.values()):
RuntimeError: maximum recursion depth exceeded while calling a Python object


Expected results:
No traceback.

Additional info:
This bug is similar to bug 485578, but it happens without having the versionlock plugin installed and even with no plugins at all.

--- Additional comment from james.antill on 2009-06-22 01:26:48 EDT ---

This is fixed by:

http://yum.baseurl.org/gitweb?p=yum.git;a=commitdiff;h=5216a27d35d60e46f028b1fbba58acae5b9e79d2

--- Additional comment from mschmidt on 2009-06-22 02:46:53 EDT ---

I tested the patch. It fixes the bug. Thanks.

Comment 1 James Antill 2009-06-24 15:59:50 UTC
This is a somewhat minor bug, only happening in some weird edge cases ... but the fix is a trivial one liner. So it's ready to go for snap1 if I can get the flags.

Comment 8 Ruediger Landmann 2009-09-01 20:57:38 UTC
Release note added. If any revisions are required, please set the 
"requires_release_notes" flag to "?" and edit the "Release Notes" field accordingly.
All revisions will be proofread by the Engineering Content Services team.

New Contents:
Under certain, unusual circumstances, yum could encounter an infinite recursion while executing the package-cleanup --dupes command. Yum would crash and the recursion would eventually terminate with the error maximum recursion depth exceeded while calling a Python object. The code that populates the package sacks is now modified so that this recursion cannot take place, therefore avoiding the crash.

Comment 9 errata-xmlrpc 2009-09-02 07:34:30 UTC
An advisory has been issued which should help the problem
described in this bug report. This report is therefore being
closed with a resolution of ERRATA. For more information
on therefore solution and/or where to find the updated files,
please follow the link below. You may reopen this bug report
if the solution does not work for you.

http://rhn.redhat.com/errata/RHBA-2009-1419.html