[PATCH 08/14] pytdb: Add non-freeing variant of PyString_FromTDB_DATA

Kirill Smelkov kirr at landau.phys.spbu.ru
Sat Oct 2 07:43:47 MDT 2010


From: Kirill Smelkov <kirr at mns.spb.ru>

At present PyString_FromTDB_DATA(data), always frees data.dptr .

This is convenient when data is used only as temporary value before
converting e.g. result to Python, but inappropriate, when we should not
free data.dptr at all.

Not freeing data is needed e.g. in function called from-inside
tdb_traverse, for which pytdb support comes next.

Signed-off-by: Kirill Smelkov <kirr at mns.spb.ru>
---
 lib/tdb/pytdb.c |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/lib/tdb/pytdb.c b/lib/tdb/pytdb.c
index 0ea6053..2f54fcf 100644
--- a/lib/tdb/pytdb.c
+++ b/lib/tdb/pytdb.c
@@ -57,18 +57,24 @@ static TDB_DATA PyString_AsTDB_DATA(PyObject *data)
 	return ret;
 }
 
-static PyObject *PyString_FromTDB_DATA(TDB_DATA data)
+static PyObject *__PyString_FromTDB_DATA(TDB_DATA data, bool release)
 {
 	if (data.dptr == NULL && data.dsize == 0) {
 		Py_RETURN_NONE;
 	} else {
 		PyObject *ret = PyString_FromStringAndSize((const char *)data.dptr, 
 												   data.dsize);
-		free(data.dptr);
+		if (release)
+			free(data.dptr);
 		return ret;
     }
 }
 
+static PyObject *PyString_FromTDB_DATA(TDB_DATA data)
+{
+	return __PyString_FromTDB_DATA(data, /*release=*/true);
+}
+
 /* parse `PyObject *args` into TDB_DATA and store result in *dptr */
 #define	PyTdb_ARGS_AS_TDBDATA(args, dptr) do {	\
 	PyObject *py_obj;	\
-- 
1.7.3.1.50.g1e633


More information about the samba-technical mailing list