| """ |
| Llama a load_model() de la libc_wrapper.dll recien compilada sobre el fichero .surml |
| malicioso (malicious_nul_name.surml, generado por craft_malicious_surml.py) para confirmar |
| si el proceso aborta (Candidato 1 de focus-02-c-wrapper-ffi.md) en vez de devolver un |
| FileInfo con is_error=1. |
| |
| Se ejecuta como proceso HIJO separado (ver run_trigger.py) precisamente porque si el bug es |
| real, este proceso Python entero morira sin excepcion capturable. |
| """ |
| import ctypes |
| from ctypes import Structure, c_char_p, c_int |
| import os |
|
|
| DLL_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "repo", "target", "release", "c_wrapper.dll")) |
|
|
|
|
| class FileInfo(Structure): |
| _fields_ = [ |
| ("file_id", c_char_p), |
| ("name", c_char_p), |
| ("description", c_char_p), |
| ("version", c_char_p), |
| ("error_message", c_char_p), |
| ("is_error", c_int), |
| ] |
|
|
|
|
| lib = ctypes.CDLL(DLL_PATH) |
| lib.load_model.argtypes = [c_char_p] |
| lib.load_model.restype = FileInfo |
|
|
| print("Antes de load_model() -- si el proceso muere aqui sin imprimir la linea de abajo, " |
| "confirma el abort no capturable.") |
| outcome = lib.load_model(os.path.abspath("malicious_nul_name.surml").encode("utf-8")) |
| print("DESPUES de load_model() -- NO abortó.") |
| print(f"is_error={outcome.is_error}") |
| if outcome.is_error: |
| print(f"error_message={outcome.error_message.decode('utf-8', errors='replace')}") |
| else: |
| print(f"file_id={outcome.file_id}, name={outcome.name}") |
|
|