[BRLTTY] Fix for the brlapi crash under Cython 3.0

Lukáš Tyrychtr lukastyrychtr at gmail.com
Tue Aug 15 08:46:10 EDT 2023


Hello to all.

I've successfully tracked the reason for the brlapi crash under Cython 
3.0, or at least it is the only one.

Cython 3.0 started using the new Python object finalization APIs from 
PEP 442, and it likely changed the semantics about what gets called when 
a constructor throws an exception. Now, the __del__ method gets invoked 
in this case as well, but the Connection's one freed the handle even if 
self.fd was -1, so it did a double free, as before throwing the 
COnnectionError, the thing gets freed the first time.

Attached is a patch fixing this issue by freeing the handle only when it 
is safe to do so.

Regards,

Lukáš Tyrychtr
-------------- next part --------------
diff --git a/Bindings/Python/brlapi.pyx b/Bindings/Python/brlapi.pyx
index 0136895ea..77b1eea42 100644
--- a/Bindings/Python/brlapi.pyx
+++ b/Bindings/Python/brlapi.pyx
@@ -465,7 +465,7 @@ cdef class Connection:
 		"""Release resources used by the connection"""
 		if self.fd != -1:
 			c_brlapi.brlapi__closeConnection(self.h)
-		c_brlapi.free(self.h)
+			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."""


More information about the BRLTTY mailing list