@@ -1529,8 +1529,10 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1529
1529
* When both args and kwargs are present the kwargs take
1530
1530
* precedence in case of duplicate keys.
1531
1531
* All keys map to configuration properties.
1532
+ *
1533
+ * Copy configuration dict to avoid manipulating application config.
1532
1534
*/
1533
- if (args ) {
1535
+ if (args && PyTuple_Size ( args ) ) {
1534
1536
if (!PyTuple_Check (args ) ||
1535
1537
PyTuple_Size (args ) > 1 ) {
1536
1538
PyErr_SetString (PyExc_TypeError ,
@@ -1542,6 +1544,7 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1542
1544
"expected configuration dict" );
1543
1545
return NULL ;
1544
1546
}
1547
+ confdict = PyDict_Copy (confdict );
1545
1548
}
1546
1549
1547
1550
if (!confdict ) {
@@ -1551,7 +1554,7 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1551
1554
return NULL ;
1552
1555
}
1553
1556
1554
- confdict = kwargs ;
1557
+ confdict = PyDict_Copy ( kwargs ) ;
1555
1558
1556
1559
} else if (kwargs ) {
1557
1560
/* Update confdict with kwargs */
@@ -1568,11 +1571,11 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1568
1571
/* Enable valid offsets in delivery reports */
1569
1572
rd_kafka_topic_conf_set (tconf , "produce.offset.report" , "true" , NULL , 0 );
1570
1573
1571
- /*
1572
- * Plugins must be configured prior to handling any of their configuration properties.
1573
- * Dicts are unordered so we explicitly check for, set, and delete the plugin paths here.
1574
- * This ensures all configuration properties are handled in the right order.
1575
- */
1574
+ /*
1575
+ * Plugins must be configured prior to handling any of their configuration properties.
1576
+ * Dicts are unordered so we explicitly check for, set, and delete the plugin paths here.
1577
+ * This ensures plugin configuration properties are handled in the correct order.
1578
+ */
1576
1579
if ((vo = PyDict_GetItemString (confdict , "plugin.library.paths" ))) {
1577
1580
const char * v ;
1578
1581
char errstr [256 ];
@@ -1584,6 +1587,8 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1584
1587
"as type unicode string" );
1585
1588
rd_kafka_topic_conf_destroy (tconf );
1586
1589
rd_kafka_conf_destroy (conf );
1590
+ Py_DECREF (confdict );
1591
+
1587
1592
return NULL ;
1588
1593
}
1589
1594
@@ -1592,10 +1597,11 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1592
1597
if (rd_kafka_conf_set (conf , "plugin.library.paths" , v , errstr , sizeof (errstr ))
1593
1598
!= RD_KAFKA_CONF_OK ) {
1594
1599
cfl_PyErr_Format (RD_KAFKA_RESP_ERR__INVALID_ARG ,
1595
- "%s" , NULL );
1600
+ "%s" , errstr );
1596
1601
1597
1602
rd_kafka_topic_conf_destroy (tconf );
1598
1603
rd_kafka_conf_destroy (conf );
1604
+ Py_DECREF (confdict );
1599
1605
1600
1606
Py_XDECREF (vs8 );
1601
1607
Py_XDECREF (vs );
@@ -1624,6 +1630,8 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1624
1630
"as type unicode string" );
1625
1631
rd_kafka_topic_conf_destroy (tconf );
1626
1632
rd_kafka_conf_destroy (conf );
1633
+ Py_DECREF (confdict );
1634
+
1627
1635
return NULL ;
1628
1636
}
1629
1637
@@ -1633,6 +1641,7 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1633
1641
Py_DECREF (ks );
1634
1642
rd_kafka_topic_conf_destroy (tconf );
1635
1643
rd_kafka_conf_destroy (conf );
1644
+ Py_DECREF (confdict );
1636
1645
return NULL ;
1637
1646
}
1638
1647
Py_XDECREF (ks8 );
@@ -1646,8 +1655,11 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1646
1655
"as a callable function" );
1647
1656
rd_kafka_topic_conf_destroy (tconf );
1648
1657
rd_kafka_conf_destroy (conf );
1658
+ Py_DECREF (confdict );
1659
+
1649
1660
Py_XDECREF (ks8 );
1650
1661
Py_DECREF (ks );
1662
+
1651
1663
return NULL ;
1652
1664
}
1653
1665
if (h -> error_cb ) {
@@ -1668,8 +1680,11 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1668
1680
"as a callable function" );
1669
1681
rd_kafka_topic_conf_destroy (tconf );
1670
1682
rd_kafka_conf_destroy (conf );
1683
+ Py_DECREF (confdict );
1684
+
1671
1685
Py_XDECREF (ks8 );
1672
1686
Py_DECREF (ks );
1687
+
1673
1688
return NULL ;
1674
1689
}
1675
1690
if (h -> throttle_cb ) {
@@ -1690,8 +1705,11 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1690
1705
"as a callable function" );
1691
1706
rd_kafka_topic_conf_destroy (tconf );
1692
1707
rd_kafka_conf_destroy (conf );
1708
+ Py_DECREF (confdict );
1709
+
1693
1710
Py_XDECREF (ks8 );
1694
1711
Py_DECREF (ks );
1712
+
1695
1713
return NULL ;
1696
1714
}
1697
1715
@@ -1732,6 +1750,8 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1732
1750
Py_DECREF (ks );
1733
1751
rd_kafka_topic_conf_destroy (tconf );
1734
1752
rd_kafka_conf_destroy (conf );
1753
+ Py_DECREF (confdict );
1754
+
1735
1755
return NULL ;
1736
1756
1737
1757
} else if (r == 1 ) {
@@ -1753,8 +1773,11 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1753
1773
"unicode string" );
1754
1774
rd_kafka_topic_conf_destroy (tconf );
1755
1775
rd_kafka_conf_destroy (conf );
1776
+ Py_DECREF (confdict );
1777
+
1756
1778
Py_XDECREF (ks8 );
1757
1779
Py_DECREF (ks );
1780
+
1758
1781
return NULL ;
1759
1782
}
1760
1783
v = cfl_PyUnistr_AsUTF8 (vs , & vs8 );
@@ -1766,10 +1789,13 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1766
1789
"%s" , errstr );
1767
1790
rd_kafka_topic_conf_destroy (tconf );
1768
1791
rd_kafka_conf_destroy (conf );
1792
+ Py_DECREF (confdict );
1793
+
1769
1794
Py_XDECREF (vs8 );
1770
1795
Py_XDECREF (vs );
1771
1796
Py_XDECREF (ks8 );
1772
1797
Py_DECREF (ks );
1798
+
1773
1799
return NULL ;
1774
1800
}
1775
1801
@@ -1779,6 +1805,8 @@ rd_kafka_conf_t *common_conf_setup (rd_kafka_type_t ktype,
1779
1805
Py_DECREF (ks );
1780
1806
}
1781
1807
1808
+ Py_DECREF (confdict );
1809
+
1782
1810
if (h -> error_cb )
1783
1811
rd_kafka_conf_set_error_cb (conf , error_cb );
1784
1812
0 commit comments