Use-after-free in detach: deferred ACPI notify callback runs on freed softc (AcpiOsWaitEventsComplete is a no-op in DragonFly)
Summary
acpi_fujitsu_notify_handler queues acpi_fujitsu_notify_status_changed(sc) via AcpiOsExecute to deferred LWKT helper thread (acpi_task_td). acpi_fujitsu_detach calls AcpiRemoveNotifyHandler which internally invokes AcpiOsWaitEventsComplete() to drain pending deferred work - but in DragonFlyBSD this function is empty no-op macro (acdragonfly.h:219-220 XXX TBI). After AcpiRemoveNotifyHandler returns queued LWKT message holding raw pointer to sc still pending. Detach frees sysctl context returns bus layer frees softc. When acpi_task_thread dequeues message calls acpi_fujitsu_notify_status_changed(sc) accessing sc->gsif sc->gvol sc->dev sc->handle all on freed memory. Additionally detach never takes ACPI_SERIAL_BEGIN(fujitsu) so serial lock does not synchronize. Systemic: affects every DragonFly ACPI driver using AcpiOsExecute + AcpiRemoveNotifyHandler (also DF-2307 gpio_acpi DF-2376 acpi_cmbat).
No comments yet.