summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenry Tang <henryykt@gmail.com>2020-04-15 13:13:03 +0800
committerAsif Saif Uddin <auvipy@gmail.com>2020-04-15 11:48:01 +0600
commitb93ba31757105510b33c293fd664fbed09c533ff (patch)
tree5b108eefff7d385a231ee53a6dad3d900e97611c
parentab23194f379101157f503ab4310d260dc506cc32 (diff)
downloadlibrabbitmq-b93ba31757105510b33c293fd664fbed09c533ff.tar.gz
Fix segmentation fault in basic_publish
-rw-r--r--Modules/_librabbitmq/connection.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/Modules/_librabbitmq/connection.c b/Modules/_librabbitmq/connection.c
index 4b57a1b..a7bf338 100644
--- a/Modules/_librabbitmq/connection.c
+++ b/Modules/_librabbitmq/connection.c
@@ -380,6 +380,7 @@ PyIter_ToAMQArray(amqp_connection_state_t conn, PyObject *src, amqp_pool_t *pool
PyObject *iterator = PyObject_GetIter(src);
if (iterator == NULL) return dst;
PyObject *item = NULL;
+ PyObject *item_tmp = NULL;
/* allocate new amqp array */
dst.num_entries = 0;
@@ -410,9 +411,11 @@ PyIter_ToAMQArray(amqp_connection_state_t conn, PyObject *src, amqp_pool_t *pool
is_unicode = PyUnicode_Check(item);
if (is_unicode || PyBytes_Check(item)) {
if (is_unicode) {
+ /* PyUnicode_AsASCIIString returns a new ref! */
+ item_tmp = item;
if ((item = PyUnicode_AsASCIIString(item)) == NULL)
goto item_error;
- PyObjectPool_AddEntry(pyobj_pool, item);
+ Py_XDECREF(item_tmp);
}
AMQArray_SetStringValue(
&dst, PyString_AS_AMQBYTES(item));
@@ -430,6 +433,7 @@ PyIter_ToAMQArray(amqp_connection_state_t conn, PyObject *src, amqp_pool_t *pool
return dst;
item_error:
+ Py_XDECREF(item_tmp);
Py_XDECREF(item);
error:
Py_XDECREF(iterator);
@@ -828,7 +832,7 @@ PyObjectPool_Maybe_Unicode(PyObject *s, pyobject_pool_t *pyobj_pool)
_PYRMQ_INLINE PyObject*
PyObjectArray_AddEntry(pyobject_array_t *array, PyObject *obj)
{
- if (array->num_entries < PYOBJECT_ARRAY_MAX) {
+ if (obj && array->num_entries < PYOBJECT_ARRAY_MAX) {
array->entries[array->num_entries] = obj;
array->num_entries++;
}
@@ -838,14 +842,16 @@ PyObjectArray_AddEntry(pyobject_array_t *array, PyObject *obj)
static PyObject *PyObjectPool_AddEntry(pyobject_pool_t *array, PyObject *obj)
{
- if (array->num_entries == PYOBJECT_POOL_MAX) {
- if (!array->next)
- array->next = PyObjectPool_New(array->pool);
+ if (obj) {
+ if (array->num_entries == PYOBJECT_POOL_MAX) {
+ if (!array->next)
+ array->next = PyObjectPool_New(array->pool);
- PyObjectPool_AddEntry(array->next, obj);
- } else {
- array->entries[array->num_entries] = obj;
- array->num_entries++;
+ PyObjectPool_AddEntry(array->next, obj);
+ } else {
+ array->entries[array->num_entries] = obj;
+ array->num_entries++;
+ }
}
return obj;