From 7e96bb2189498abd32dcd2ccaa61be166f0144eb Mon Sep 17 00:00:00 2001 From: Giacomo Vercesi Date: Fri, 23 Jun 2023 09:01:26 +0200 Subject: [PATCH] revng.api: avoid NULL dereferencing in extract The call to `rp_container_extract_one` can return a null pointer, add a check that allows to avoid dereferencing it if this happens. --- python/revng/api/manager.py | 8 +++++++- python/revng/api/target.py | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/python/revng/api/manager.py b/python/revng/api/manager.py index d4c51a050..f7c6e62aa 100644 --- a/python/revng/api/manager.py +++ b/python/revng/api/manager.py @@ -117,7 +117,13 @@ class Manager: # TODO: we really should be able to provide a detailed error here raise RevngException("Failed to produce targets") - return {t.serialize(): t.extract() for t in targets} + result = {} + for target in targets: + extracted_target = target.extract() + if extracted_target is None: + raise RevngException(f"Target {target.serialize()} extraction failed") + result[target.serialize()] = extracted_target + return result def produce_target( self, diff --git a/python/revng/api/target.py b/python/revng/api/target.py index b4d649b34..d694cd1a6 100644 --- a/python/revng/api/target.py +++ b/python/revng/api/target.py @@ -54,8 +54,10 @@ class Target: _serialized = _api.rp_target_create_serialized_string(self._target) return make_python_string(_serialized) - def extract(self) -> str | bytes: + def extract(self) -> str | bytes | None: _buffer = _api.rp_container_extract_one(self._container._container, self._target) + if _buffer == ffi.NULL: + return None size = _api.rp_buffer_size(_buffer) data = _api.rp_buffer_data(_buffer) return convert_buffer(data, size, self._container.mime)