]> arthur.barton.de Git - bup.git/commitdiff
Fix memory leak in *stat calls in _helpers.c
authorAidan Hobson Sayers <aidanhs@cantab.net>
Fri, 10 Jan 2020 11:12:27 +0000 (11:12 +0000)
committerRob Browning <rlb@defaultvalue.org>
Sun, 12 Jan 2020 16:27:25 +0000 (10:27 -0600)
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 <aidanhs@cantab.net>
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
lib/bup/_helpers.c

index 90a9ca53dce56d1b514e21012a2cb1580c89851e..05b648ce98578d4f30501b181fa812e880245d94 100644 (file)
@@ -126,7 +126,7 @@ static uint64_t htonll(uint64_t value)
 #endif
 
 
-// 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) \
@@ -1448,7 +1448,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),