Skip to content

Commit b93ba31

Browse files
henryyktauvipy
authored andcommitted
Fix segmentation fault in basic_publish
1 parent ab23194 commit b93ba31

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

Modules/_librabbitmq/connection.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ PyIter_ToAMQArray(amqp_connection_state_t conn, PyObject *src, amqp_pool_t *pool
380380
PyObject *iterator = PyObject_GetIter(src);
381381
if (iterator == NULL) return dst;
382382
PyObject *item = NULL;
383+
PyObject *item_tmp = NULL;
383384

384385
/* allocate new amqp array */
385386
dst.num_entries = 0;
@@ -410,9 +411,11 @@ PyIter_ToAMQArray(amqp_connection_state_t conn, PyObject *src, amqp_pool_t *pool
410411
is_unicode = PyUnicode_Check(item);
411412
if (is_unicode || PyBytes_Check(item)) {
412413
if (is_unicode) {
414+
/* PyUnicode_AsASCIIString returns a new ref! */
415+
item_tmp = item;
413416
if ((item = PyUnicode_AsASCIIString(item)) == NULL)
414417
goto item_error;
415-
PyObjectPool_AddEntry(pyobj_pool, item);
418+
Py_XDECREF(item_tmp);
416419
}
417420
AMQArray_SetStringValue(
418421
&dst, PyString_AS_AMQBYTES(item));
@@ -430,6 +433,7 @@ PyIter_ToAMQArray(amqp_connection_state_t conn, PyObject *src, amqp_pool_t *pool
430433

431434
return dst;
432435
item_error:
436+
Py_XDECREF(item_tmp);
433437
Py_XDECREF(item);
434438
error:
435439
Py_XDECREF(iterator);
@@ -828,7 +832,7 @@ PyObjectPool_Maybe_Unicode(PyObject *s, pyobject_pool_t *pyobj_pool)
828832
_PYRMQ_INLINE PyObject*
829833
PyObjectArray_AddEntry(pyobject_array_t *array, PyObject *obj)
830834
{
831-
if (array->num_entries < PYOBJECT_ARRAY_MAX) {
835+
if (obj && array->num_entries < PYOBJECT_ARRAY_MAX) {
832836
array->entries[array->num_entries] = obj;
833837
array->num_entries++;
834838
}
@@ -838,14 +842,16 @@ PyObjectArray_AddEntry(pyobject_array_t *array, PyObject *obj)
838842

839843
static PyObject *PyObjectPool_AddEntry(pyobject_pool_t *array, PyObject *obj)
840844
{
841-
if (array->num_entries == PYOBJECT_POOL_MAX) {
842-
if (!array->next)
843-
array->next = PyObjectPool_New(array->pool);
845+
if (obj) {
846+
if (array->num_entries == PYOBJECT_POOL_MAX) {
847+
if (!array->next)
848+
array->next = PyObjectPool_New(array->pool);
844849

845-
PyObjectPool_AddEntry(array->next, obj);
846-
} else {
847-
array->entries[array->num_entries] = obj;
848-
array->num_entries++;
850+
PyObjectPool_AddEntry(array->next, obj);
851+
} else {
852+
array->entries[array->num_entries] = obj;
853+
array->num_entries++;
854+
}
849855
}
850856

851857
return obj;

0 commit comments

Comments
 (0)