usb1: Detach finalizer on duplicate registration in *.__registerFinalizer
Also, make the detection mendatory. It should only trigger on an internal
bug, so an assertion was kind of appropriate... But not detecting this
(when running on a python with assertions disabled) could lead to
double-frees.
diff --git a/usb1/__init__.py b/usb1/__init__.py
index 06d4968..130aaed 100644
--- a/usb1/__init__.py
+++ b/usb1/__init__.py
@@ -1244,7 +1244,9 @@
registerFinalizer(finalizer_handle, self.close)
def __registerFinalizer(self, handle, finalizer):
- assert handle not in self.__finalizer_dict
+ if handle in self.__finalizer_dict:
+ finalizer.detach()
+ raise ValueError
self.__finalizer_dict[handle] = finalizer
def __unregisterFinalizer(self, handle):
@@ -1999,7 +2001,9 @@
registerFinalizer(finalizer_handle, self.close)
def __registerFinalizer(self, handle, finalizer):
- assert handle not in self.__finalizer_dict
+ if handle in self.__finalizer_dict:
+ finalizer.detach()
+ raise ValueError
self.__finalizer_dict[handle] = finalizer
def __unregisterFinalizer(self, handle):
@@ -2355,7 +2359,9 @@
self.close()
def __registerFinalizer(self, handle, finalizer):
- assert handle not in self.__finalizer_dict
+ if handle in self.__finalizer_dict:
+ finalizer.detach()
+ raise ValueError
self.__finalizer_dict[handle] = finalizer
def __unregisterFinalizer(self, handle):