Package: python-apt Version: 0.5.10 Severity: normal Tags: patch I've noticed that python-apt leaks FDs (and, as it turned out, memory) when using PkgSrcRecords. Below is a transcript of a python session that shows the bug.
---- START ---- [EMAIL PROTECTED]:~$ python Python 2.3.5 (#2, Mar 26 2005, 17:32:32) [GCC 3.3.5 (Debian 1:3.3.5-12)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import apt_pkg >>> apt_pkg.init() >>> c = apt_pkg.GetCache() Reading Package Lists... Done Building Dependency Tree... Done >>> [1]+ Stopped python [EMAIL PROTECTED]:~$ ps aux | grep [p]ython | tail -n 1 greek0 848 2.4 3.4 17332 13408 pts/9 T 12:40 0:01 python [EMAIL PROTECTED]:~$ ls /proc/848/fd/ 0 1 2 [EMAIL PROTECTED]:~$ fg 1 python >>> p = apt_pkg.GetPkgSrcRecords(c) >>> p <pkgSrcRecords object at 0x401df610> >>> [1]+ Stopped python [EMAIL PROTECTED]:~$ ls /proc/848/fd/ 0 1 10 11 12 13 14 15 16 2 3 4 5 6 7 8 9 [EMAIL PROTECTED]:~$ # ^-- ?! [EMAIL PROTECTED]:~$ exit There are stopped jobs. [EMAIL PROTECTED]:~$ fg 1 python >>> del p >>> del c >>> del apt_pkg >>> [1]+ Stopped python [EMAIL PROTECTED]:~$ ls /proc/848/fd/ 0 1 10 11 12 13 14 15 16 2 3 4 5 6 7 8 9 [EMAIL PROTECTED]:~$ for i in /proc/848/fd/*; do echo -e "$i\n `readlink $i`"; done /proc/848/fd/0 /dev/pts/9 /proc/848/fd/1 /dev/pts/9 /proc/848/fd/10 /var/lib/apt/lists/ftp.de.debian.org_debian-non-US_dists_testing-proposed-updates_non-US_main_source_Sources /proc/848/fd/11 /var/lib/apt/lists/ftp.de.debian.org_debian_dists_unstable_main_source_Sources /proc/848/fd/12 /var/lib/apt/lists/ftp.de.debian.org_debian-non-US_dists_unstable_non-US_main_source_Sources /proc/848/fd/13 /var/lib/apt/lists/security.debian.org_dists_stable_updates_main_source_Sources /proc/848/fd/14 /var/lib/apt/lists/security.debian.org_dists_stable_updates_contrib_source_Sources /proc/848/fd/15 /var/lib/apt/lists/security.debian.org_dists_stable_updates_non-free_source_Sources /proc/848/fd/16 /var/lib/apt/lists/ftp.de.debian.org_debian_dists_experimental_main_source_Sources /proc/848/fd/2 /dev/pts/9 /proc/848/fd/3 /var/lib/apt/lists/ftp.de.debian.org_debian_dists_stable_main_source_Sources /proc/848/fd/4 /var/lib/apt/lists/ftp.de.debian.org_debian-non-US_dists_stable_non-US_main_source_Sources /proc/848/fd/5 /var/lib/apt/lists/ftp.de.debian.org_debian_dists_stable-proposed-updates_main_source_Sources /proc/848/fd/6 /var/lib/apt/lists/ftp.de.debian.org_debian-non-US_dists_stable-proposed-updates_non-US_main_source_Sources /proc/848/fd/7 /var/lib/apt/lists/ftp.de.debian.org_debian_dists_testing_main_source_Sources /proc/848/fd/8 /var/lib/apt/lists/ftp.de.debian.org_debian-non-US_dists_testing_non-US_main_source_Sources /proc/848/fd/9 /var/lib/apt/lists/ftp.de.debian.org_debian_dists_testing-proposed-updates_main_source_Sources ---- END ---- Investigating the problem showed that PkgSrcRecordsStruct creates a new pkgSrcRecords object in its constructor without deleting it again in the destructor. Fixing this revealed another bug, simmilar to the one described in #304296 (mismatch of Owned and non-Owned function calls, causing a segfault). I've attatched a patch that fixes both problems. -- System Information: Debian Release: 3.1 APT prefers unstable APT policy: (990, 'unstable'), (500, 'testing') Architecture: i386 (i686) Kernel: Linux 2.6.8r20050410 Locale: [EMAIL PROTECTED], [EMAIL PROTECTED] (charmap=UTF-8) Versions of packages python-apt depends on: ii apt [libapt-pkg-libc6.3-5-3 0.5.28.6 Advanced front-end for dpkg ii apt-utils [libapt-inst-libc 0.5.28.6 APT utility programs ii libc6 2.3.2.ds1-20 GNU C Library: Shared libraries an ii libgcc1 1:3.4.3-12 GCC support library ii libstdc++5 1:3.3.5-12 The GNU Standard C++ Library v3 ii python 2.3.5-2 An interactive high-level object-o -- no debconf information
diff -Nur orig.python-apt-0.5.10/python/pkgsrcrecords.cc python-apt-0.5.10/python/pkgsrcrecords.cc --- orig.python-apt-0.5.10/python/pkgsrcrecords.cc 2003-12-26 18:04:22.000000000 +0100 +++ python-apt-0.5.10/python/pkgsrcrecords.cc 2005-04-16 13:22:20.593046072 +0200 @@ -26,6 +26,9 @@ List.ReadMainList(); Records = new pkgSrcRecords(List); }; + ~PkgSrcRecordsStruct() { + delete Records; + }; }; // PkgSrcRecords Class /*{{{*/ @@ -89,10 +92,10 @@ PyObject_HEAD_INIT(&PyType_Type) 0, // ob_size "pkgSrcRecords", // tp_name - sizeof(CppOwnedPyObject<PkgSrcRecordsStruct>), // tp_basicsize + sizeof(CppPyObject<PkgSrcRecordsStruct>), // tp_basicsize 0, // tp_itemsize // Methods - CppOwnedDealloc<PkgSrcRecordsStruct>, // tp_dealloc + CppDealloc<PkgSrcRecordsStruct>, // tp_dealloc 0, // tp_print PkgSrcRecordsAttr, // tp_getattr 0, // tp_setattr
signature.asc
Description: Digital signature