diff mbox series

tools/python: change 's#' size type for Python >= 3.10

Message ID 20230126051310.4149074-1-marmarek@invisiblethingslab.com (mailing list archive)
State New, archived
Headers show
Series tools/python: change 's#' size type for Python >= 3.10 | expand

Commit Message

Marek Marczykowski-Górecki Jan. 26, 2023, 5:13 a.m. UTC
Python < 3.10 by default uses 'int' type for data+size string types
(s#), unless PY_SSIZE_T_CLEAN is defined - in which case it uses
Py_ssize_t. The former behavior was removed in Python 3.10 and now it's
required to define PY_SSIZE_T_CLEAN before including Python.h, and using
Py_ssize_t for the length argument. The PY_SSIZE_T_CLEAN behavior is
supported since Python 2.5.

Adjust bindings accordingly.

Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
---
 tools/python/xen/lowlevel/xc/xc.c | 3 ++-
 tools/python/xen/lowlevel/xs/xs.c | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

Comments

Jan Beulich Jan. 26, 2023, 9:14 a.m. UTC | #1
On 26.01.2023 06:13, Marek Marczykowski-Górecki wrote:
> @@ -1774,7 +1775,7 @@ static PyObject *pyflask_load(PyObject *self, PyObject *args, PyObject *kwds)
>  {
>      xc_interface *xc_handle;
>      char *policy;
> -    uint32_t len;
> +    Py_ssize_t len;

I find this suspicious - by the name, this is a signed type when an
unsigned one was used here before (and properly, imo).

Irrespective of the remark of course I'll leave acking (or not) of this
to people knowing Python better than I do.

Jan
Marek Marczykowski-Górecki Jan. 26, 2023, 12:09 p.m. UTC | #2
On Thu, Jan 26, 2023 at 10:14:54AM +0100, Jan Beulich wrote:
> On 26.01.2023 06:13, Marek Marczykowski-Górecki wrote:
> > @@ -1774,7 +1775,7 @@ static PyObject *pyflask_load(PyObject *self, PyObject *args, PyObject *kwds)
> >  {
> >      xc_interface *xc_handle;
> >      char *policy;
> > -    uint32_t len;
> > +    Py_ssize_t len;
> 
> I find this suspicious - by the name, this is a signed type when an
> unsigned one was used here before (and properly, imo).

It is suspicious indeed, but correct according to the documentation:
https://docs.python.org/3/c-api/arg.html#strings-and-buffers

> Irrespective of the remark of course I'll leave acking (or not) of this
> to people knowing Python better than I do.
> 
> Jan
Anthony PERARD Jan. 26, 2023, 2:40 p.m. UTC | #3
On Thu, Jan 26, 2023 at 06:13:10AM +0100, Marek Marczykowski-Górecki wrote:
> Python < 3.10 by default uses 'int' type for data+size string types
> (s#), unless PY_SSIZE_T_CLEAN is defined - in which case it uses
> Py_ssize_t. The former behavior was removed in Python 3.10 and now it's
> required to define PY_SSIZE_T_CLEAN before including Python.h, and using
> Py_ssize_t for the length argument. The PY_SSIZE_T_CLEAN behavior is
> supported since Python 2.5.
> 
> Adjust bindings accordingly.
> 
> Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>

Reviewed-by: Anthony PERARD <anthony.perard@citrix.com>

Thanks,
diff mbox series

Patch

diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c
index fd008610329b..cfb2734a992b 100644
--- a/tools/python/xen/lowlevel/xc/xc.c
+++ b/tools/python/xen/lowlevel/xc/xc.c
@@ -4,6 +4,7 @@ 
  * Copyright (c) 2003-2004, K A Fraser (University of Cambridge)
  */
 
+#define PY_SSIZE_T_CLEAN
 #include <Python.h>
 #define XC_WANT_COMPAT_MAP_FOREIGN_API
 #include <xenctrl.h>
@@ -1774,7 +1775,7 @@  static PyObject *pyflask_load(PyObject *self, PyObject *args, PyObject *kwds)
 {
     xc_interface *xc_handle;
     char *policy;
-    uint32_t len;
+    Py_ssize_t len;
     int ret;
 
     static char *kwd_list[] = { "policy", NULL };
diff --git a/tools/python/xen/lowlevel/xs/xs.c b/tools/python/xen/lowlevel/xs/xs.c
index 0dad7fa5f2fc..3ba5a8b893d9 100644
--- a/tools/python/xen/lowlevel/xs/xs.c
+++ b/tools/python/xen/lowlevel/xs/xs.c
@@ -18,6 +18,7 @@ 
  * Copyright (C) 2005 XenSource Ltd.
  */
 
+#define PY_SSIZE_T_CLEAN
 #include <Python.h>
 
 #include <stdbool.h>
@@ -141,7 +142,7 @@  static PyObject *xspy_write(XsHandle *self, PyObject *args)
     char *thstr;
     char *path;
     char *data;
-    int data_n;
+    Py_ssize_t data_n;
     bool result;
 
     if (!xh)