diff --git a/rpm-4.7.90-python-refcounts.patch b/rpm-4.7.90-python-refcounts.patch new file mode 100644 index 0000000..d01b573 --- /dev/null +++ b/rpm-4.7.90-python-refcounts.patch @@ -0,0 +1,70 @@ +diff --git a/python/header-py.c b/python/header-py.c +index 0416058..539db0d 100644 +--- a/python/header-py.c ++++ b/python/header-py.c +@@ -139,7 +139,9 @@ static PyObject * hdrKeyList(hdrObject * s) + rpmTag tag; + + while ((tag = headerNextTag(hi)) != RPMTAG_NOT_FOUND) { +- PyList_Append(keys, PyInt_FromLong(tag)); ++ PyObject *to = PyInt_FromLong(tag); ++ PyList_Append(keys, to); ++ Py_DECREF(to); + } + headerFreeIterator(hi); + +diff --git a/python/rpmtd-py.c b/python/rpmtd-py.c +index eef35fe..1ba3a3d 100644 +--- a/python/rpmtd-py.c ++++ b/python/rpmtd-py.c +@@ -46,7 +46,9 @@ PyObject *rpmtd_AsPyobj(rpmtd td) + if (array) { + res = PyList_New(0); + while (rpmtdNext(td) >= 0) { +- PyList_Append(res, rpmtd_ItemAsPyobj(td, class)); ++ PyObject *item = rpmtd_ItemAsPyobj(td, class); ++ PyList_Append(res, item); ++ Py_DECREF(item); + } + } else { + res = rpmtd_ItemAsPyobj(td, class); +diff --git a/python/rpmts-py.c b/python/rpmts-py.c +index f774818..745b526 100644 +--- a/python/rpmts-py.c ++++ b/python/rpmts-py.c +@@ -351,6 +351,7 @@ rpmts_HdrFromFdno(rpmtsObject * s, PyObject *arg) + + if (rpmrc == RPMRC_OK) { + ho = hdr_Wrap(&hdr_Type, h); ++ h = headerFree(h); /* ref held by python object */ + } else { + Py_INCREF(Py_None); + ho = Py_None; +@@ -518,6 +519,7 @@ rpmts_Problems(rpmtsObject * s) + while (rpmpsNextIterator(psi) >= 0) { + PyObject *prob = rpmprob_Wrap(&rpmProblem_Type, rpmpsGetProblem(psi)); + PyList_Append(problems, prob); ++ Py_DECREF(prob); + } + rpmpsFreeIterator(psi); + rpmpsFree(ps); +diff --git a/python/spec-py.c b/python/spec-py.c +index e162bb3..f5a4b33 100644 +--- a/python/spec-py.c ++++ b/python/spec-py.c +@@ -177,6 +177,7 @@ static PyObject * spec_get_sources(specObject *s, void *closure) + PyObject *srcUrl = Py_BuildValue("(sii)", source->fullSource, + source->num, source->flags); + PyList_Append(sourceList, srcUrl); ++ Py_DECREF(srcUrl); + } + + return sourceList; +@@ -192,6 +193,7 @@ static PyObject * spec_get_packages(specObject *s, void *closure) + for (pkg = spec->packages; pkg; pkg = pkg->next) { + PyObject *po = specPkg_Wrap(&specPkg_Type, pkg); + PyList_Append(pkgList, po); ++ Py_DECREF(po); + } + return pkgList; + } diff --git a/rpm.spec b/rpm.spec index e52386e..b20313a 100644 --- a/rpm.spec +++ b/rpm.spec @@ -21,7 +21,7 @@ Summary: The RPM package management system Name: rpm Version: %{rpmver} -Release: 0.%{snapver}.2 +Release: 0.%{snapver}.3 Group: System Environment/Base Url: http://www.rpm.org/ Source0: http://rpm.org/releases/testing/%{name}-%{srcver}.tar.bz2 @@ -38,6 +38,7 @@ Patch3: rpm-4.7.90-fedora-specspo.patch # Patches already in upstream Patch200: rpm-4.7.90-python-bytecompile.patch +Patch201: rpm-4.7.90-python-refcounts.patch # These are not yet upstream Patch301: rpm-4.6.0-niagara.patch @@ -183,6 +184,7 @@ packages on a system. %patch3 -p1 -b .fedora-specspo %patch200 -p1 -b .python-bytecompile +%patch201 -p1 -b .python-refcounts %patch301 -p1 -b .niagara %patch302 -p1 -b .geode @@ -397,6 +399,9 @@ exit 0 %doc doc/librpm/html/* %changelog +* Wed Dec 09 2009 Panu Matilainen - 4.8.0-0.beta1.3 +- fix a bunch of python refcount-errors causing major memory leaks + * Mon Dec 07 2009 Panu Matilainen - 4.8.0-0.beta1.2 - fix noise from python bytecompile on non-python packages (#539635) - make all our -devel [build]requires isa-specific