diff options
author | Tim Potter <tpot@samba.org> | 2002-12-20 01:19:04 +0000 |
---|---|---|
committer | Tim Potter <tpot@samba.org> | 2002-12-20 01:19:04 +0000 |
commit | 5a346d6cb0d05ad2455df6b69c967080820d4c14 (patch) | |
tree | 155a243c01f73517bdfa9d9c3be38038ab4c6042 /source3/python | |
parent | 1e9428658c6f6df9dffa205e5ba22cdaefed1b0e (diff) | |
download | samba-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.c | 25 |
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; } |