diff --git a/src/c2pa/c2pa.py b/src/c2pa/c2pa.py index bfec4a62..4ada020d 100644 --- a/src/c2pa/c2pa.py +++ b/src/c2pa/c2pa.py @@ -1425,7 +1425,12 @@ def __init__(self): super().__init__() ptr = _lib.c2pa_settings_new() - _check_ffi_operation_result(ptr, "Failed to create Settings") + try: + _check_ffi_operation_result(ptr, "Failed to create Settings") + except Exception: + if ptr: + ManagedResource._free_native_ptr(ptr) + raise self._handle = ptr self._lifecycle_state = LifecycleState.ACTIVE @@ -2403,11 +2408,16 @@ def _init_from_context(self, context, format_or_path, reader_ptr = _lib.c2pa_reader_from_context( context.execution_context, ) - _check_ffi_operation_result(reader_ptr, - Reader._ERROR_MESSAGES[ - 'reader_error' - ].format("Unknown error") - ) + try: + _check_ffi_operation_result(reader_ptr, + Reader._ERROR_MESSAGES[ + 'reader_error' + ].format("Unknown error") + ) + except Exception: + if reader_ptr: + ManagedResource._free_native_ptr(reader_ptr) + raise if manifest_data is not None: if not isinstance(manifest_data, bytes): @@ -3176,11 +3186,16 @@ def _init_from_context(self, context, json_str): builder_ptr = _lib.c2pa_builder_from_context( context.execution_context, ) - _check_ffi_operation_result(builder_ptr, - Builder._ERROR_MESSAGES[ - 'builder_error' - ].format("Unknown error") - ) + try: + _check_ffi_operation_result(builder_ptr, + Builder._ERROR_MESSAGES[ + 'builder_error' + ].format("Unknown error") + ) + except Exception: + if builder_ptr: + ManagedResource._free_native_ptr(builder_ptr) + raise # Consume-and-return: builder_ptr is consumed, # new_ptr is the valid pointer going forward