Skip to content

Commit f648633

Browse files
jacob-kelleranguy11
authored andcommitted
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>
1 parent 403bf04 commit f648633

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
@@ -3176,12 +3176,14 @@ static irqreturn_t ice_ll_ts_intr(int __always_unused irq, void *data)
31763176
hw = &pf->hw;
31773177
tx = &pf->ptp.port.tx;
31783178
spin_lock_irqsave(&tx->lock, flags);
3179-
ice_ptp_complete_tx_single_tstamp(tx);
3179+
if (tx->init) {
3180+
ice_ptp_complete_tx_single_tstamp(tx);
31803181

3181-
idx = find_next_bit_wrap(tx->in_use, tx->len,
3182-
tx->last_ll_ts_idx_read + 1);
3183-
if (idx != tx->len)
3184-
ice_ptp_req_tx_single_tstamp(tx, idx);
3182+
idx = find_next_bit_wrap(tx->in_use, tx->len,
3183+
tx->last_ll_ts_idx_read + 1);
3184+
if (idx != tx->len)
3185+
ice_ptp_req_tx_single_tstamp(tx, idx);
3186+
}
31853187
spin_unlock_irqrestore(&tx->lock, flags);
31863188

31873189
val = GLINT_DYN_CTL_INTENA_M | GLINT_DYN_CTL_CLEARPBA_M |

0 commit comments

Comments
 (0)