Skip to content
This repository was archived by the owner on Feb 24, 2024. It is now read-only.
This repository was archived by the owner on Feb 24, 2024. It is now read-only.

SystemError thrown with Python 3.10 #88

@stevenpackardblp

Description

@stevenpackardblp

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 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;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions