[BRLTTY] Fix for the brlapi crash under Cython 3.0

Samuel Thibault samuel.thibault at ens-lyon.org
Tue Aug 15 09:01:41 EDT 2023


Hello,

Lukáš Tyrychtr, le mar. 15 août 2023 14:46:10 +0200, a ecrit:
> I've successfully tracked the reason for the brlapi crash under Cython 3.0,
> or at least it is the only one.

Thanks for tracking!

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

Ow, ok...

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

This would leak the handle on normal use if one uses
closeConnection(). Could you check the attached patch instead?

Samuel
-------------- next part --------------
diff --git a/Bindings/Python/brlapi.pyx b/Bindings/Python/brlapi.pyx
index 0136895ea..af62cc9be 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."""


More information about the BRLTTY mailing list