ccs-pykerberos
ccs-pykerberos copied to clipboard
SystemError thrown with Python 3.10
When using the module with Python 3.10 in conjunction with requests-kerberos, a SystemError
is thrown in the channelBindings
function. This is the stack trace:
File "/usr/lib/python3.10/site-packages/requests/api.py", line 75, in get
return request('get', url, params=params, **kwargs)
File "/usr/lib/python3.10/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python3.10/site-packages/requests/sessions.py", line 662, in send
r = dispatch_hook('response', hooks, r, **kwargs)
File "/usr/lib/python3.10/site-packages/requests/hooks.py", line 31, in dispatch_hook
_hook_data = hook(hook_data, **kwargs)
File "/usr/lib/python3.10/site-packages/requests_kerberos/kerberos_.py", line 415, in handle_response
self.cbt_struct = kerberos.channelBindings(application_data=cbt_application_data)
SystemError: PY_SSIZE_T_CLEAN macro must be defined for '#' formats
This is due to a behavioral change made in Python 3.10 which requires extension modules to use the Py_ssize_t
type rather than the int
type for string lengths:
- The
PY_SSIZE_T_CLEAN
macro must now be defined to use PyArg_ParseTuple() and Py_BuildValue() formats which use #: es#, et#, s#, u#, y#, z#, U# and Z#. See Parsing arguments and building values and the PEP 353.
- https://docs.python.org/3.10/whatsnew/3.10.html#id2
- https://docs.python.org/3.10/c-api/arg.html#arg-parsing
- https://www.python.org/dev/peps/pep-0353
- https://bugs.python.org/issue40943
The following patch resolves the issue:
--- a/src/kerberos.c
+++ b/src/kerberos.c
@@ -14,6 +14,7 @@
* limitations under the License.
**/
+#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include "kerberosbasic.h"
@@ -244,9 +245,9 @@
char *initiator_address = NULL;
char *acceptor_address = NULL;
char *application_data = NULL;
- int initiator_length = 0;
- int acceptor_length = 0;
- int application_length = 0;
+ Py_ssize_t initiator_length = 0;
+ Py_ssize_t acceptor_length = 0;
+ Py_ssize_t application_length = 0;
PyObject *pychan_bindings = NULL;
struct gss_channel_bindings_struct *input_chan_bindings;
I can confirm the attached patch fixes the issue.
Very thorough report, thanks!
Python 3.10 is officially releasing today. Shall I submit a Pull Request with my patch?
@dreness I went ahead and submitted a Pull Request. Now that Python 3.10 is officially released, this is becoming problematic for pip installations from PyPI. Please have a look. Thanks!
just hit this on OSX with /usr/local/Cellar/ansible/5.2.0/libexec/bin/python3.10
same on 3.11. by now on a M1 MacBook so a fully reinstalled homebrew tree. Don't have kerberos installed, only pykerberos 1.2.4. Also checked that the sources are patched with stevenpackardblp 's patch. Maybe time to buy a dozen raspberrys with different virtual_envs. it must all be joke. I don't care anymore.