mirror of
https://github.com/samba-team/samba.git
synced 2025-07-30 19:42:05 +03:00
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 commit is contained in:
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user