Skip to content

Commit 4782f64

Browse files
committed
ice: fix NULL access of tx->in_use in ice_ll_ts_intr
JIRA: https://issues.redhat.com/browse/RHEL-84608 Upstream commit(s): commit f648633 Author: Jacob Keller <jacob.e.keller@intel.com> Date: Thu Aug 7 10:35:27 2025 -0700 ice: fix NULL access of tx->in_use in ice_ll_ts_intr Recent versions of the E810 firmware have support for an extra interrupt to handle report of the "low latency" Tx timestamps coming from the specialized low latency firmware interface. Instead of polling the registers, software can wait until the low latency interrupt is fired. This logic makes use of the Tx timestamp tracking structure, ice_ptp_tx, as it uses the same "ready" bitmap to track which Tx timestamps complete. Unfortunately, the ice_ll_ts_intr() function does not check if the tracker is initialized before its first access. This results in NULL dereference or use-after-free bugs similar to the issues fixed in the ice_ptp_ts_irq() function. Fix this by only checking the in_use bitmap (and other fields) if the tracker is marked as initialized. The reset flow will clear the init field under lock before it tears the tracker down, thus preventing any use-after-free or NULL access. Fixes: 82e71b2 ("ice: Enable SW interrupt from FW for LL TS") Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de> Tested-by: Rinitha S <sx.rinitha@intel.com> (A Contingent worker at Intel) Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Signed-off-by: Petr Oros <poros@redhat.com>
1 parent f39f773 commit 4782f64

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

drivers/net/ethernet/intel/ice/ice_main.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3230,12 +3230,14 @@ static irqreturn_t ice_ll_ts_intr(int __always_unused irq, void *data)
32303230
hw = &pf->hw;
32313231
tx = &pf->ptp.port.tx;
32323232
spin_lock_irqsave(&tx->lock, flags);
3233-
ice_ptp_complete_tx_single_tstamp(tx);
3233+
if (tx->init) {
3234+
ice_ptp_complete_tx_single_tstamp(tx);
32343235

3235-
idx = find_next_bit_wrap(tx->in_use, tx->len,
3236-
tx->last_ll_ts_idx_read + 1);
3237-
if (idx != tx->len)
3238-
ice_ptp_req_tx_single_tstamp(tx, idx);
3236+
idx = find_next_bit_wrap(tx->in_use, tx->len,
3237+
tx->last_ll_ts_idx_read + 1);
3238+
if (idx != tx->len)
3239+
ice_ptp_req_tx_single_tstamp(tx, idx);
3240+
}
32393241
spin_unlock_irqrestore(&tx->lock, flags);
32403242

32413243
val = GLINT_DYN_CTL_INTENA_M | GLINT_DYN_CTL_CLEARPBA_M |

0 commit comments

Comments
 (0)