Bug#275847: python-apt: segfault on bad usage of ParseTagFile
On Sun, Oct 10, 2004 at 06:00:52PM +0100, Alastair McKinstry wrote:
> Package: python-apt
> Version: 0.5.10
> Severity: normal
>
>
> If you fail to use parse.step() on parsing a tag file,
> instead of getting an exception, the .so segfaults.
>
> Attached is an example program that does this.
This seems to be working now. Can you still reproduce it using
the newest version?
>
> -- System Information:
> Debian Release: 3.1
> APT prefers experimental
> APT policy: (990, 'experimental')
> Architecture: i386 (i686)
> Kernel: Linux 2.6.7-1-686
> Locale: LANG=C, LC_CTYPE=C (ignored: LC_ALL set to ga_IE.UTF-8)
>
> Versions of packages python-apt depends on:
> ii apt [libapt-pkg-libc6.3-5-3 0.5.27 Advanced front-end for dpkg
> ii apt-utils [libapt-inst-libc 0.5.27 APT utility programs
> ii libc6 2.3.2.ds1-17 GNU C Library: Shared libraries an
> ii python 2.3.4-4 An interactive high-level object-o
>
> -- no debconf information
> #!/usr/bin/python
> # -*- coding: UTF-8 -*-
>
> __author__ = 'Alastair McKinstry'
> __author_email__ = 'mckinstry@debian.org'
> __copyright__ = 'Copyright © 2004 Alastair McKinstry <mckinstry@debian.org>'
> __license__ = 'GPL'
> __version__ = '$Id$'
>
> import apt_pkg, os, unittest, errno
> # from errno import *
>
> __all__ = [ 'Archive', 'Distribution' ]
>
> class BadDistribution(Exception):
> pass
>
> class Archive:
> """Class for Debian Archive management"""
>
> __archives = {}
> def __init__(self, path):
> """Create an archive object listing the archives, as necessary """
> if self.__archives.has_key(path):
> a = self.__archives[path]
> self.__dict__ = a.__dict__
> self.__class__ = a.__class__
> else:
> self.path = path
> self.dists = {}
> self.Distributions = os.listdir('%s/dists' % path)
> self.__archives[path] = self
> self._dists_fetched = False
> def fetchDistributions(self):
> """Fetch all the distribution details, and eliminate aliases"""
> for d in self.Distributions:
> try:
> di = Distribution(self, d)
> except BadDistribution, e:
> # Remove d from list
> pass
>
> class Distribution:
> """Class for Distribution within Debian Archive"""
>
> __distributions = {}
>
> # Tags that may be in a release file.
> # Not interested in MD5Sum for the moment.
> _tags = ['Origin', 'Label', 'Suite', 'Codename', 'Date',
> 'Architectures', 'Components', 'Description', 'Version']
>
> def __init__(self, archive, name):
> """Create a Distribution object, from an archive"""
> if self.__distributions.has_key((archive, name)):
> a = self.__distributions[archive, name]
> self.__dict__ = a.__dict__
> self.__class__ = a.__class__
> else:
> self.archive = archive
> self.name = name
> try:
> path = '%s/dists/%s/Release' % (archive.path, name)
> f = open(path, 'r')
> except IOError, e:
> print e.__dict__
> if e.errno == errno.ENOENT or e.errno == errno.ENOTDIR:
> raise BadDistribution, '%s is not a distibution name' % name
> raise IOError, e
> try:
> parse = apt_pkg.ParseTagFile(open(path,'r'))
> except:
> raise SystemError, "Failed to parse file %s" % path
> for tag in self._tags:
> val = parse.Section.get(tag)
> if val != '':
> setattr(self, tag, val)
>
>
> class ArchiveTestCase(unittest.TestCase):
> """Unit tests for Debian Archive class"""
> def testArchive(self):
> """Test Creation"""
> a = Archive('/srv/debian.org/debian')
> def testSingleton(self):
> """Check that archives are cached."""
> a = Archive('/srv/debian.org/debian')
> b = Archive('/srv/debian.org/debian')
> assert id(a.__dict__) == id(b.__dict__), "Archive objects not cached"
> def testDistributions(self):
> """Check we get the correct distributions"""
> a = Archive('/srv/debian.org/debian')
> a.fetchDistributions()
>
>
> class DistributionTestCase(unittest.TestCase):
> """Unit Tests for Debian Distribution class"""
> def testDistribution(self):
> """Create a distribution object"""
> archive = Archive('/srv/debian.org/debian')
> dist = Distribution(archive, 'woody')
>
> if __name__ == '__main__':
> unittest.main()
--
Julian Andres Klode - Free Software Developer
Debian Developer - Contributing Member of SPI
Ubuntu Member - Fellow of FSFE
Website: http://jak-linux.org/ XMPP: juliank@jabber.org
Debian: http://www.debian.org/ SPI: http://www.spi-inc.org/
Ubuntu: http://www.ubuntu.com/ FSFE: http://www.fsfe.org/
Reply to: