summaryrefslogtreecommitdiff
path: root/source3/python
diff options
context:
space:
mode:
authorTim Potter <tpot@samba.org>2002-12-20 01:19:04 +0000
committerTim Potter <tpot@samba.org>2002-12-20 01:19:04 +0000
commit5a346d6cb0d05ad2455df6b69c967080820d4c14 (patch)
tree155a243c01f73517bdfa9d9c3be38038ab4c6042 /source3/python
parent1e9428658c6f6df9dffa205e5ba22cdaefed1b0e (diff)
downloadsamba-5a346d6cb0d05ad2455df6b69c967080820d4c14.tar.gz
samba-5a346d6cb0d05ad2455df6b69c967080820d4c14.tar.bz2
samba-5a346d6cb0d05ad2455df6b69c967080820d4c14.zip
Merge from HEAD:
>CR1333: Fix memory leak when unpacking some structures. > >* (pytdbunpack_item): PyList_Append creates an additional reference to > the appended object. Therefore, release the initial reference after > it's added to the list. (This used to be commit 36091157b24cfbd76c15ddc20681a1feeaa706db)
Diffstat (limited to 'source3/python')
-rw-r--r--source3/python/py_tdbpack.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/source3/python/py_tdbpack.c b/source3/python/py_tdbpack.c
index 28cd529245..6181a4918e 100644
--- a/source3/python/py_tdbpack.c
+++ b/source3/python/py_tdbpack.c
@@ -656,21 +656,21 @@ pytdbunpack_buffer(char **pbuf, int *plen, PyObject *val_list)
Returns a reference to None, or NULL for failure.
*/
static PyObject *pytdbunpack_item(char ch,
- char **pbuf,
- int *plen,
- PyObject *val_list)
+ char **pbuf,
+ int *plen,
+ PyObject *val_list)
{
- PyObject *result;
+ PyObject *unpacked;
if (ch == 'w') { /* 16-bit int */
- result = pytdbunpack_int16(pbuf, plen);
+ unpacked = pytdbunpack_int16(pbuf, plen);
}
else if (ch == 'd' || ch == 'p') { /* 32-bit int */
/* pointers can just come through as integers */
- result = pytdbunpack_uint32(pbuf, plen);
+ unpacked = pytdbunpack_uint32(pbuf, plen);
}
else if (ch == 'f' || ch == 'P') { /* nul-term string */
- result = pytdbunpack_string(pbuf, plen, pytdb_unix_encoding);
+ unpacked = pytdbunpack_string(pbuf, plen, pytdb_unix_encoding);
}
else if (ch == 'B') { /* length, buffer */
return pytdbunpack_buffer(pbuf, plen, val_list);
@@ -684,10 +684,15 @@ static PyObject *pytdbunpack_item(char ch,
}
/* otherwise OK */
- if (!result)
- return NULL;
- if (PyList_Append(val_list, result) == -1)
+ if (!unpacked)
return NULL;
+
+ if (PyList_Append(val_list, unpacked) == -1)
+ val_list = NULL;
+
+ /* PyList_Append takes a new reference to the inserted object.
+ Therefore, we no longer need the original reference. */
+ Py_DECREF(unpacked);
return val_list;
}