Package: apt Version: 0.8.13.1 Severity: normal Tags: patch -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256
Hi DACA suggested that there were some issues in APT[1], so I decided to have a closer look. Please note I suspect that some of these reported issues are false-positives (Particularly the "Buffer access out-of-bounds") and I am not sure about the "object destroyed immediately" errors either. Nevertheless I deviced a small patch to take care of the memory leaks and a couple of possible null dereferences[2]. My experience with APT and C++ is rather limited, so you may want to solve some of the issues differently. [1] http://qa.debian.org/daca/cppcheck/sid/apt_0.8.13.2.html [2] The issues raised by cppcheck here comes from inconsistent null checks on the variables. E.g. something like if (log) { /* use log ...*/ } log->msg("blah blah blah"); Either the if is redundant or the deference later is a possible null deference. In my patch I have assumed the latter to the case always. - -- Package-specific info: - -- (no /etc/apt/preferences present) -- - -- (/etc/apt/sources.list present, but not submitted) -- - -- System Information: Debian Release: wheezy/sid APT prefers testing APT policy: (990, 'testing'), (500, 'unstable'), (1, 'experimental') Architecture: i386 (i686) Kernel: Linux 2.6.38-2-686 (SMP w/2 CPU cores) Locale: LANG=en_DK.UTF-8, LC_CTYPE=en_DK.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Versions of packages apt depends on: ii debian-archive-keyring 2010.08.28 GnuPG archive keys of the Debian a ii gnupg 1.4.11-3 GNU privacy guard - a free PGP rep ii libc6 2.11.2-11 Embedded GNU C Library: Shared lib ii libgcc1 1:4.6.0-2 GCC support library ii libstdc++6 4.6.0-2 The GNU Standard C++ Library v3 ii zlib1g 1:1.2.3.4.dfsg-3 compression library - runtime apt recommends no packages. Versions of packages apt suggests: pn apt-doc <none> (no description available) ii aptitude 0.6.3-4 terminal-based package manager (te ii bzip2 1.0.5-6 high-quality block-sorting file co ii dpkg-dev 1.15.8.10 Debian package development tools ii lzma 4.43-14 Compression method of 7z format in ii python-apt 0.7.100.1 Python interface to libapt-pkg - -- no debconf information -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAEBCAAGBQJNp0aoAAoJEAVLu599gGRCrK0QAI51s/BPKdsAowFXgYBd5O5M BqUmgaq3dEJ6B7AbMopMEmosEcciyObHxX2LghrhGIxTaUs+W8/yfQdLayj6wnJo bNd59jH3nLsiHh1Uo+p5ZcdWe4Nbk3OfsdcbseQfY0iOFcCckivM8piMxcuMDFs2 nSAGkzt1SYEn0m7O3A4z1Z5HijVRwRkEGl07I0UKXh/46y9GN3Y2FdegVqVuBbHn XnaO2lKllnGrRFtNe7/xa6cY/K7v1K6VwmYP9YNAf8zUoHOfNyHXlz9ToqYwxDqL uOW2wdmFt8uz0ft4F37IXvanRlUOi2VQshgw/diZZs1RWx2UyoQJ57SpbddkO2tD M08PTTYBVF4TEDsyWu3jJaV9zu5gaHxMmTiByrvvPgTvOAnnT/+xaPW3tWyOnZmi 2JLdZCEYKey1+9kVUc8SuVkcFRZAkp2FMqA4mHMYy6iF81WY3YyFPTdjRK03rBU2 yYnZQLaPtK4RUFnTKdO/2nA981bSsdeDQ5SMUThSzBf/7yWwqguyVme63SZJBonl a5CdZefMZDSEM7u1a1eTYsSgj7cW/3UEmj5xk+4D3bNb8Dp9faKFB12ORPGmQ45Y cqbD3UOBElVMn2Ygyce64G66s42xNzXfbshs8ErH5ADJ/Bnm86GUAao0Q8rAJd5S VD55U7B8l1N0UkPqODEs =0NJh -----END PGP SIGNATURE-----
=== modified file 'apt-inst/dirstream.cc' --- apt-inst/dirstream.cc 2007-06-14 09:59:13 +0000 +++ apt-inst/dirstream.cc 2011-04-14 18:44:02 +0000 @@ -42,12 +42,20 @@ Itm.Name); // fchmod deals with umask and fchown sets the ownership - if (fchmod(iFd,Itm.Mode) != 0) + if (fchmod(iFd,Itm.Mode) != 0) { + int err = errno; + (void)close(iFD); + errno = err; return _error->Errno("fchmod",_("Failed to write file %s"), Itm.Name); - if (fchown(iFd,Itm.UID,Itm.GID) != 0 && errno != EPERM) + } + if (fchown(iFd,Itm.UID,Itm.GID) != 0 && errno != EPERM) { + int err = errno; + (void)close(iFD); + errno = err; return _error->Errno("fchown",_("Failed to write file %s"), Itm.Name); + } Fd = iFd; return true; } === modified file 'apt-pkg/cdrom.cc' --- apt-pkg/cdrom.cc 2011-03-10 13:42:34 +0000 +++ apt-pkg/cdrom.cc 2011-04-14 18:44:57 +0000 @@ -154,8 +154,12 @@ if (FindPackages(CD + Dir->d_name,List,SList,SigList,TransList,InfoDir,log,Depth+1) == false) break; - if (chdir(CD.c_str()) != 0) + if (chdir(CD.c_str()) != 0) { + int err = errno; + (void)closedir(D); + errno = err; return _error->Errno("chdir","Unable to change to %s",CD.c_str()); + } }; closedir(D); @@ -257,8 +261,10 @@ Inodes[I] = Buf.st_ino; } - if (_error->PendingError() == true) + if (_error->PendingError() == true) { + delete[] Inodes; return false; + } // Look for dups for (unsigned int I = 0; I != List.size(); I++) @@ -605,7 +611,9 @@ } // Mount the new CDROM - log->Update(_("Mounting CD-ROM...\n"), STEP_MOUNT); + if(log) { + log->Update(_("Mounting CD-ROM...\n"), STEP_MOUNT); + } if (MountCdrom(CDROM) == false) return _error->Error("Failed to mount the cdrom."); } @@ -749,7 +757,9 @@ log->Update(msg.str()); } - log->Update(_("Copying package lists..."), STEP_COPY); + if(log) { + log->Update(_("Copying package lists..."), STEP_COPY); + } // take care of the signatures and copy them if they are ok // (we do this before PackageCopy as it modifies "List" and "SourceList") SigVerify SignVerify; === modified file 'apt-pkg/contrib/cdromutl.cc' --- apt-pkg/contrib/cdromutl.cc 2011-03-09 11:15:13 +0000 +++ apt-pkg/contrib/cdromutl.cc 2011-04-14 18:46:30 +0000 @@ -206,8 +206,12 @@ Hash.Add(Dir->d_name); }; - if (chdir(StartDir.c_str()) != 0) + if (chdir(StartDir.c_str()) != 0) { + int err = errno; + (void)closedir(D); + errno = err; return _error->Errno("chdir",_("Unable to change to %s"),StartDir.c_str()); + } closedir(D); // Some stats from the fsys @@ -253,8 +257,10 @@ FILE *f=fopen(mount[i], "r"); while ( fgets(buf, sizeof(buf), f) != NULL) { if (strncmp(buf, devnode, strlen(devnode)) == 0) { - if(TokSplitString(' ', buf, out, 10)) + if(TokSplitString(' ', buf, out, 10)) { + (void)fclose(f); return string(out[1]); + } } } fclose(f); === modified file 'apt-pkg/contrib/error.cc' --- apt-pkg/contrib/error.cc 2011-02-15 13:04:06 +0000 +++ apt-pkg/contrib/error.cc 2011-04-14 18:46:56 +0000 @@ -107,6 +107,7 @@ msgSize = n + 1; else msgSize *= 2; + free(S); return true; } @@ -160,6 +161,7 @@ msgSize = n + 1; else msgSize *= 2; + free(S); return true; } === modified file 'cmdline/apt-cache.cc' --- cmdline/apt-cache.cc 2011-03-08 18:32:35 +0000 +++ cmdline/apt-cache.cc 2011-04-14 18:37:51 +0000 @@ -1115,6 +1115,9 @@ } printf("}\n"); + delete[] Show; + delete[] Flags; + delete[] ShapeMap; return true; } /*}}}*/ === modified file 'cmdline/apt-get.cc' --- cmdline/apt-get.cc 2011-04-13 09:33:41 +0000 +++ cmdline/apt-get.cc 2011-04-14 18:39:58 +0000 @@ -2386,8 +2386,10 @@ string Src; pkgSrcRecords::Parser *Last = FindSrc(*I,Recs,SrcRecs,Src,*Cache); - if (Last == 0) + if (Last == 0) { + delete[] Dsc; return _error->Error(_("Unable to find a source package for %s"),Src.c_str()); + } string srec = Last->AsStr(); string::size_type pos = srec.find("\nVcs-"); === modified file 'test/testextract.cc' --- test/testextract.cc 2004-09-20 17:03:13 +0000 +++ test/testextract.cc 2011-04-14 18:43:19 +0000 @@ -71,9 +71,12 @@ Itm.Type = pkgDirStream::Item::Directory; int Fd; - if (Extract.DoItem(Itm,Fd) == false) + if (Extract.DoItem(Itm,Fd) == false) { + (void)fclose(F); return false; + } } + (void)fclose(F); } else if (Deb.ExtractArchive(Extract) == false)