From ca3c2a8843df2d2da9f800251b6e09dbd18c6be8 Mon Sep 17 00:00:00 2001 From: Emi Vasilek Date: Mon, 9 Oct 2023 14:09:16 +0200 Subject: [PATCH] brltty: fix segfault when built with Cython 3 https://discourse.gnome.org/t/psa-for-distros-brltty-should-be-built-using-cython-0-29-x-not-cython-3/16715/3i --- srcpkgs/brltty/patches/cython3.patch | 44 ++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 srcpkgs/brltty/patches/cython3.patch diff --git a/srcpkgs/brltty/patches/cython3.patch b/srcpkgs/brltty/patches/cython3.patch new file mode 100644 index 0000000000000..2f9bfaf388270 --- /dev/null +++ b/srcpkgs/brltty/patches/cython3.patch @@ -0,0 +1,44 @@ +From e6707d5e094dc36db4319ce4d052a6ad568a5d26 Mon Sep 17 00:00:00 2001 +From: Samuel Thibault +Date: Tue, 15 Aug 2023 16:29:13 +0200 +Subject: [PATCH] brlapi: Fix python crash on connection error +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From Lukáš Tyrychtr: +“ +Cython 3.0 started using the new Python object finalization APIs from PEP 442 +” + +This means that __del__ gets called even when raising an exception from +__init__, while it was not before. To cope with both behaviors, we can +set self.h to NULL to determine whether it still exists or not. + +Thanks Lukáš Tyrychtr for the investigation and patch draft! +--- + Bindings/Python/brlapi.pyx | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/Bindings/Python/brlapi.pyx b/Bindings/Python/brlapi.pyx +index 0136895eaf..af62cc9be0 100644 +--- a/Bindings/Python/brlapi.pyx ++++ b/Bindings/Python/brlapi.pyx +@@ -453,6 +453,7 @@ cdef class Connection: + c_brlapi.brlapi_protocolExceptionInit(self.h) + if self.fd == -1: + c_brlapi.free(self.h) ++ self.h = NULL + raise ConnectionError(self.settings.host, self.settings.auth) + + def closeConnection(self): +@@ -465,7 +466,8 @@ cdef class Connection: + """Release resources used by the connection""" + if self.fd != -1: + c_brlapi.brlapi__closeConnection(self.h) +- c_brlapi.free(self.h) ++ if self.h != NULL: ++ c_brlapi.free(self.h) + + property host: + """To get authorized to connect, libbrlapi has to tell the BrlAPI server a secret key, for security reasons. This is the path to the file which holds it; it will hence have to be readable by the application."""