From 35e646116da971e789bb75eb741b72c60288ae90 Mon Sep 17 00:00:00 2001 From: tmathern <60901087+tmathern@users.noreply.github.com> Date: Mon, 1 Jun 2026 17:08:11 -0700 Subject: [PATCH] fix: Do not miss freeing pointers on error --- src/c2pa/c2pa.py | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) 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