SWIG 4.2 Python transition

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Quoting CHANGES from SWIG 4.2.0:

“
2023-12-20: wsfulton
            #2190 Replace SWIG_Python_str_AsChar with SWIG_PyUnicode_AsUTF8AndSize.

            SWIG_Python_str_AsChar has undefined behaviour when Py_LIMITED_API is defined
            as it returns a pointer to a string in a PyBytes object that no longer exists.

            SWIG_PyUnicode_AsUTF8AndSize is an efficient replacement, but requires a
            different API and the caller to decrement the refcount on the intermediate
            PyObject in the Py_LIMITED_API < 0x030A0000 implementation. The alternative
            would have required copying the returned char * string as was done in a
            previous implementation requiring a call to the defunct SWIG_Python_str_DelForPy3
            function.

            *** POTENTIAL INCOMPATIBILITY ***
”

This function is somewhat widely used:

  <https://codesearch.debian.net/search?q=SWIG_Python_str_AsChar&literal=1>

I tried to fix the ldns bindings like this:

diff --git a/contrib/python/ldns_rdf.i b/contrib/python/ldns_rdf.i
index 5d7448fd..60daf1a7 100644
--- a/contrib/python/ldns_rdf.i
+++ b/contrib/python/ldns_rdf.i
@@ -56,7 +56,11 @@
  */
 %typemap(arginit, noblock=1) const ldns_rdf *
 {
+#if SWIG_VERSION >= 0x040200
+  PyObject *$1_bytes = NULL;
+#else
   char *$1_str = NULL;
+#endif
 }
 
 /*
@@ -66,11 +70,17 @@
 %typemap(in, noblock=1) const ldns_rdf * (void* argp, $1_ltype tmp = 0, int res)
 {
   if (Python_str_Check($input)) {
+    const char *argstr;
+#if SWIG_VERSION >= 0x040200
+    argstr = SWIG_PyUnicode_AsUTF8AndSize($input, NULL, &$1_bytes);
+#else
     $1_str = SWIG_Python_str_AsChar($input);
-    if ($1_str == NULL) {
+    argstr = $1_str;
+#endif
+    if (argstr == NULL) {
       %argument_fail(SWIG_TypeError, "char *", $symname, $argnum);
     }
-    tmp = ldns_dname_new_frm_str($1_str);
+    tmp = ldns_dname_new_frm_str(argstr);
     if (tmp == NULL) {
       %argument_fail(SWIG_TypeError, "char *", $symname, $argnum);
     }
@@ -90,10 +100,17 @@
  */
 %typemap(freearg, noblock=1) const ldns_rdf *
 {
+#if SWIG_VERSION >= 0x040200
+  if ($1_bytes != NULL) {
+    /* Is not NULL only when a conversion form string occurred. */
+    Py_XDECREF($1_bytes);
+  }
+#else
   if ($1_str != NULL) {
     /* Is not NULL only when a conversion form string occurred. */
     SWIG_Python_str_DelForPy3($1_str); /* Is a empty macro for Python < 3. */
   }
+#endif
 }
 
 %nodefaultctor ldns_struct_rdf; /* No default constructor. */

Submitted upstream as <https://github.com/NLnetLabs/ldns/pull/232>.
Maybe that will get some useful comments; I don't know much about SWIG.
(The core of the change above is the call to
SWIG_PyUnicode_AsUTF8AndSize and Py_XDECREF call for the bytes object.)

In the past, this kind of problem would have just compiled and resulted
in a run-time error when the Python extension module is loaded.  In some
cases, issues went completely unnoticed because the Python bindins were
unused.  But with GCC 14, it is necessary to fix calls to undeclared
functions.

Thanks,
Florian
--
_______________________________________________
devel mailing list -- devel@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxx
Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: https://lists.fedoraproject.org/archives/list/devel@xxxxxxxxxxxxxxxxxxxxxxx
Do not reply to spam, report it: https://pagure.io/fedora-infrastructure/new_issue




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Fedora Announce]     [Fedora Users]     [Fedora Kernel]     [Fedora Testing]     [Fedora Formulas]     [Fedora PHP Devel]     [Kernel Development]     [Fedora Legacy]     [Fedora Maintainers]     [Fedora Desktop]     [PAM]     [Red Hat Development]     [Gimp]     [Yosemite News]

  Powered by Linux