# DF-4555 — dce_aux release_engine() NULL-deref (ignored acquire() failure)

## Build
Hardware-gated conceptual trigger (trigger.c): no build needed; it documents
the concurrent-AUX contention that forces `acquire()` failure. On DragonFly
there is no dp_aux chardev, so the real trigger is HPD/retrain contention.

## Run
`./run.sh` (records the guest attempt + hardware inventory).

## Expected
On a machine with an AMD DC GPU, when two AUX consumers race (HPD hotplug
work vs link training vs MST sideband) and one thread's
`aux_engine->funcs->acquire()` fails (dce_aux.c:877-892 failure exits leave
`engine->ddc == NULL`), `dc_link_aux_transfer()` (dc_link_ddc.c:656 ignores
the result) still calls `release_engine()` (dc_link_ddc.c:684) →
`dal_ddc_close(NULL)` (dce_aux.c:58) → `dal_gpio_close(ddc->pin_clock)`
evaluated with ddc==NULL (gpio_service.c:590) → near-NULL read → panic:

    fatal fault in dal_gpio_close+... <- dal_ddc_close <- release_engine
    <- dc_link_aux_transfer

On the audit guest: exits 1 with "hardware-gated" message; `devinfo -v`
shows zero 0x1002 devices (see env.txt).

## Success criterion
Panic signature above on affected hardware; absence of the fault after
applying fix.diff (acquire() honored + NULL-safe release_engine).
