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__ = '[email protected]'
> __copyright__ = 'Copyright © 2004 Alastair McKinstry <[email protected]>'
> __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: [email protected]
Debian:  http://www.debian.org/  SPI:  http://www.spi-inc.org/
Ubuntu:  http://www.ubuntu.com/  FSFE: http://www.fsfe.org/



-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to