CVE-2026-97603: idpf: disable DIM work before freeing q_vectors

Published Sep 25, 2026
·
Updated

In the Linux kernel, the following vulnerability has been resolved:

idpf: disable DIM work before freeing qvectors

idpf never drains the Tx/Rx DIM works before freeing the memory they live in. txdim and rxdim are embedded in struct idpfqvector, they are queued from the NAPI poll via netdim(), and idpfvportintrrel() ends with kfree(rsrc->qvectors). Nothing in the driver cancels them.

idpftxdimwork() and idpfrxdimwork() then run on freed memory: idpfvportintrwriteitr() writes the ITR register through qvector->intrreg.txitr / rxitr, void iomem pointers loaded out of the freed qvector. No configuration is needed to get there -- IDPFITRISDYNAMIC() is defined as (itrmode) and idpfvportalloc() initialises both modes to IDPFITRDYNAMIC.

Draining after idpfvportintrnapidisall() is not enough on its own. idpfnetdim() is called from inside the "if (napicompletedone(napi, workdone))" branch of the poll, and napicompletedone() has already cleared NAPIFSTATESCHED by then. napidisablelocked() waits only while (val & (NAPIFSTATESCHED | NAPIFSTATENPSVC)), so napidisable() can return while the poll tail is still queueing the work, and a plain cancelworksync() would be re-armed behind the drain.

Use disableworksync(): schedulework() on a work with a non-zero disable count is dropped by clearpendingifdisabled() before queuework() is reached.

Move idpfinitdim() to idpfvportintralloc() so the works are initialised on every path that can reach the drain -- the three "goto intrdeinit" sites between idpfvportintrinit() and idpfvportintrena() get there without the enable side having run. Nothing re-enables them: rsrc->qvectors is freed on every exit from idpfvportopen() and on every idpfvportstop(), so the count dies with the object.

It is a race, not a deterministic failure -- netdim() only schedules once DIMNEVENTS events have accumulated and the profile index changes. A KASAN ifup/ifdown loop under load is the way to see it.

Affected Software

1 affected component
Linux Linux kernel

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Compensating control

    Move idpf_init_dim() to idpf_vport_intr_alloc() so DIM work is initialized before any path can reach the drain.

  2. Compensating control

    Use disable_work_sync() for the Tx/Rx DIM work before freeing q_vectors; a plain cancel_work_sync() is insufficient because the work can requeue itself.

Event History

Sep 25, 2026
CVE Published
via MITRE·10:22 AM
Data Sourced
via MITRE·10:22 AM
Description
Data Sourced
via NVD·11:17 AM
Description

Frequently Asked Questions

1

Which systems are exposed by default?

Systems using the Linux kernel idpf driver are affected without requiring a special configuration. The driver initializes both interrupt moderation modes to IDPF_ITR_DYNAMIC, which enables the DIM work path by default.

2

What condition leads to the use-after-free?

Tx or Rx DIM work must be queued from the NAPI poll path and then run after the driver's q_vectors have been freed during interrupt-resource release. The delayed work can dereference the freed q_vector to access interrupt-register pointers.

3

Is disabling NAPI alone sufficient to prevent the race?

No. The description states that draining after NAPI disable is insufficient because the poll tail can still queue DIM work after napi_complete_done() clears the scheduled state, allowing napi_disable() to return before that work is queued.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203