Opened 19 years ago
Closed 19 years ago
#184 closed Bugs (Fixed)
raw_function with no keywords calls Py_INCREF on NULL
Reported by: | conanbrink | Owned by: | david_abrahams |
---|---|---|---|
Milestone: | Component: | python USE GITHUB | |
Version: | None | Severity: | |
Keywords: | Cc: |
Description
In the 1.30.0 release, as well as in the latest CVS, the following code (using the very example presented in the documentation for raw_function.hpp) results in a segfault: C++: #include <boost/python/def.hpp> #include <boost/python/tuple.hpp> #include <boost/python/dict.hpp> #include <boost/python/module.hpp> #include <boost/python/raw_function.hpp> using namespace boost::python; tuple raw(tuple args, dict kw) { return make_tuple(args, kw); } BOOST_PYTHON_MODULE(raw_test) { def("raw", raw_function(raw)); } Python: >>> from raw_test import * >>> def pyraw(*args, **kw): ... return (args, kw) ... >>> pyraw(3, 4, foo = 'bar', baz = 42) ((3, 4), {'foo': 'bar', 'baz': 42}) >>> raw(3, 4, foo = 'bar', baz = 42) ((3, 4), {'foo': 'bar', 'baz': 42}) >>> pyraw(3,4) ((3, 4), {}) >>> raw(3, 4) Segmentation fault The problem is that the "keywords" parameter passed to boost::python::detail::raw_dispatcher's operator() is NULL. This NULL pointer then gets wrapped in a borrowed_reference and passed to dict's constructor, which proceeds to make an attempt to Py_INCREF it. do_call() from Python/eval.c passes a NULL pointer for the keyword dictionary in Python releases 2.2.2, 2.2.3, and 2.3b2. I can't vouch for earlier releases. Note that the Python version of this function (pyraw, defined above) receives an empty dict for its keywords when no keywords are passed, and I would expect the Boost Python Library to give me the same.
Note:
See TracTickets
for help on using tickets.