Commit efc54fb1 authored by Petr Oros's avatar Petr Oros Committed by Tony Nguyen
Browse files

iavf: fix PTP use-after-free during reset



Commit 7c01dbfc ("iavf: periodically cache PHC time") introduced a
worker to cache PHC time, but failed to stop it during reset or disable.

This creates a race condition where `iavf_reset_task()` or
`iavf_disable_vf()` free adapter resources (AQ) while the worker is still
running. If the worker triggers `iavf_queue_ptp_cmd()` during teardown, it
accesses freed memory/locks, leading to a crash.

Fix this by calling `iavf_ptp_release()` before tearing down the adapter.
This ensures `ptp_clock_unregister()` synchronously cancels the worker and
cleans up the chardev before the backing resources are destroyed.

Fixes: 7c01dbfc ("iavf: periodically cache PHC time")
Signed-off-by: default avatarPetr Oros <poros@redhat.com>
Reviewed-by: default avatarIvan Vecera <ivecera@redhat.com>
Acked-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Reviewed-by: default avatarVadim Fedorenko <vadim.fedorenko@linux.dev>
Reviewed-by: default avatarPaul Menzel <pmenzel@molgen.mpg.de>
Reviewed-by: default avatarAleksandr Loktionov <aleksandr.loktionov@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent bd98c620
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -3036,6 +3036,8 @@ static void iavf_disable_vf(struct iavf_adapter *adapter)

	adapter->flags |= IAVF_FLAG_PF_COMMS_FAILED;

	iavf_ptp_release(adapter);

	/* We don't use netif_running() because it may be true prior to
	 * ndo_open() returning, so we can't assume it means all our open
	 * tasks have finished, since we're not holding the rtnl_lock here.
@@ -3211,6 +3213,8 @@ static void iavf_reset_task(struct work_struct *work)
	iavf_change_state(adapter, __IAVF_RESETTING);
	adapter->flags &= ~IAVF_FLAG_RESET_PENDING;

	iavf_ptp_release(adapter);

	/* free the Tx/Rx rings and descriptors, might be better to just
	 * re-use them sometime in the future
	 */