From 0a4e906e732556fad6422f93532fed1d261585ee Mon Sep 17 00:00:00 2001 From: Aidan Hobson Sayers Date: Fri, 10 Jan 2020 11:12:27 +0000 Subject: [PATCH 1/1] Fix memory leak in *stat calls in _helpers.c The Python documentation [0] indicates that an 'O' passed to Py_BuildValue will have its refcount incremented. Since some elements of the tuple created in stat_struct_to_py are pre-converted in C to PyObjects, they already have a refcount of 1 - use 'N' to avoid incrementing it and ensure Python can deallocate them correctly. [0] https://docs.python.org/2/c-api/arg.html?highlight=py_buildvalue#c.Py_BuildValue Signed-off-by: Aidan Hobson Sayers Reviewed-by: Rob Browning (cherry picked from commit 3c57e31f68b3e68bf7053a628fcfd7ccccf217cd) Tested-by: Rob Browning --- lib/bup/_helpers.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/bup/_helpers.c b/lib/bup/_helpers.c index a03452a..d9c7ab8 100644 --- a/lib/bup/_helpers.c +++ b/lib/bup/_helpers.c @@ -103,7 +103,7 @@ static uint64_t htonll(uint64_t value) }) -// At the moment any code that calls INTGER_TO_PY() will have to +// At the moment any code that calls INTEGER_TO_PY() will have to // disable -Wtautological-compare for clang. See below. #define INTEGER_TO_PY(x) \ @@ -1384,7 +1384,7 @@ static PyObject *stat_struct_to_py(const struct stat *st, // compile time, but not (easily) the unspecified types, so handle // those via INTEGER_TO_PY(). Assumes ns values will fit in a // long. - return Py_BuildValue("OKOOOOOL(Ol)(Ol)(Ol)", + return Py_BuildValue("NKNNNNNL(Nl)(Nl)(Nl)", INTEGER_TO_PY(st->st_mode), (unsigned PY_LONG_LONG) st->st_ino, INTEGER_TO_PY(st->st_dev), -- 2.39.2