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>
(cherry picked from commit
3c57e31f68b3e68bf7053a628fcfd7ccccf217cd)
Tested-by: Rob Browning <rlb@defaultvalue.org>
-// 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) \
// disable -Wtautological-compare for clang. See below.
#define INTEGER_TO_PY(x) \
// compile time, but not (easily) the unspecified types, so handle
// those via INTEGER_TO_PY(). Assumes ns values will fit in a
// long.
// 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),
INTEGER_TO_PY(st->st_mode),
(unsigned PY_LONG_LONG) st->st_ino,
INTEGER_TO_PY(st->st_dev),